From 3e0b39d59c6ff3e097f692739b6dffa5f7709fbb Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Sun, 1 Jul 2012 12:21:10 -0700 Subject: [PATCH] Handle client disconnects in scoped timeout blocks. Change-Id: I9de9c84aad1befafc9907773dcb1f6ec45978fe9 --- includes/ScopedPHPTimeout.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/includes/ScopedPHPTimeout.php b/includes/ScopedPHPTimeout.php index 359b20b660..d1493c30b7 100644 --- a/includes/ScopedPHPTimeout.php +++ b/includes/ScopedPHPTimeout.php @@ -22,13 +22,17 @@ /** * Class to expand PHP execution time for a function call. + * Use this when performing changes that should not be interrupted. + * * On construction, set_time_limit() is called and set to $seconds. + * If the client aborts the connection, PHP will continue to run. * When the object goes out of scope, the timer is restarted, with * the original time limit minus the time the object existed. */ class ScopedPHPTimeout { protected $startTime; // float; seconds protected $oldTimeout; // integer; seconds + protected $oldIgnoreAbort; // boolean protected static $stackDepth = 0; // integer protected static $totalCalls = 0; // integer @@ -50,6 +54,7 @@ class ScopedPHPTimeout { } elseif ( self::$stackDepth > 0 ) { // recursion guard trigger_error( "Resursive invocation of " . __CLASS__ . " attempted." ); } else { + $this->oldIgnoreAbort = ignore_user_abort( true ); $this->oldTimeout = ini_set( 'max_execution_time', $seconds ); $this->startTime = microtime( true ); ++self::$stackDepth; @@ -73,6 +78,7 @@ class ScopedPHPTimeout { // take some measures to prevent this. Track total time and calls. self::$totalElapsed += $elapsed; --self::$stackDepth; + ignore_user_abort( $this->oldIgnoreAbort ); } } } -- 2.20.1