fapchat
@fapchat

Почему 2 параметр proc_open воспринимает w как r?

<?php
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin - канал, из которого дочерний процесс будет читать
   1 => array("pipe", "w"),  // stdout - канал, в который дочерний процесс будет записывать 
   2 => array("file", "/tmp/error-output.txt", "a") // stderr - файл для записи
);

$cwd = '/tmp';
$env = array('some_option' => 'aeiou');

$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);

if (is_resource($process)) {
    // $pipes теперь выглядит так:
    // 0 => записывающий обработчик, подключенный к дочернему stdin
    // 1 => читающий обработчик, подключенный к дочернему stdout
    // Вывод сообщений об ошибках будет добавляться в /tmp/error-output.txt

    fwrite($pipes[0], '<?php print_r($_ENV); ?>');
    fclose($pipes[0]);

    echo stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    // Важно закрывать все каналы перед вызовом
    // proc_close во избежание мертвой блокировки
    $return_value = proc_close($process);

    echo "команда вернула $return_value\n";
}
?>

Почему
0 => array("pipe", "r"),  // stdin - канал, из которого дочерний процесс будет читать
   1 => array("pipe", "w"),  // stdout - канал, в который дочерний процесс будет записывать

И при этом
// $pipes теперь выглядит так:
// 0 => записывающий обработчик, подключенный к дочернему stdin
// 1 => читающий обработчик, подключенный к дочернему stdout

Ведь
второй элемент либо r для передачи процессу стороны канала для чтения, либо w для передачи стороны записи

А во втором элементе стоит w и мы в него ничего не записываем, а лишь читаем
  • Вопрос задан
  • 49 просмотров
Пригласить эксперта
Ответы на вопрос 1
@neol
$descriptorspec[0] задаёт канал со стороны запущенного вашим скриптом дочернего процесса (и дочерний процесс из него будет читать).

А $pipes[0] возвращает канал со стороны родительского скрипта, в который можно что-то записать, чтобы дочерний скрипт мог это прочитать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы