hnwの日記

PHP起動時からインターン化されている文字列がどれくらいあるのか

このエントリは闇PHP Advent Calendar 2015の23日目です。


先日の記事「PHPのインターン化文字列とは何か」でインターン化文字列について紹介しましたが、記事だけでは実際にどう使われているかピンと来なかった方も多かったかもしれません。今回、PHP 7.0.1のCLI版とPHP-FPM版とで、PHPプログラム起動直後のインターン化文字列の一覧を取り出してみましたので、その結果を紹介します。


下記リンクからインターン化文字列をprint_rした結果が辿れます。デカいのでご注意ください。


中を見てみると、標準関数や拡張モジュールに含まれる関数名・クラス名・メソッド名などが全てインターン化されていることがわかると思います。これほどの個数の文字列が起動時にインターン化されているというのは多くの人にとって予想外なのではないでしょうか。


また、注意深く見るとPHP-FPM環境のリストのみXdebug系の関数が登場していないこともわかります。これは、今回の方法ではPHP本体のインターン化文字列しか取り出せていないためです。


前回記事でも紹介した通り、OPcacheにはインターン化文字列を共有メモリに乗せる仕組みがあります。ただし、これはOPcacheが読み込まれてからでないと使えません。今回読み込んでいる拡張モジュールについて言えば、OPcacheより後で読み込まれるのはXdebugだけなので、Xdebugの提供する関数の関数名だけがOPcacheの用意したインターン化文字列バッファに乗り、結果としてPHP本体のインターン化文字列としては見えなくなったというわけです。


いずれOPcache側のインターン化文字列も確認したいと思ってるんですが、OPcacheの外からは素直にアクセスできない気がしてるんですよね。そんなことないのかな…。

補足

ちなみにPHP5系でも似たような結果になります。PHP7の方が個数が若干多くなってるのが謎ですけどね…。

さらに補足

上記リストは hnw/php-strdumper で生成しました。

'); $entries_chunk.insertBefore(sections[0]); } else { chunk_id += 1; var $prev_entries_chunk = $entries_chunk; var $read_more_link = $('

これ以前の記事を表示する

'); $read_more_link.on('click', {chunk_id: chunk_id}, function(e){ $(e.target).hide(); $(this).remove(); $('#entries-chunk-' + e.data.chunk_id).fadeIn("slow"); }); $prev_entries_chunk.append($read_more_link); var $entries_chunk = $('
'); $entries_chunk.hide(); $entries_chunk.insertAfter($prev_entries_chunk); } } $(sections[i]).appendTo($entries_chunk); } });