0
class CommandExecuter {
const EXEC_FAILED = "EXEC_FAILED";
public function execute($cmd, $sleep, $descriptors, $progressCallback, $progressCallbackParams, $showProgress = false, $callbackTurns = 0) {
log_out("INFO", basename(__FILE__), "Executing: $cmd");
// Start execution of $cmd
if (!($process = proc_open($cmd, $descriptors, $pipes)) || !is_resource($process)) {
throw new CTException("Unable to execute command:\n$cmd\n", self::EXEC_FAILED);
}
// Set the pipes as non-blocking
if (isset($descriptors[1]) && $descriptors[1]) {
stream_set_blocking($pipes[1], FALSE);
}
if (isset($descriptors[2]) && $descriptors[2]) {
stream_set_blocking($pipes[2], FALSE);
}
if ($callbackTurns) {
$i = 0;
}
// Used to store all output
$allOut = "";
$allOutErr = "";
// Check process status at every turn
$procStatus = proc_get_status($process);
while ($procStatus['running']) {
// Read prog output
if (isset($descriptors[1]) && $descriptors[1]) {
$out = fread($pipes[1], 8192);
$allOut .= $out;
}
// Read prog errors
if (isset($descriptors[2]) && $descriptors[2]) {
$outErr = fread($pipes[2], 8192);
$allOutErr .= $outErr;
}
// If callback only after N turns
if ($callbackTurns) {
if ($i == $callbackTurns) {
if ($showProgress) {
echo ".\n";
}
// Call user provided callback.
// Callback should be an array as per doc here:
// http://www.php.net/manual/en/language.types.callable.php
// Type 3: Object method call
if (isset($progressCallback) && $progressCallback) {
call_user_func($progressCallback, $progressCallbackParams, $allOut, $allOutErr);
}
$i = 0;
}
} else {
// Call user provided callback.
// Callback should be an array as per doc here:
// http://www.php.net/manual/en/language.types.callable.php
// Type 3: Object method call
if (isset($progressCallback) && $progressCallback) {
call_user_func($progressCallback, $progressCallbackParams, $allOut, $allOutErr);
}
}
// Get latest status
$procStatus = proc_get_status($process);
if ($showProgress) {
echo ".";
flush();
}
if ($callbackTurns) {
$i++;
}
sleep($sleep);
}
if ($showProgress) {
echo "\n";
}
// Process is over
proc_close($process);
return array('out' => $allOut, 'outErr' => $allOutErr);
}
}
следующего сценарием: когда я поставил команду в исполнителе цикл Еогеаспа получает только исполнитель один раз звонил, и остальную часть цикла Еогеаспа мертв или повиснет навсегда.proc_open называют только один раз в цикле Еогеаспа
Итак, что не так?
Вот вызов ...
$out = $this->executer->execute('some call', 1, array(2 => array("pipe", "w")), false, false, false, 1);
С уважением Sascha