以下代码......
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网页脚本转换为通过RabbitMQ接受HTTP请求的长期工作人员。这些脚本有时必须进行大量初始化,这些初始化可以作为变量缓存,但不能通过任何外部缓存进行缓存。沙箱将允许工作进程加载正确的处理程序脚本而不留下任何痕迹 - 除了应该明确缓存的数据,在这种情况下将是大量的类实例。