LuaSandbox::pauseUsageTimer

(PECL luasandbox >= 1.4.0)

LuaSandbox::pauseUsageTimer暂停 CPU 使用计时器

描述

public LuaSandbox::pauseUsageTimer(): bool

暂停 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

参见

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top