PHPをWEBではなく、コマンドラインで何時間も継続的に動かすスクリプトを稼働させておいたら、
「PHP Fatal error: Allowed memory size of xxx bytes exhausted」 とか、類するエラーが出て、スクリプトが落ちてしまった。
ini_set(“memory_limit”,”xxxM”);
とメモリ上限を上げることも行いました。
以下の記事でunsetの重要性を認識しました。
大量の文字列や大量の配列など、その後使わないものは、できるだけ早く、unsetするようにして、
memory_get_usage();
で大量のメモリ消費があるそうな前後を測るようにしました。
以下は、83回のループ処理最後付近と、ループを抜けて利用していた配列をunsetした時の
メモリの消費量のデータ
81/83
memory use before:2308200
memory use after:1552784
82/83
memory use before:2309848
memory use after:1554432
83/83
memory use after unset xxx:1538928
beforeの後である処理をして、処理終わったらafterで計測。ここもかなり下がっている。
そして、ループを抜けて最後が一番少なくなっています。
ここまでいいのですが、このループは親ループの中の、子ループで、
再度、ループに突入したら、消費量は上がっていました。落ちるところまで計測して、まずは落ちる前に終了させることにします。
背景)
日頃使うそこそこのパワーのあるPCは、スイッチを切ることがあるので、
windowsタブレットがあったので、そちらに稼働をさせてみたら、このメモリの問題が起こりました。
非力ながらも、ほぼ無音なので、起動させておいても全く気にならないのですが。
今後の対応)
何時間か動かして、消費量が上昇ラインに乗るのであれば、今のところ、メモリの余裕はあるのですが、何十時間も起動させたら、やはり落ちそう。
その場合は、cronなどで、適時落として、再起動させるような自動化スクリプトを考えてみようかな。