On Wed, Oct 30, 2019 at 9:02 AM helices <mike@xxxxxxxxxxxxxxx> wrote:
On Wed, Oct 30, 2019 at 7:02 AM Marcos Passos <marcospassos.com@xxxxxxxxx> wrote:Hi everyone,
We're looking for a way to run a code block with a timeout.
Our use case involves evaluating an _expression_ written in a custom DSL (similar to Symfony _expression_ Language), and we want to ensure that the execution will not exceed a given time limit.
We tried a naive approach using set_time_limit, but there is no way to catch the exception from the block code that timed out. We then considered using PCNTL, but its use is discouraged production environments.
Do you guys have any suggestions?
- MarcosWe use the following successfully://
// GLOBALS
$CHILD_PID = 0;
$PID = getmypid();
$TIMEOUT = $timeout_seconds;
//
// BEGIN timer here
//
// If set to (0), no time limit is imposed
set_time_limit(0);
// Set timer here
set_timeout();
//
// Do actual upload HERE:
//
//
// END timer here
//
clear_timeout($CHILD_PID);
//
// FUNCTIONS
//
//
// Stop timer
function clear_timeout($CHILD_PID) {
posix_kill($CHILD_PID, SIGTERM);
}
//
// Set timeout timer
function set_timeout() {
global $CHILD_PID, $PID, $TIMEOUT;
$CHILD_PID = pcntl_fork();
if($CHILD_PID == 0) {
sleep($TIMEOUT);
posix_kill($PID, SIGTERM);
exitHandler(
...
);
}
}~ Mike