PHP Conference Japan 2024

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