proc_open
proc_open
(только PHP 4 CVS)
proc_open - выполняет команду и открывает файловый указатель для ввода/вывода.
Описание
resource proc_open (string cmd, array descriptorspec, array pipes)
proc_open() похожа на popen(), но предоставляет больший контроль над выполнением программы. cmd это команда, выполняемая оболочкой. descriptorspec это индексированный массив, в котором ключи представляют номера дескрипторов, а значения представляют то, как PHP передаёт эти дескрипторы в дочерний процесс. pipes будет установлен в индексированный массив файловых указателей, соответствующий концу любых созданных каналов. return-значение является ресурсом представляющим процесс; вы должны освободить его с помощью proc_close() по окончании работы с ним.
$descriptorspec = array( 0 => array("pipe", "r"), // stdin это канал, из которого потомок будет читать 1 => array("pipe", "w"), // stdout это канал, в который потомок будет записывать 2 => array("file", "/tmp/error-output.txt", "a"), // stderr это файл для записи ); $process = proc_open("php", $descriptorspec, $pipes); if (is_resource($process)) { // $pipes выглядит теперь примерно так: // 0 => записываемый дескриптор, соединённый с дочерним stdin // 1 => читаемый дескриптор, соединённый с дочерним stdout // Любой вывод ошибки будет присоединён к /tmp/error-output.txt fwrite($pipes[0], "<?php echo \"Hello World!\"; ?>"); fclose($pipes[0]); while(!feof($pipes[1])) { echo fgets($pipes[1], 1024); } fclose($pipes[1]); // Важно, чтобы вы закрыли любые каналы до вызова // proc_close, чтобы исключить тупиковую блокировку $return_value = proc_close($process); echo "command returned $return_value\n"; } |
Номера дескрипторов файлов в descriptorspec не ограничены 0, 1 и 2 - вы можете специфицировать любой правильный номер дескриптора файла, и он будет передан в дочерний процесс. Это даст возможность вашему скрипту взаимодействовать с другими скриптами, запущенными как "со-процессы". Это особенно пригодится для передачи pass-фраз программам вроде PGP, GPG и openssl более безопасным/секретным способом. Это используется также для чтения информации статуса, предоставляемой этими программами во вспомогательных дескрипторах файлов.
Примечание: Windows-совместимость: дескрипторы вне 2 (stderr) становятся доступными дочернему процессу как наследуемые дескрипторы, но, поскольку архитектура Windows не ассоциирует номер дескриптора файла с низкоуровневым дескриптором, дочерний процесс (пока ещё) не имеет средств доступа к этому дескриптору. Stdin, stdout и stderr work работают так, как ожидается.
Примечание: эта функция была введена в PHP 4.3.0.
Примечание: если вам нужен только однонаправленный канал процесса, используйте popen() вместо данной функции, так как она проще в использовании.
См. также exec(), system(), passthru(), popen(), escapeshellcmd() и операцию backtick.