(PECL luasandbox >= 1.4.0)
LuaSandbox::pauseUsageTimer — 暂停 CPU 使用计时器
暂停 CPU 使用计时器。
这仅在从 Lua 中的回调中调用时有效。当执行返回 Lua 时,计时器将自动恢复。如果进行新的对 Lua 的调用,计时器将在该调用的持续时间内恢复。
如果一个 PHP 回调再次调用 Lua,而计时器没有暂停,然后该 Lua 函数再次调用 PHP,第二个 PHP 调用将无法暂停计时器。逻辑是即使第二个 PHP 调用会避免将 CPU 使用情况计入限制,但第一个调用仍然会计入它。
此函数没有参数。
返回一个 bool,指示计时器现在是否已暂停。
示例 #1 操作使用计时器
<?php
// 创建一个新的 LuaSandbox 并设置 CPU 限制
$sandbox = new LuaSandbox();
$sandbox->setCPULimit( 1 );
function doWait( $t ) {
$end = microtime( true ) + $t;
while ( microtime( true ) < $end ) {
// 浪费 CPU 周期
}
}
// 注册一个 PHP 回调
$sandbox->registerLibrary( 'php', [
'test' => function () use ( $sandbox ) {
$sandbox->pauseUsageTimer();
doWait( 5 );
$sandbox->unpauseUsageTimer();
doWait( 0.1 );
},
'test2' => function () use ( $sandbox ) {
$sandbox->pauseUsageTimer();
$sandbox->unpauseUsageTimer();
doWait( 1.1 );
}
] );
echo "这应该不会超时...\n";
$sandbox->loadString( 'php.test()' )->call();
echo "这应该超时。\n";
try {
$sandbox->loadString( 'php.test2()' )->call();
echo "没有?\n";
} catch ( LuaSandboxTimeoutError $ex ) {
echo "超时了! " . $ex->getMessage() . "\n";
}
?>
上面的示例将输出
This should not time out... This should time out. It did! The maximum execution time for this script was exceeded