Как напечатать вывод на два разных терминала в php? - PullRequest
1 голос
/ 21 апреля 2020

Я использую две for loops в параллельные с использованием функций amphp / parallel. Мне интересно, как я могу увидеть распечатку в режиме реального времени параллельно? Я думаю о печати на двух разных терминалах. Это возможно? Если нет, то как я могу отслеживать выход, если он работает параллельно или последовательно?

<?php
require "vendor/autoload.php";

use Amp\Promise;
use Amp\ParallelFunctions;

$promises[1] = ParallelFunctions\parallel(function (){

    for ($i=0; $i<50; $i++){
        echo 'Promise-1 : '. $i . PHP_EOL;
    }

})();

$promises[2] = ParallelFunctions\parallel(function (){

    for ($i=0; $i<50; $i++){
        echo 'Promise-2 : '. $i .PHP_EOL;
    }

})();

Promise\wait(Promise\all($promises));

Токовый выход кажется последовательным

Promise-1 : 0
Promise-1 : 1
Promise-1 : 2
Promise-1 : 3
Promise-1 : 4
Promise-2 : 0
Promise-2 : 1
Promise-2 : 2
Promise-2 : 3
Promise-2 : 4

Примечание Я использую Ма c, и это чисто для проверки на моем местном.

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Отказ от ответственности : печать на терминале по своей природе будет сильно зависеть от ОС, а не от самой стабильной системы. Что вы будете делать, когда пользователь закрывает терминал? Что произойдет, если на первом терминале уже работает что-то еще?

С этим вот как вы можете это сделать:

В большинстве версий linux вы можете записывать в виртуальные файлы, найденные в / dev / pts / (например, / dev / pts / 1) для вывода на любой открытый терминал. Вы можете попробовать это, открыв два экземпляра терминала и введя следующее во втором:

echo "testing" > /dev/pts/0

Это должно напечатать тестирование на первом терминале. Однако он не будет работать на ma c, поскольку папка / dev / pts отсутствует, однако вместо этого вы можете ввести следующее во втором терминале:

echo "testing" > /dev/ttys000

или в php:

$fp = fopen('dev/ttys000');
fwrite($fp, "testing\n");
fclose($fp);

Если это вообще возможно на Windows, это почти наверняка намного сложнее, чем запись в файл.

В общем, я рекомендую записывать вывод в отдельные файлы журнала в этом Такая ситуация вместо терминала

0 голосов
/ 27 апреля 2020

amphp/parallel использует дочерние процессы для их параллельного запуска. STDOUT и STDERR дочерних процессов передаются в родительские STDOUT и STDERR соответственно. Поскольку потоки читаются и записываются в чанках, порядок вывода, скорее всего, не соответствует действительному порядку выполнения.

Если вы поместите вызовы sleep в циклы for, вы, вероятно, сможете наблюдать чередующийся порядок выполнения.

...