php7.4.8のメモリー管理

よくphpでデーターベースから大量のデータを取得し、整形したりcsvを生成したりすることがあります。

メモリーエラーまた性能が落としてしまう問題があるので、速度とメモリー管理のバランスを注意する必要があります。

性能改善で 様々な方法がありますが、unsetとnullを比較していきたいと思います

データベースから取得する情報と似たテストデータを配列で用意します。

for($i = 1; $i < 100000; $i++) {
 $testArray[] = [
   'morning' => 'GoodMorning'.$i,
   'afternoon' => 'Hello'.$i,
   'evening' => 'GoodEvening'.$i
 ];
}

そして三つのケースを見ていきます

● PHPのGC(ガベージコレクション)に任せる(スクリプト終了後メモリを自動的に解除される)
● 使い終わった変数をunsetでメモリを解除する
● 使い終わった変数をnullに設定する

$startMemory = memory_get_usage();// $testArray = null;
// unset($testArray);$endMemory = memory_get_usage();
echo "解除されたメモリ".$endMemory - $startMemory." バイト\n";

実行した結果はこちらです

実行した結果

unsetを使った場合スクリプトの速度が落ちてしまうので、メモリーのキャパシティーには問題なければ速度に対してGCに任せるのがベストのようです。またnullを使っている場合だと変数を上書きしているためCPUが使われています。

ただし大量のデータの場合メモリーの上限を超えてしまう可能性があるので、性能のためデータを分けて処理する方法なども性能改善の参考になると思います。

参考
https://www.php.net/manual/en/features.gc.performance-considerations.php
https://www.toptal.com/php/objects-references-php-memory