備忘録(PHP)」カテゴリーアーカイブ

PHPのタイムアウト対策

PHPでWEBアプリを開発しているとある壁にぶち当たりました。
それはWEBブラウザのタイムアウト制限です。
データベースと連携している性質上データの件数が肥大するに伴い処理時間が
超過していきます。
データベース構築時点での設計ミスもありますが、やはり限界があるのではないでしょうか?

最初は、php.iniやApacheの設定をいじっていましたが頭打ちをするところまできました。
いろいろと調べてみると、WEBサーバからのデータが一定時間ないとWEBブラウザは接続が切断されたものとして判断してしまうようです。
だったら、細かく途中経過のデータを送ってあげればいいのでは?
と単純な考えでソースの埋め込み開始。
//出力バッファOFF
ob_end_clean();
 
// IEはこれがいるらしいので
echo str_pad(”,256);
flush();

// あとは要所要所に途中経過コメントを出力
echo “コメント”;
flush();

これで、数時間にわたる処理がとりあえず実行できるようになりました。

数時間に渡る処理自体が問題との声がありそうですが・・・・。

ページが表示できない??

とあるWEBシステムで「ページが表示できない」という表示になってしまうというトラブルがありました。

始めはApacheが落ちた?と思っていましたが正常に稼動中。

サーバのメモリ?それも異常がない。

毎回ではなくたまになるらしいのですが、原因がさっぱり。

とりあえずApacheのアクセスログとエラーログを確認してみることに。

エラーログに次のエラーがたまに記載されていました。

FATAL:  emalloc():  Unable to allocate xx bytes

調べてみるとメモリの確保に失敗しているらしいのですが、このエラーが出るときに「ページが表示できません」となるみたいです。

処理を見直してみても、メモリを浪費しているような内容でもないし。

暫定的にphp.iniのmemory_limitを拡張して設定で回避。

PHPで処理が遅くなる

PHPで処理をしているときに、データ量がある一定を超えたあたりから極端に処理速度が遅くなってきました。

処理の流れとしては、

1.MySQLよりデータの抽出

2.抽出したデータを全て配列aに格納

3.配列aに対して処理をして別の配列bに格納

という処理です。

データ量が数万、数十万件あたりまでは問題なかったのですが、百万件近くになったときに著しく処理が遅くなってきました。

まず、各箇所で処理時間を計測してみました。

すると、3の処理をしているときに徐々に処理時間が遅くなってくることが分かりました。

??と思っていろいろと検討してみた結果、まず1のMySQLの結果リソースの解放をする。

その次の3で配列aについても解放をする。

データが少ないときはとりあえず乗り切れているんでしょうけど、データが肥大化するに伴い今回のようなことが発生することが分かりました。

恐らく、「そんなことは設計段階で把握しておかないと」って怒られそうですが、また一つ勉強になりました。

「使わないものは、片づけをする」←人として基本ですよね。