次のコード...
function getInstance() {
echo "(getInstance() called)\n";
return new TestClass();
}
class TestClass {
function someMethod() {
echo "someMethod called. Awesome!\n";
}
}
$sandbox = new Runkit_Sandbox();
$sandbox['parent_access'] = true;
$sandbox['parent_call'] = true;
$sandbox->eval(
'$PARENT = new Runkit_Sandbox_Parent; '.
'$PARENT->getInstance()->someMethod();'
);
私のPHP 5.4.10ビルドでこの出力につながります:
(getInstance() called)
PHP Warning: Runkit_Sandbox::eval(): Error executing sandbox code in /home/projpf/_test/sandbox_test2.php on line 24
サンドボックス外で宣言されたメソッドをサンドボックス内から呼び出すことはできないようです。これは Runkit の制限ですか、それとも何か間違っていますか?
私が何をしようとしているのか疑問に思っている方のために: PHP Web スクリプトを、RabbitMQ 経由で HTTP リクエストを受け入れる長時間実行されるワーカーに変換したいと思います。これらのスクリプトは、外部キャッシュ経由ではなく、変数としてキャッシュできる大量の初期化を実行する必要がある場合があります。サンドボックスを使用すると、ワーカー プロセスは痕跡を残さずに正しいハンドラー スクリプトをロードできますが、明示的にキャッシュする必要があるデータ (この場合は多数のクラス インスタンス) を除きます。