(PECL luasandbox >= 1.4.0)
LuaSandbox::pauseUsageTimer — Приостанавливает таймер использования процессора
Приостанавливает таймер использования процессора.
Имеет значение только при вызове из callback-функции Lua. Когда выполнение возвращается в Lua, таймер автоматически возобновляет работу. Если будет сделан новый вызов в Lua, таймер будет возобновлён на время этого вызова.
Если callback-функция PHP снова вызывает Lua с не приостановленным таймером, а затем эта функция Lua снова вызывает PHP, второй вызов PHP не сможет приостановить таймер. Логика заключается в том, что даже если второй вызов PHP не учитывает использование процессора в соответствии с ограничением, первый вызов все равно его считает.
У этой функции нет параметров.
Возвращает логическое значение (bool), указывающее, приостановлен ли таймер.
Пример #1 Управление таймером использования
<?php
// создание нового LuaSandbox и установка лимита процессора
$sandbox = new LuaSandbox();
$sandbox->setCPULimit( 1 );
function doWait( $t ) {
$end = microtime( true ) + $t;
while ( microtime( true ) < $end ) {
// waste CPU cycles
}
}
// регистрация новой callback-функции 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";
}
?>
Результат выполнения приведённого примера:
Это не должно истекать... Это должно истекать. Это так! The maximum execution time for this script was exceeded