(PECL luasandbox >= 1.4.0)
LuaSandbox::pauseUsageTimer — Pause le minuteur d'utilisation du CPU
Pause le minuteur d'utilisation du CPU.
Ceci n'a d'effet que lorsqu'il est appelé depuis un rappel de Lua. Lorsque l'exécution revient à Lua, le minuteur sera automatiquement relancé. Si un nouvel appel est fait à Lua, le minuteur sera relancé pour la durée de cet appel.
Si un rappel PHP appelle à nouveau Lua avec le minuteur non mis en pause, et que cette fonction Lua appelle à nouveau PHP, le second appel PHP ne pourra pas mettre en pause le minuteur. La logique est que même si le second appel PHP éviterait de compter l'utilisation du CPU contre la limite, le premier appel le compte toujours.
Cette fonction ne contient aucun paramètre.
Renvoie un bool indiquant si le minuteur est maintenant en pause.
Exemple #1 Manipulating the usage timer
<?php
// créer un nouveau LuaSandbox et définir une limite CPU
$sandbox = new LuaSandbox();
$sandbox->setCPULimit( 1 );
function doWait( $t ) {
$end = microtime( true ) + $t;
while ( microtime( true ) < $end ) {
// waste CPU cycles
}
}
// Enregistrer une fonction de rappel 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 "This should not time out...\n";
$sandbox->loadString( 'php.test()' )->call();
echo "This should time out.\n";
try {
$sandbox->loadString( 'php.test2()' )->call();
echo "It did not?\n";
} catch ( LuaSandboxTimeoutError $ex ) {
echo "It did! " . $ex->getMessage() . "\n";
}
?>
L'exemple ci-dessus va afficher :
This should not time out... This should time out. It did! The maximum execution time for this script was exceeded