VLDでPHPのオペコードを確認するの記事でも記載した通り、SOY Shopの改修でメモリを意識する必要が生じたので、PHPの仕様を見始めた。

現時点での一番の疑問は関数内で使用した変数はどのタイミングでメモリを解放するのか?

もしくはPHPの関数内の変数の解放は手動で行わなければならないのか?


PHPのCGI版やモジュール版はブラウザからリクエストを送信して、サーバでHTMLを組み立ててレスポンスを返した時点でプロセスを終了し、処理に関するメモリを解放するという仕様上、メモリにあまり意識を向けなくてもそれなりの処理を行える。


このような背景から、メモリの無駄遣いに因る処理の低速化が残っている可能性があり得るので、PHPのガベージコレクション(以後、GCと略す)の仕様を知りたくなった。

ガベージコレクション - Wikipedia




PHPのGCはPHPの変数の根本にあるzvalと参照カウント法が重要で、これらがわからなければお話にならないので、zvalあたりから見ていく必要がある。

PHP: 変数入門 - Manual

PHP: 参照カウント法の原理 - Manual


上記の内容を見るために重要な設定として、


Xdebug_Logo

Xdebug - Debugger and Profiler Tool for PHP


事前にXdebugのインストールをしておく必要がある。

Xdebugのインストールの前にPECLを使えるようにしておく必要があり、PECLの設定は下記の記事を参考にして準備する。

gRPC for PHPのインストール


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