VLDでPHPのオペコードを確認するの記事でも記載した通り、SOY Shopの改修でメモリを意識する必要が生じたので、PHPの仕様を見始めた。
現時点での一番の疑問は関数内で使用した変数はどのタイミングでメモリを解放するのか?
もしくはPHPの関数内の変数の解放は手動で行わなければならないのか?
PHPのCGI版やモジュール版はブラウザからリクエストを送信して、サーバでHTMLを組み立ててレスポンスを返した時点でプロセスを終了し、処理に関するメモリを解放するという仕様上、メモリにあまり意識を向けなくてもそれなりの処理を行える。
このような背景から、メモリの無駄遣いに因る処理の低速化が残っている可能性があり得るので、PHPのガベージコレクション(以後、GCと略す)の仕様を知りたくなった。
PHPのGCはPHPの変数の根本にあるzvalと参照カウント法が重要で、これらがわからなければお話にならないので、zvalあたりから見ていく必要がある。
上記の内容を見るために重要な設定として、
Xdebug - Debugger and Profiler Tool for PHP
事前にXdebugのインストールをしておく必要がある。
Xdebugのインストールの前にPECLを使えるようにしておく必要があり、PECLの設定は下記の記事を参考にして準備する。
peclコマンドが使えるようになったら、下記のコマンドを実行する。
$ sudo pecl install xdebug
Xdebugのインストールが終了すると、下記のようなメッセージが表示される。
You should add "zend_extension=/usr/lib/php/20190902/xdebug.so" to php.ini
このメッセージの指示に従い、php.iniの変更の操作を行う。
※今回はCLI版のみXdebugを使用できるようにする。
#CLI版のphp.iniのファイルを探す $ php -i | grep -i php.ini Configuration File (php.ini) Path => /etc/php/7.4/cli Loaded Configuration File => /etc/php/7.4/cli/php.ini $ sudo nano /etc/php/7.4/cli/php.ini
php.iniの編集画面が表示されたら、末尾に
zend_extension=/usr/lib/php/20190902/xdebug.so" to php.ini
を追加する。
$ $ php -r 'phpinfo();' | grep 'xdebug support' # xdebugがenabledになっていればOK xdebug support => enabled
早速、Xdebugを使用してみる。
/path/to/dir/xdebug.php
<?php $a = new stdClass(); xdebug_debug_zval('a');
上記のコマンドを実行してみる。
$ php /path/to/dir/xdebug.php a: (refcount=1, is_ref=0)=class stdClass { }
無事、Xdebugの関数を使用することができた。
Xdebug: Documentation » All functions