私のメモリに手を加えたのは誰ですか?PHP のメモリ リーク、システム キャッシュの消費?
?
前書き: いつものクリックベイト スタイルを続けて、深入りせずに例と解決策について話します。
?
シナリオ: オンライン イメージ サービスによって圧縮された画像品質 (100) とサムネイル品質 (100) が多くのスペースを占有し、その結果、55 個のファイル (160G のスペースを占有) を作成した後で問題が発見されました。今解決する必要があるのは、スペースを節約するためにこの部分を低品質のサムネイルに圧縮することです (もちろん、ハードドライブが安価なこの時代では、そのような問題を解決する必要はありません。ここで議論しているのは、スペースを節約しますが、メモリ消費の問題を調べるためです)。 PHP スクリプトを使用してサムネイルを再生成すると、メモリ消費量が増加し続けていることがわかり、後でスクリプトがメモリ不足を報告しました。
?
処理コードバージョン 1 (php):
?
set_time_limit(0); function thumbnailimage($img,$width,$height,$savefile){ $new_img = imagecreatetruecolor ( $width, $height ); imagedestroy($new_img); } //$list:是那个55万的文件名 foreache($list as $v) { $img = imagecreatefromjpeg($v); thumbnailimage($img,480,300,$savepath); imagedestroy($img); }
?
このスクリプトが 5,000 を超えるとメモリ不足によりクラッシュしました。その後、php.ini のmemory_limit を 5G に変更しましたが、スクリプトが実行されるとメモリが枯渇してしまいます。
そこで、これは PHP のメモリリークだと思い、他のソリューションを使用して解決したいと思い、Lao Wang の技術マニュアルにある GraphicsMagick ツールを見て、それに対処するスクリプトを作成したことがわかりました。トップで見たメモリの消費量は依然として増加しており、誰かが、これはシステム操作ファイル (書き込みファイル) であるべきだと提案しました。ファイルはキャッシュされ、メモリを消費します。
画像の処理 (sync && echo 3 > /proc/sys/vm/drop_caches) 後に手動でメモリを解放するように bash スクリプトを調整すると、top で表示されるメモリ消費量が正常になります。
この bash スクリプトの処理速度は PHP の gd ライブラリほど速くないため、PHP に置き換えられます。
PHP スクリプトのメモリ消費の理由を確認します:
処理コードバージョン 2 (php):
?
set_time_limit(0); function thumbnailimage($img,$width,$height,$savefile){ $new_img = imagecreatetruecolor ( $width, $height ); ... imagedestroy($new_img); } //$list:是那个55万的文件名 foreache($list as $v) { $memory1=memory_get_usage(); file_put_contents('memory','memory1:'.$memory1."\n",FILE_APPEND); $img = imagecreatefromjpeg($v); thumbnailimage($img,480,300,$savepath); imagedestroy($img); $memory1=memory_get_usage(); file_put_contents('memory','memory1:'.$memory1."\n",FILE_APPEND); system('sync && echo 3 > /proc/sys/vm/drop_caches'); }
このバージョンではメモリ消費に対処するのが通常ですが、php プロセスもメモリを消費します。php.ini のmemory_limit を少し増やす必要があります。
ここから、メモリを消費しているのはPHPではなく、システムの動作ファイルであるようです。私の無知のため、最初は間違ってPHPのせいでした。
?
終了: この例では、メモリ消費量が判明した理由を簡単に説明します。