php メモリオーバー対策参考ページ

phpで PHP Fatal error: Allowed memory size of xxx bytes exhausted のエラーに出会ってから、phpの内部実装とか色々調べていて参考になったページをメモしておく。c言語と違ってどの方法が最も高速とかメモリに優しいとか簡単にわからないので色々調べていてとても勉強になった。

今回メモリオーバーを起こしたのが、大量のデータをforeach文で回していた部分で起きていたため、for, foreach, while等のループとメモリの関係や配列そのもの、GCやメモリ使用量に関する記事を漁っていたので、その中から勉強になった記事を残した。

php の配列はハッシュテーブルを持ち、数字のインデックスもハッシュテーブルを使って値を取り出す構造になっている。(連想配列)。この構造のため、phpの配列c言語の配列とは違い、アクセスに時間がかかる。しかしphp7では連想配列としての配列を引き継ぎつつ、高速化のために、c言語のような数値をインデックスに持つ”普通の配列”も内部構造として取られるようになった。phpは自動でデータ構造を選び、連想配列や単純な配列を使い分けることで高速化に成功している。そのためphp7以降で配列をいじるときには添字配列でできるときはそっちのほうがいいかもしれない。(実際の比較はまだしてない)

PHP7の内部実装から学ぶ性能改善テクニック
[PHP]ループのメモリ使用量と処理速度を比較しました
PHP7 と HHVM/Hack 言語って何が違うの?
PHP の GC の話
PHP ‘foreach’ の内部挙動について
foreachを使うとき、もうちょいメモリのことを気にして行こうぜ
【PHP】Allowed memory size of *** bytes exhaustedエラーの対処法まとめ