2012-08-29 3 views
2

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

[[email protected] ~]$ cat foo 
2 
3 
1 
[[email protected] ~]$ cat foo | sort 
1 
2 
3 
[[email protected] ~]$ 

Я хотел бы, чтобы имитировать это в 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, так как я хочу проверить коды выхода и ошибки журнала :).

EDIT:

Мои потребности к работе бизнес-решение КСТАТИ является:

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

Что в основном то, что операционная система будет делать, но я не хочу, чтобы мой собственный трубы-менеджмент , так как у меня есть ядро ​​/ posix для этого, и, честно говоря, это не 1976 :)

ответ

2

Да, вы можете - но я думаю, что вы должны определить это как круглый. Что вы можете использовать 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

EDIT

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

+0

Извините, что не заметил вашего ответа :) Я уже исправил это с помощью взлома, но сегодня я проверил ваш код, и он работает и работает, когда мы говорим! Большое спасибо! :) – Herbert

 Смежные вопросы

  • Нет связанных вопросов^_^