簡體   English   中英

如何將 output 打印到 php 中的兩個不同終端?

[英]How to print output to two different terminals in php?

我正在使用 amphp/parallel-functions並行運行兩個for loops 我想知道如何看到實時 output 並行打印? 我正在考慮打印到兩個不同的終端。 有可能嗎? 如果沒有,我如何跟蹤 output 如果它是並行運行還是順序運行?

<?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));

當前 Output 似乎是順序的

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

注意我使用的是mac,這純粹是為了在我的本地測試。

免責聲明:打印到終端本質上將非常依賴於操作系統,而不是一個非常穩定的系統:當用戶關閉終端時你會做什么? 如果您在第一個終端上已經運行了其他東西會發生什么?

有了這個,你可以這樣做:

在大多數版本的 linux 上,您可以在任何打開的終端上將 /dev/pts/(例如 /dev/pts/1)中的虛擬文件寫入 output。 您可以通過打開兩個終端實例並在第二個終端實例中鍵入以下內容來嘗試一下:

echo "testing" > /dev/pts/0

這應該在第一個終端上打印測試。 但是它在 mac 上不起作用,因為沒有 /dev/pts 文件夾,但是您可以在第二個終端中鍵入以下內容:

echo "testing" > /dev/ttys000

或在 php 中:

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

如果在 Windows 上完全可行,那幾乎肯定比寫入文件要復雜得多。

一般來說,我建議在這種情況下編寫 output 來分隔日志文件,而不是終端

amphp/parallel使用子進程來並行運行這些。 子進程的 STDOUT 和 STDERR 分別通過管道傳輸到父進程的 STDOUT 和 STDERR。 由於流是按塊讀取和寫入的,因此 output 順序可能並不代表實際的執行順序。

如果您將sleep調用放入for循環中,您可能能夠觀察到交錯的執行順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM