コード例 #1
0
 /**
  * Closes process resource, closes file handles, sets the exitcode.
  *
  * @return int The exitcode
  */
 private function close()
 {
     $this->processPipes->close();
     if (is_resource($this->process)) {
         $exitcode = proc_close($this->process);
     } else {
         $exitcode = -1;
     }
     $this->exitcode = -1 !== $exitcode ? $exitcode : (null !== $this->exitcode ? $this->exitcode : -1);
     $this->status = self::STATUS_TERMINATED;
     if (-1 === $this->exitcode && null !== $this->fallbackExitcode) {
         $this->exitcode = $this->fallbackExitcode;
     } elseif (-1 === $this->exitcode && $this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) {
         // if process has been signaled, no exitcode but a valid termsig, apply Unix convention
         $this->exitcode = 128 + $this->processInformation['termsig'];
     }
     return $this->exitcode;
 }
コード例 #2
0
 /**
  * Waits for the process to terminate.
  *
  * The callback receives the type of output (out or err) and some bytes
  * from the output in real-time while writing the standard input to the process.
  * It allows to have feedback from the independent process during execution.
  *
  * @param callable|null $callback A valid PHP callback
  *
  * @return int The exitcode of the process
  *
  * @throws RuntimeException When process timed out
  * @throws RuntimeException When process stopped after receiving signal
  * @throws LogicException   When process is not yet started
  */
 public function wait($callback = null)
 {
     $this->requireProcessIsStarted(__FUNCTION__);
     $this->updateStatus(false);
     if (null !== $callback) {
         $this->callback = $this->buildCallback($callback);
     }
     do {
         $this->checkTimeout();
         $running = '\\' === DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen();
         $close = '\\' !== DIRECTORY_SEPARATOR || !$running;
         $this->readPipes(true, $close);
     } while ($running);
     while ($this->isRunning()) {
         usleep(1000);
     }
     if ($this->processInformation['signaled'] && $this->processInformation['termsig'] !== $this->latestSignal) {
         throw new RuntimeException(sprintf('The process has been signaled with signal "%s".', $this->processInformation['termsig']));
     }
     return $this->exitcode;
 }
コード例 #3
0
ファイル: Process.php プロジェクト: NicholasTaylorUK/symfony
 /**
  * Closes process resource, closes file handles, sets the exitcode.
  *
  * @return int The exitcode
  */
 private function close()
 {
     $this->processPipes->close();
     if (is_resource($this->process)) {
         $exitcode = proc_close($this->process);
     } else {
         $exitcode = -1;
     }
     $this->exitcode = -1 !== $exitcode ? $exitcode : (null !== $this->exitcode ? $this->exitcode : -1);
     $this->status = self::STATUS_TERMINATED;
     if (-1 === $this->exitcode && null !== $this->fallbackExitcode) {
         $this->exitcode = $this->fallbackExitcode;
     } elseif (-1 === $this->exitcode && $this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) {
         // if process has been signaled, no exitcode but a valid termsig, apply Unix convention
         $this->exitcode = 128 + $this->processInformation['termsig'];
     }
     // Free memory from self-reference callback created by buildCallback
     // Doing so in other contexts like __destruct or by garbage collector is ineffective
     // Now pipes are closed, so the callback is no longer necessary
     $this->callback = null;
     return $this->exitcode;
 }