Re: Running a code block with timeout

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hey guys, 

How I can un-subscribe from php-general@xxxxxxxxxxxxx

Thx,
Matt



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?

- Marcos


We 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


--
Best,

DC Web Makers
Coding Bootcamps
240-200-6131
301-327-8773

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux