proc_open
14 октября 2010 - Администратор
Рейтинг: 0
Голосов: 0
409 просмотров
Комментарии (0)
Нет комментариев. Ваш будет первым!
| ||||||||||
|
$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 "; } |
Номера дескрипторов файлов в descriptorspec не ограничены 0, 1 и 2 - вы можете специфицировать любой правильный номер дескриптора файла, и он будет передан в дочерний процесс. Это даст возможность вашему скрипту взаимодействовать с другими скриптами, запущенными как "со-процессы". Это особенно пригодится для передачи pass-фраз программам вроде PGP, GPG и openssl более безопасным/секретным способом. Это используется также для чтения информации статуса, предоставляемой этими программами во вспомогательных дескрипторах файлов.
Примечание: Windows-совместимость: дескрипторы вне 2 (stderr) становятся доступными дочернему процессу как наследуемые дескрипторы, но, поскольку архитектура Windows не ассоциирует номер дескриптора файла с низкоуровневым дескриптором, дочерний процесс (пока ещё) не имеет средств доступа к этому дескриптору. Stdin, stdout и stderr work работают так, как ожидается.
Примечание: эта функция была введена в PHP 4.3.0.
Примечание: если вам нужен только однонаправленный канал процесса, используйте popen() вместо данной функции, так как она проще в использовании.
См. также
| ||||||
|
Нет комментариев. Ваш будет первым!