|
(только 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.
|
|