(PHP 4 >= 4.3.0, PHP 5, PHP 7)
proc_open — Выполняет команду и открывает указатель на файл для ввода/вывода
$cmd
, array $descriptorspec
, array &$pipes
[, string $cwd
[, array $env
[, array $other_options
]]] )proc_open() аналогична popen() но предоставляет намного больше контроля над исполнением программы.
cmd
Команда для выполнения
descriptorspec
Массив, ключи которого представляют собой номер дескриптора, а значение описывает, как PHP должен передать этот дескриптор дочернему процессу. 0 - stdin, 1 - stdout и 2 - stderr.
Каждый элемент может быть:
STDIN
).
Номера дескрипторов не ограничены только 0, 1 и 2 - вы можете назначить любой действительный номер дескриптора и он будет передан дочернему процессу. Это позволяет скрипту взаимодействовать с другими скриптами, работающими, как параллельные процессы. В частности, таким образом можно передавать данные, требующие защиты, в программы вроде PGP, GPG и openssl более безопасно. Также это может оказаться полезным для чтения статусной информации, предоставляемой этими программами на вспомогательных файловых дескрипторах.
pipes
Будет задан массивом указателей на файлы, соответствующие созданным каналам передачи данных PHP.
cwd
Рабочая директория команды. Это должен быть
абсолютный путь к директории или
NULL
, если требуется использовать директорию по умолчанию (рабочая
директория текущего PHP процесса).
env
Массив переменных окружения для запускаемой команды или NULL
, если
требуется использовать то же окружение, что и у текущего PHP процесса.
other_options
Позволяет задать дополнительные настройки. На данный момент поддерживаются следующие настройки:
TRUE
не будут показываться ошибки, возникающие в ходе работы
функции
TRUE
процесс будет запущен в обход оболочки
cmd.exe
Возвращает ресурс, представляющий процесс. Этот ресурс необходимо освобождать
функцией proc_close() по завершении работы с ним.
В случае ошибки возвращает FALSE
.
Версия | Описание |
---|---|
5.2.1 |
Настройка bypass_shell добавлена в аргумент
other_options .
|
Пример #1 Пример использования proc_open()
<?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";
}
?>
Результатом выполнения данного примера будет что-то подобное:
Array ( [some_option] => aeiou [PWD] => /tmp [SHLVL] => 1 [_] => /usr/local/bin/php ) команда вернула 0
Замечание:
Совместимость с Windows: Дескрипторы дальше 2 (stderr) наследуются дочерними процессам, однако с тех пор как Windows не ассоциирует номера файловых дескрипторов с низкоуровневыми обработчиками, дочерние процессы не имеют (пока) к ним доступа. Это не относится к stdin, stdout и stderr.
Замечание:
Если нужен однонаправленный канал процесса, используйте функцию popen(), так как она значительно проще в использовании.