Intereting Posts

Подключить трубы процессов в php

Я хотел бы, чтобы выход одного процесса, созданного с помощью proc_open, был передан в другой, созданный с помощью proc_open (в php). Например. В bash я могу сделать:

[herbert@thdev1 ~]$ cat foo 2 3 1 [herbert@thdev1 ~]$ cat foo | sort 1 2 3 [herbert@thdev1 ~]$ 

Я хотел бы имитировать это в php, используя proc_open (вместо shell_exec), чтобы иметь контроль над возвращаемыми кодами, трубами и т. Д. Поэтому мне нужно что-то вроде этого:

 $catPipes=array(); $sortPipes=array(); $cwd = '/tmp'; $env = array(); $catProcess = proc_open("cat foo", array( 0 => array("pipe", "r"), 1 => array("pipe", "w") ), $catPipes, $cwd, $env); $sortProcess = proc_open("sort", array( 0 => array("pipe", "r", $catPipes[1]), 1 => array("pipe", "w"), ), $sortPipes, $cwd, $env); echo stream_get_contents($sortPipes[1]); fclose($sortPipes[1]); //proc_close(this) ... proc_close(that) ... etc 

Кто-нибудь знает, как я смогу имитировать «|» bash в php, т. е. соединить второй дескриптор cat-процесса с первым дескриптором sort-процесса? Любая помощь будет оценена! Но, пожалуйста, не перенаправляйте меня на shell_exec, так как я хочу проверить коды выхода и ошибки журнала :).

РЕДАКТИРОВАТЬ:

Мое решение для бизнеса-бизнеса-btw:

 while(!feof($searchPipes[1])) fwrite($lookupPipes[0], stream_get_line($searchPipes[1], 40000)); 

Это в основном то, что будет делать ОС, но я не хочу, чтобы мое собственное управление трубами, поскольку у меня есть ядро ​​/ posix для этого, и будем честными, это не 1976 🙂

Да, вы можете – но я думаю, вы должны определить это так. Что вы можете использовать STDIN для «сортировки» как труба STDOUT для «cat». Посмотрите на следующее, которое работает для меня:

 <?php $txt = "a\nc\ne\nb\nd\n"; $fh = fopen('data://text/plain;base64,' . base64_encode($txt), 'r'); $sort_pipes = array(); $sort_proc = proc_open( 'sort', array( array('pipe', 'r'), STDOUT ), $sort_pipes ); $cat_pipes = array(); $cat_proc = proc_open( 'cat', array( $fh, $sort_pipes[0] ), $cat_pipes ); 

В первых двух строках я определял поток данных из текстовой строки, в которой я не должен полагаться на файл где-то в файловой системе. Обратите внимание, что у меня есть список несортированных символов, хранящихся в потоке данных (a, c, e, b, d). Запуск сценария выше должен вернуть отсортированный список в STDOUT.

Обратите внимание, что вы также можете указать ресурсы как дескрипторы. В этом случае вы должны опустить нотацию массива, поэтому:

 STDOUT 

вместо

 array(STDOUT) 

и т.п.

Btw: вы можете даже писать напрямую в файл, указанный именем файла. Вы можете найти дополнительную информацию о спецификации дескриптора в ручном вводе для proc_open по адресу http://en.php.net/manual/de/function.proc-open.php

РЕДАКТИРОВАТЬ

Другой способ тоже работает: вы также можете написать «cat» в array('pipe', 'w') труб STDOUT array('pipe', 'w') и использовать $cat_pipes[1] как STDIN для «сортировки». 🙂