note 97713 added to function.proc-open

From: Date: Tue, 04 May 2010 18:32:25 +0000
Subject: note 97713 added to function.proc-open
Groups: php.notes 
Request: Send a blank email to php-notes+get-168932@lists.php.net to get a copy of this message
I've added some features to the Processmanager class written by Matou Havlena. Adding a script to the porocessmanager now supports an optional string of command line arguments. Also, return values from child scripts are saved in an array, which is returned by the processmanager object. Each element in the master array represents one child process, and each of those arrays is itself an array of the stdout from the child, separated by line breaks. <?php class Processmanager { public $executable = "/usr/bin/php"; public $root = "/path/to/web/root/"; // script paths are passed relative to this location public $scripts = array(); public $processesRunning = 0; public $processes = 30; // Max number of simultaneous processes public $running = array(); public $sleep_time = 3; // Sleep time between checking for completed processes (and exec'ing additional ones, if applicable) public $arguments = ''; // Arguments passed to the script public $return = array(); // return value to give to calling script; saves an array of all the stdout from the child scripts function addScript($script, $arguments = '', $max_execution_time = 300) { $this->scripts[] = array("script_name" => $script, "arguments" => $arguments, "pipes" => array(), // to retrieve stdout from child scripts "max_execution_time" => $max_execution_time); } function exec() { $i = 0; for(;;) { // Fill up the slots while (($this->processesRunning<$this->processes) and ($i<count($this->scripts))) { echo "<span style='color: orange;'>Adding script: ".$this->scripts[$i]["script_name"]." with args ".$this->scripts[$i]["arguments"]."</span><br />"; ob_flush(); flush(); $this->running[] =& new Process($this->executable, $this->root, $this->scripts[$i]["script_name"], $this->scripts[$i]["arguments"], $this->scripts[$i]["pipes"], $this->scripts[$i]["max_execution_time"]); $this->processesRunning++; $i++; } // Check if done if (($this->processesRunning==0) and ($i>=count($this->scripts))) { break; } // sleep, this duration depends on your script execution time, the longer execution time, the longer sleep time sleep($this->sleep_time); // check what is done foreach ($this->running as $key => $val) { if (!$val->isRunning() or $val->isOverExecuted()) { if (!$val->isRunning()) echo "<span style='color: green;'>Done: ".$val->script." ".$val->arguments."</span><br />"; else echo "<span style='color: red;'>Killed: ".$val->script." ".$val->arguments."</span><br />"; $return[] = explode("\n",stream_get_contents($val->pipes[1])); proc_close($val->resource); unset($this->running[$key]); $this->processesRunning--; ob_flush(); flush(); } } } return $return; } } class Process { public $resource; public $pipes; public $script; public $max_execution_time; public $start_time; public $arguments; function __construct(&$executable, &$root, $script, $arguments, $pipes, $max_execution_time) { $this->script = $script; $this->arguments = $arguments; $this->max_execution_time = $max_execution_time; $this->pipes = $pipes; $descriptorspec = array( 0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w') ); $this->resource = proc_open($executable." ".$root.$this->script." ".escapeshellarg($this->arguments), $descriptorspec, $this->pipes, null, $_ENV); $this->start_time = mktime(); } // is still running? function isRunning() { $status = proc_get_status($this->resource); return $status["running"]; } // long execution time, proccess is going to be killer function isOverExecuted() { if ($this->start_time+$this->max_execution_time<mktime()) return true; else return false; } } /*Example of using: $manager = new Processmanager(); $manager->addScript("path/to/script1.php", "argument1 argument 2"); $manager->addScript("path/to/script2.php"); $manager->addScript("path/to/script1.php", "argument3"); $manager->exec(); */ ?> ---- Server IP: 69.147.83.197 Probable Submitter: 216.45.231.50 ---- Manual Page -- http://www.php.net/manual/en/function.proc-open.php Edit -- https://master.php.net/note/edit/97713 Del: integrated -- https://master.php.net/note/delete/97713/integrated Del: useless -- https://master.php.net/note/delete/97713/useless Del: bad code -- https://master.php.net/note/delete/97713/bad+code Del: spam -- https://master.php.net/note/delete/97713/spam Del: non-english -- https://master.php.net/note/delete/97713/non-english Del: in docs -- https://master.php.net/note/delete/97713/in+docs Del: other reasons-- https://master.php.net/note/delete/97713 Reject -- https://master.php.net/note/reject/97713 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#168932) next »