PHP はオペコードの標準メカニズムを使用しません。スタック VM (python、java) またはレジスタ VM (x86、perl6 など) に固執することを望みます。しかし、それは完全に自家製のものを使用しており、そこには摩擦があります。
これは、各オペコードが ->op1 ->op2 および ->result を持つメモリ内の接続されたリストを使用します。現在、これらのそれぞれは、一時テーブルなどの定数またはエントリのいずれかです。これらのポインターは、適切な方法でシリアル化することはできません。
現在、ストリームをディスクにダンプする pecl/bcompiler などのアイテムを使用してこれを達成しています。
しかし、クラスはこれをさらに複雑にします。つまり、次のような潜在的なコード フラグメントがあることを意味します。
if(<conditon>)
{
class XYZ() { }
}
else
{
class XYZ() { }
}
class ABC extends XYZ {}
これは、クラスと関数に関する多数の決定が実行時にのみ行われることを意味します。Java のようなものは、実行時に条件付きで定義される同じ名前の 2 つのクラスで窒息します。基本的に、APC の継承とクラス キャッシング コードは、おそらくコードベースの中で最も複雑でバグが発生しやすい部分です。クラスがキャッシュされるときはいつでも、すべての親の継承されたメンバーは、オペコード キャッシュに保存する前にスクラブ アウトする必要があります。
ポインターの問題は克服できないわけではありません。再起動が行われるたびにキャッシュエントリ全体をディスクから直接ロードするためにわざわざ修正したことのない apc_bindump があります。しかし、すべてのシステム ポインターを特定する必要があるものを取得するためにすべてをデバッグするのは面倒です。フォークの動作により、すべての php プロセスが同じシステム ポインターを持っているため、apache の場合は簡単すぎます。古いバージョンの fastcgi は、最初に fork し、後で php を初期化していたため、処理が遅くなりました。
しかし最終的に、PHP に本当に欠けているのは、バイトコード形式を発明し、現在のエンジンとすべてのモジュールを捨て、スタック VM を使用してそれを書き直し、JIT を構築するという意志です。時間があればいいのにと思います。fb の連中は、ヒップホップ HHVM を持ってほとんどそこにいます。これは、より高速なパフォーマンスのために eval() を犠牲にします-これは公正な犠牲です:)
PS: 私は、APC を 5.4 に適切に更新する時間を見つけられない男です。