X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FForkController.php;h=1cd49e76b541738e2e3b5c77f5fdc220acab02ec;hb=274d317a0ca2777a5c5fae2007c53811397540f5;hp=b5f1f18583dbe012b4bfd933647889440fef4149;hpb=d9bf616a444d0d33dcf336cc91d3ce5262d7800c;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/ForkController.php b/includes/ForkController.php index b5f1f18583..1cd49e76b5 100644 --- a/includes/ForkController.php +++ b/includes/ForkController.php @@ -2,10 +2,12 @@ /** * Class for managing forking command line scripts. - * Currently just does forking and process control, but it could easily be extended + * Currently just does forking and process control, but it could easily be extended * to provide IPC and job dispatch. * * This class requires the posix and pcntl extensions. + * + * @ingroup Maintenance */ class ForkController { var $children = array(); @@ -39,13 +41,13 @@ class ForkController { } /** - * Start the child processes. + * Start the child processes. * - * This should only be called from the command line. It should be called + * This should only be called from the command line. It should be called * as early as possible during execution. * - * This will return 'child' in the child processes. In the parent process, - * it will run until all the child processes exit or a TERM signal is + * This will return 'child' in the child processes. In the parent process, + * it will run until all the child processes exit or a TERM signal is * received. It will then return 'done'. */ public function start() { @@ -73,16 +75,18 @@ class ForkController { // Restart if the signal was abnormal termination // Don't restart if it was deliberately killed $signal = pcntl_wtermsig( $status ); - if ( in_array( $signal, self::$restartableSignals ) ) { + if ( in_array( $signal, self::$restartableSignals ) ) { echo "Worker exited with signal $signal, restarting\n"; $this->procsToStart++; } } elseif ( pcntl_wifexited( $status ) ) { // Restart on non-zero exit status $exitStatus = pcntl_wexitstatus( $status ); - if ( $exitStatus > 0 ) { + if ( $exitStatus != 0 ) { echo "Worker exited with status $exitStatus, restarting\n"; $this->procsToStart++; + } else { + echo "Worker exited normally\n"; } } } @@ -96,7 +100,7 @@ class ForkController { if ( function_exists( 'pcntl_signal_dispatch' ) ) { pcntl_signal_dispatch(); } else { - declare (ticks=1) { $status = $status; } + declare (ticks=1) { $status = $status; } } // Respond to TERM signal if ( $this->termReceived ) { @@ -111,10 +115,10 @@ class ForkController { } protected function prepareEnvironment() { - global $wgCaches, $wgMemc; + global $wgMemc; // Don't share DB or memcached connections wfGetLBFactory()->destroyInstance(); - $wgCaches = array(); + ObjectCache::clear(); unset( $wgMemc ); } @@ -122,8 +126,6 @@ class ForkController { * Fork a number of worker processes. */ protected function forkWorkers( $numProcs ) { - global $wgMemc, $wgCaches, $wgMainCacheType; - $this->prepareEnvironment(); // Create the child processes @@ -151,6 +153,7 @@ class ForkController { global $wgMemc, $wgMainCacheType; $wgMemc = wfGetCache( $wgMainCacheType ); $this->children = null; + pcntl_signal( SIGTERM, SIG_DFL ); } protected function handleTermSignal( $signal ) {