PHPカンファレンス福岡2023
レギュラートーク(45分)

処理系とメモリレイアウトと私

sji_ch sji sji_ch
8

PHP 処理系内でメモリのどこに何があるか、を意識してプログラミングをしたことがありますか?

2020 年頃から、PHP で PHP のプロファイラを作っています。
これは プロセス外から FFI を通じてシステムコールを呼び、対象プロセスのメモリ内容へアクセスし、実行中の処理系内部の C 言語構造体のデータを直接読み取るという仕組みで動作します。
https://github.com/reliforp/reli-prof

さて、このスクリプトを動作させるには、処理系内でどこにどんなデータがどのような形であるか、を詳細に把握する必要があります。そしてその構造知識をコード内へ転写していくことでツールの機能を追加していけるのですが、この過程で私自身の中にもちょっとした変化が現れてきます。ふつうの PHP スクリプトを書きながらでも、プロセス内でメモリがどう使われどのような処理でアクセスされるかを、なんとなく把握できるようになっていくのです。

このトークではツール作成の過程で得られた処理系内のメモリレイアウトについての知識を幾つか紹介し、聴講者の皆さんも PHP スクリプトを書きながら裏側のメモリ構造がうっすら透けて見えるという状態になることを目指します。

対象聴講者はたとえば以下のような項目が気になる人です。

  • 変数や値がどうメモリ内に格納されているか
  • interned string とは
  • 配列がどうメモリ内に格納されているか
  • オブジェクトがどうメモリ内に格納されているか
  • 「クラス」はメモリ上でどういう構造のものなのか
  • 宣言された引数と動的な引数の違い
  • 宣言されたプロパティと動的プロパティの違い
  • opcache でキャッシュされた内容のメモリ上での表現
  • apcu でのキャッシュのメモリ上での表現