note 97713 added to function.proc-open
| From: | phpatjeremygustafsondotnet at osu1 dot php dot net | 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