delete from hateblo.jp where 1=1;

タイトルに意味はありません。

最適化をしよう

PHPは遅い。

そんなイメージだけども、本当に遅いのか疑問だった。
しかし、現実問題となったとき、遅いものは遅い。

でも、その状況を少しでも改善するために行わないといけない場合に参考になるであろう(改善してほしい)ものをいくつか掲示しよう。(案外本家の参考文献が参考になったりもする)

ここで、遅いといっているのはZend FrameworkMVCフレームワークとして使った場合を想定。

コードからの最適化

require_onceを減らしてZend_Loader(Autoload)を利用する(参考文献より)

15msec程度改善(参考文献より)

以下のケースを考えていただきたい

  • requireは無条件にインクルードを行う
  • require_onceは読み込まれているかを判定してインクルードを行う

条件判定が減れば、多少早くなるだろう。
Autoloadの内部コードではrequireが使用されている。
(理由としてはモジュール(クラス)が見つからない例外が発生したときに読み込みを動的に行うため、すでに読み込まれている場合は例外が発生しないという仕組みになるため、requireでよい)
そのため、「読み込まれているかを判定して」という部分が省略される。

キャッシュを利用する(DBクエリを減らす)

20msec程度改善(参考文献より)

DBへのアクセスというのは非常にコストが高い。
そのため、内容にあまり変化がない場合は、キャッシュを利用するのが非常に良い解決策だ。

ヒント:
クラスのstatic変数として実装し、Bootstrapでその変数にキャッシュを反映させてあげるのが良いのではないかと想定。
また、そのクラスをModel側で継承すると、簡単に実装できる。

キャッシュの持続という問題があるが、変更があった時点で当該情報をクリアする処理を入れればよいだろう。
その処理はタグを活用すると簡単にできる。(一部サポートされないバックエンドがあるので注意が必要)

キャッシュを利用する(メタデータのキャッシュ)

Zend_Db_Tableは非常に便利だが、内部では負荷の高い処理を実行している。
理由は、カラム名を取得しているところにある。
内部処理でDESCRIBE TABLEを行っているので、オーバーヘッドとなる。

テーブル定義はさほど頻繁に変わるものではないという前提を用いると、
キャッシュを利用して定義の解析結果を保持すればよいとなる。

環境からの最適化

ディスクアクセスを早くする(非現実的)

ファイルが多ければそれだけ読み出さないといけないものが増える。
そのため、ディスクアクセスが早くなれば、ロードも早くなるだろう。

OSレベルでの最適化

おそらくブロックサイズや、TCPパラメータの調整等だろう。
時間があるときに調査....

APC等を利用する

PHPの中間コードを利用してPHPのロードによるオーバーヘッドを取り除こうという試み。
各最適化には、短所、長所があるので、用途に合わせて利用していただきたい。

APCの場合は1度にたくさんのアクセスがある場合にお勧め。
しかし、CGIモードで実行される場合(suPHP等)は効果が薄れてしまう。
理由としては、メモリ上にキャッシュするため。
CGIモードの場合、リクエストの処理が終わった時点でメモリが破棄されてしまうため、
メモリ上にキャッシュを行っても無意味となってしまう。

他のものは特性等をしっかり見ていないので、参考文献を参照していただきたい。

個人的にはXcacheに落ち着きそう。
(mod_fcgi+?????(忘れました...)という選択が一番いいらしいが、影響範囲が計り知れないので対応を保留している)

セッション生成に時間がかかっている可能性がある

MVCで使用する場合、セッションを有効にしなくてはならないケースがある。
そのときにセッションIDの生成に時間がかかることがある。
詳しくは以下のサイトを参照