- ベストアンサー
GDの画像変換でサーバーに負荷
phpで画像処理するのにGDを利用しています。 しかしアクセスが増えるとすぐにapacheの負荷が上がってしまいLoad Averageが一気に増えてしまいます。 主に携帯サイトで使っていますが、負荷を下げるにはどのような手段がありますか? 試しにAPCを入れてみたのですがいまいちでした。 よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>キャッシュの設定はGDで行うのでしょうか、それともApache側でしょうか。 GDやApacheだけでは難しいかもしれません。 アプリケーションのコード側で対応できます。 以下はイメージです。 $params = array("x" => "x"); // 出力画像を決定できるパラメータ $cachePath = "..."; // $paramsを元に保存パスを一意に決定 if (!file_exists($cachePath)) { // キャッシュが無い時だけ実行して$cachePathに出力 outputImage($params, $cachePath); } // 保存済み画像を出力する readfile($cachePath); 上記とは別に定期的にキャッシュを削除する処理も必要になります。 HTTPリクエストに対して画像を直接返却してる構造なら、キャッシュ可能なリバースプロクシを上手く挟めばアプリ側の修正を入れずに対応もできそうです。 #PHPとは離れますが…
その他の回答 (1)
- yuuki0229
- ベストアンサー率70% (33/47)
基本的な手法として出力のキャッシュがあります。 全く同じ画像を生成するケースが多いならこれでかなり改善すると思います。 まだ試してないので効果があるということではないですが、個人的には以下のことを試してみたいと思いました。 ・サムネイル作成のみとかならGDではない他のライブラリを使ってみる ・画像にTTFフォントで文字を書き込んでるなら、それを透過PNGに予め書いておいて重ねるだけで済むようにしておく ・携帯に不要なほど大きい画像を素材として読み込んでるなら、素材を事前に必要最低限に縮小してみる ・同様に事前にできる処理があるならやっておく ・Apacheのプロセス上ではなく、新規にPHPプロセスを立ち上げてそっちで処理してみる and/or Apache MPMの調整など
補足
色々なアドバイスありがとうございます。 一番気になるのが、基本的な手法としての出力キャッシュです。 可能であればサーバー上に画像のキャッシュを保持して、それ以降のアクセスはキャッシュを参照するようにしたいです。 キャッシュの設定はGDで行うのでしょうか、それともApache側でしょうか。 サーバーに関して浅学なので具体的な対処法を教えて頂けると助かります。
お礼
補足して頂きありがとうございます。 しかしちょっと私には難しすぎるかも・・・