昨日リリースしたサイトが予想以上に反響があったのか、システムリソースの見積もりを失敗したのか、リリース開始からload average高め。で、今日も状態を確認するためにvmstat 1を端末で流していたら…サーバが応答しなくなった…ヤバイ…
ていうか、system inが133878って!
symfonyではアプリケーション単位でのユーザ定義値の設定はsymfony_root/apps/アプリケーション/config/app.ymlで行う。で、モジュール単位での設定はsymfony_root/apps/アプリケーション/modules/モジュール/config/module.ymlで行う。なんだが、ここで設定した値の取得方法がドキュメントに書かれていない。app.ymlの方は説明されているのだけど、module.ymlの方は、「同様に...」と省略されている。実際には
$value = sfConfig::get('mod_モジュール_ネームスペース');
なんだけど、それはドキュメントには書かれていない。書かれているけど、モジュールが抜けていたりする。
とりあえずどんなYAMLで設定した値がsfConfigの中でどのようなキーで保存されているかは、キャッシュディレクトリを覗くのがてっとり早い。例えばfrontedアプリケーションのprod(商用)環境のprモジュールのmodule.ymlのキャッシュならばこのように確認できる
$ cd symfony_root; cat cache/frontend/prod/config/modules_pr_config_module.yml.php
ギザベンリス!と思いインストールしてみましたが、yでYouTube動画が開くものの、どうやって再生すればよいのか分かりませんでした…てか、俺の問題?う〜ん。また余裕があるときに深追いしてみるか
今回リリースしたサイトは超デカメな素材ファイルをばらまくという素敵なサイトなんだが、これらの素材ファイルをダウンロードするためにはあらかじめ会員情報などから適切な権限確認を行わないといけない。なので、データの吐き出し部分もphpで実装することになる。そこで単にphpの最後の方に
readfile($file);
したのでは吐き出し対象のファイルがメモリに取り込まれて大変な事になる。てか今日大変な事になっていた…そこで、以下のような魔法を唱えてあげると、メモリには入らない
flush();
while(@ob_end_flush()) {}
readfile($file);
検証したのはphp-5.1.4とapache-2.2.2。検証方法としては、readfileの後に
error_log(sprintf("memory used: %dKb", intval(memory_get_usage()/1024)));みたいな事をして確認(実際にはちょっと違うんだけど)。使用前はまるまる対象$fileのファイルサイズ+phpプログラム分のメモリを消費していたのだけど、使用後は読み込み対象のファイルサイズに関係なく、phpプログラム分のメモリ消費だけになりました。単純にphpの設定でoutput_bufferingを0にしたりしてもいいのかな。しかしそれが必ずしもできる環境ではないし、header()とかのからみがよくわからないので、こちらの対策をチョイス。他のバージョンのphpでは扱いが若干違うようです。以下のスレッドが参考になるかも?
メモリーフローってなんだってツッコミはおいといて、結局このスレッドもまとまった解がないまま終わってるし。メーリングリストでただでノウハウ教えてもらっているんだからさ、最後に内容まとめてコミュニティにコミットするのは義務なんじゃないかと思うのだけど。ま、俺はメーリングリストに参加していないけど、こうやってウェブ経由で情報を得たのでフィードバックしているわけなんだが。always pass on knowledge!