2012-04-03 9 views
1

通常、ZVALはemallocで作成されるため、ページ要求の最後に破棄されます。既存のZVALを使用してSAPI(pemallocに相当)で永続化させる方法はありますか? pemallocでZVALを作成するとどうなりますか?私は - 同じPHP「労働者」が毎回使用されていると仮定すると(+1を返す各要求countZVALをSAPI全体で永続化させますか?

class Object 
{ 
    public $foo; 
} 

if(!($object = persist("object"))) 
{ 
    $object = persist("object", new Object()); 
} 

$object->foo[] = "bar"; 

print count($object->foo); 

理想的には私は(PHPコードで)やってみたい、何がこれですPHP-FPMを使用しています)。

+0

良い質問。 +1 – Flavius

+1

興味深い注記:私たちはプラットフォームを変更することに決めました。ここではGoを使用します。 – Luke

+0

クール。理由を詳しく説明できますか?私は自分自身を見ている、それは他の人の動機を知っていいだろう。 – Flavius

答えて

1

あなたは基本的にhttp://lxr.php.net/opengrok/xref/PHP_5_3/ext/sysvshm/sysvshm.c#242

あなたがSHMにすでにあるhttps://github.com/flavius/php-persistある機能を複製せずに得ることができる最も近い記述しています。キャッチ:プリフォーク/マルチプロセスSAPI(Apacheのような)では、同じクライアントからの異なる要求が異なるプロセスで終了する可能性があります。そのため、異なるデータが表示されます(Linux + Firefoxで毎回ハードリフレッシュブラウザで)。

注::これは処理中ですが、現在は整数のみが維持されています。配列を追加するのは簡単ではありません。パッチは大歓迎です。それはまだ、逆シリアル化部分を必要とし、実際にpersist()の最初のパラメータを使用します。

+0

これは実際には大丈夫です。異なるプロセスやスレッドにまたがって持続する必要はありません。目的は、特定のオブジェクトをプリロードして、毎回初期化する必要がないようにすることです。 – Luke

+0

親のzvalへの参照を保持し、それを永続的なものとしてフラグを立てるか、要求のシャットダウン前にコピーした場合はどうなりますか?それはうまくいくはずですが、私は既存のzvalを永続的にする方法がわかりません。私は、ALLOC_PERMANENT_ZVALマクロを使って新しい永久zvalを作成できることを知っています。 – Luke

+0

"親のzval"とは何ですか?とにかくzvalが消えるかもしれないので、それはうまくいかないかもしれません:それは別のzvalに置き換えられているかもしれません(あなたがあなたのzvalに別の値で終わるかもしれないので、 segfaultを取得します)。 – Flavius

0

zend_objectは守ることができないため、これを行うことはできません。 APCのような拡張機能はオブジェクトをメモリに直列化します。

関連する問題