Новое в Symfony 3.1: Входнящий и исходящий потоки для процессов

  • исходящий поток
  • входящий поток

Исходнящий поток

В Symfony 3.1, класс Process реализует интерфейс PHP IteratorAggregate для возврата итератора для вывода запущенных процессов. Ключ возвращаемого значения является типом вывода (Process :: OUT или Process :: ERR) и значение вывода генерируется процессом.

Эта новая функция позволяет транслировать вывод так же легко,  с помощью конструкции foreach():

use Symfony\Component\Process\Process;

$process = new Process('ls -lsa');
$process->start();

foreach ($process as $type => $data) {
    if ($process::OUT === $type) {
        echo $data."\n";
    } else {
        echo "[ERR] ".$data."\n";
    }
}

Входящий поток

Также компонент Process добавляет в Symfony 3.1 новый класс InputStream, реализующий передачу данных в стандартный входящий поток, в процессе его работы. Традиционно вы использовали метод setInput (), чтобы получить данные:

use Symfony\Component\Process\Process;

$process = new Process('cat');
$process->setInput('file.txt');
$process->run();

В этом примере, после того, как данные были полностью записаны на стандартный ввод подпроцесса, связанный с ним pipe закрывается и вы не можете больше подключиться к входному потоку. Новый InputStream позволяет обойти это ограничение:

use Symfony\Component\Process\InputStream;

$input = new InputStream();
$input->write('foo');

$process = new Process('my_script');
$process->setInput($input);
$process->start();

// ... read process output or do other things

$input->write('bar');

// ... read process output or do other things

$input->write('qux');
$input->close();

// ...

Вы можете предоставить больше чем один ввод в случае необходимости во время выполнения процесса. Метод write() принимает скаляры, потоки ресурсов или Traversable объекты в качестве аргумента. Когда вы закончите писать на стандартный ввод, просто вызовите метод close().

Источник: http://symfony.com/blog/new-in-symfony-3-1-input-and-output-stream-for-processes

 

 

Добавить комментарий

Ваш адрес email не будет опубликован.

8 + шесть =