【问题标题】:How to print output to two different terminals in php?如何在php中将输出打印到两个不同的终端?
【发布时间】:2020-04-21 13:31:44
【问题描述】:

我正在使用 amphp/parallel-functions 在 parallel 中运行两个 for loops。我想知道如何查看并行打印的实时输出?我正在考虑打印到两个不同的终端。有可能吗?如果不是,我如何跟踪并行或顺序运行的输出?

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

注意我使用的是mac,这纯粹是为了在我的本地测试。

【问题讨论】:

  • time() 函数可以帮到你
  • @Shalior 这似乎是个好主意!!但是,虽然循环很长,但最好同时在两列中打印或在两个单独的终端中打印。有什么办法吗?

标签: php amphp


【解决方案1】:

免责声明:打印到终端本质上非常依赖操作系统,而不是真正稳定的系统:当用户关闭终端?如果您在第一个终端上已经运行了其他东西,会发生什么?

除此之外,您可以这样做:

在大多数版本的 linux 上,您可以写入位于 /dev/pts/ 的虚拟文件(例如 /dev/pts/1)以在任何打开的终端上输出。您可以通过打开两个终端实例并在第二个终端实例中输入以下内容来尝试一下:

echo "testing" > /dev/pts/0

这应该在第一个终端上打印测试。但是它在 mac 上不起作用,因为没有 /dev/pts 文件夹,但是您可以在第二个终端中键入以下内容:

echo "testing" > /dev/ttys000

或在 php 中:

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

如果在 Windows 上完全可行,那几乎肯定比写入文件要复杂得多。

一般来说,在这种情况下,我建议将输出写入单独的日志文件,而不是终端

【讨论】:

  • 谢谢,但不幸的是,我使用的是 Mac。我只是在本地测试它。所以用户就是我自己。所以不会关闭终端。
  • 在 Windows 上不是更难做吗哈哈
  • @Kaan echo "testing" &gt; /dev/ttys000 在添加到我的脚本时不起作用。它说错误Undefined constant
  • @SkyRar 这可能是因为它不是 php,您应该在终端中输入它。在 php 中,您必须使用 fopen 打开 /dev/ttys000 并使用 fwrite 对其进行写入。我已将其添加到您的答案中
【解决方案2】:

amphp/parallel 使用子进程来并行运行这些。子进程的 STDOUT 和 STDERR 分别通过管道传输到父进程的 STDOUT 和 STDERR。由于流是按块读取和写入的,因此输出顺序可能并不代表实际的执行顺序。

如果您将sleep 调用放入for 循环中,您可能能够观察到交错的执行顺序。

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多