proc — PHP Script зависает при передаче параметра в процесс

Я скачал эмулятор терминала с открытым исходным кодом из github и немного изменил его. Класс для запуска процесса выглядит следующим образом:

<?php

class CProcess {
const PROC_OK = true;
const PROC_FAILED = false;

private static $instance = null;

public static function factory() {
if (!isset(self::$instance)) {
self::$instance = new CProcess();
}
return self::$instance;
}

private $pipes;
private $process;
private $stdinref;
private $stdoutref;
private $stderref;

private function __construct() {

}

public function __destruct() {
return $this->close();
}

public function open($command) {
$spec = array(
array("pty"), // STDIN
array("pty"), // STDOUT
array("pty")  // STDERR
);

if (!$this->process = proc_open($command, $spec, $this->pipes)) {
return self::PROC_FAILED;
}
$this->stdinref = &$this->pipes[0];
$this->stdoutref = &$this->pipes[1];
$this->stderref = &$this->pipes[2];

$this->setBlocking(0);
return self::PROC_OK;
}

public function isResource() {
return is_resource($this->process);
}

public function setBlocking($blocking = 1) {
return stream_set_blocking($this->stdoutref, $blocking);
}

public function getStatus() {
return proc_get_status($this->process);
}

public function get() {
$out = stream_get_contents($this->stdoutref);
return $out;
}

public function put($data) {
fwrite($this->stdinref, $data . "\n");
sleep(1);
fflush($this->stdinref);
}

public function close() {
if (is_resource($this->process)) {
fclose($this->stdinref);
fclose($this->stdoutref);
fclose($this->stderref);
return proc_close($this->process);
}
}

public function metaData() {
return stream_get_meta_data($this->stdoutref);
}

}

Теперь я хочу аутентифицировать пару логин / пароль, используя следующий метод:

  public static function autenticate($login, $password) {
if (true === DEBUG_MODE) {
error_log("authenticate(): login={$login} password={$password}",0);
}
error_log("test");
self::$username = $login;
$process = CProcess::factory();
$cmd = "su " . escapeshellarg($login);
if (true === DEBUG_MODE) {
error_log("authenticate(): cmd={$cmd}", 0);
}

$rc = $process->open($cmd);
usleep(100000); // 500000
if ($rc === CProcess::PROC_FAILED) {
if (true === DEBUG_MODE) {
error_log("authenticate(): process_open() returns {$rc}", 0);
}

return false;
}
if (true === DEBUG_MODE) {
error_log("authenticate(): invoking process->put() with param={$password}");
}

$process->put($password);
if (true === DEBUG_MODE) {
error_log("authenticate(): process->put() returned its value");
}

usleep(100000);
return (bool) !$process->close();
}

Проблема в том, что скрипт зависает при входе в $process->put($password);, Мой браузер просто показывает «В ожидании локального хоста», и это длится вечно. в put(); метод класса CProcess Я тоже пробовал PHP_EOL вместо \n но результат был тот же. Что не так с этим кодом?

0

Решение

Каналы, которые вы используете, должны быть более похожими, с опциями чтения / записи …

$spec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "/tmp/error-output.log", "a") );
0

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

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

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