proc_open вызывается только один раз в цикле foreach

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);
}

}

следующий сценарий: когда я помещаю команду исполнителя в цикл foreach, исполнитель вызывается только один раз, а оставшаяся часть цикла foreach не работает или зависает навсегда.

Так что не так?

Вот звонок …

$out = $this->executer->execute('some call', 1, array(2 => array("pipe", "w")), false, false, false, 1);

С уважением Саша

0

Решение

Решено это класс написан без ошибок.
Я решил это в программе.
На кли забыли параметр перезаписи -y force.

Спасибо Саша

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]