如何在 php 中使用 STDOUT

Posted

技术标签:

【中文标题】如何在 php 中使用 STDOUT【英文标题】:How to use STDOUT in php 【发布时间】:2012-02-05 14:28:48 【问题描述】:

我正在运行一个从 txt 文件读取流的项目,所以在 CLI 中,我写:

cat texte.txt|php index.php

在我的index.php 文件中,我读取了流:

$handle = fopen ("php://stdin","r");

现在我有一个$result,其中包含我处理文件的结果,我想用STDOUT 输出它,我查看了手册,但我不知道如何使用它,请你制作我是一个使用示例。

【问题讨论】:

你尝试了什么?你有没有试过? printecho? 是的,但我的项目要求是使用 STDOUT,打印和回显是 STDOUT 流的一部分吗? 是的,@Cicada 所写的标准回声和打印会进入 STDOUT。 从您的第一个代码示例来看,看起来您实际上想要使用 STDIN,而不是 STDOUT。您的 shell 命令会将cat 的输出通过管道传送到php 进程中,在该进程中它变为输入php 【参考方案1】:

好的,让我再举一个例子说明STDINSTDOUT 的用法。

在 PHP 中你使用这两个习惯用法:

 $input = fgets(STDIN);

 fwrite(STDOUT, $output);

当你从命令行使用它们时:

 cat "input.txt"  |  php script.php   >  "output.txt"

 php script.php  < input.txt  > output.txt

 echo "input..."  |  php script.php   |  sort  |  tee  output.txt

这就是所有这些事情。管道输入,或管道输出。传入的部分将出现在STDIN,而您的输出应该转到STDOUT。千万不要越过溪流,伙计们!

【讨论】:

这两个流在 Web 应用程序上下文中是否有用? 不正常。您只使用 echo/print/STDOUT 将输出发送到 webserver+client。通过 STDERR 发送的所有内容最终都会出现在网络服务器的 error.log 中(如果已配置)。 $output 可以是像fwrite(STDOUT, 'here'); 这样的字符串?【参考方案2】:

常量STDINSTDOUT已经是资源了,所以你需要做的就是

fwrite(STDOUT, 'foo');

见http://php.net/manual/en/wrappers.php

php://stdin、php://stdout 和 php://stderr 允许直接访问 PHP 进程的相应输入或输出流。该流引用了一个重复的文件描述符,因此如果您打开 php://stdin 然后关闭它,您只会关闭描述符的副本 - STDIN 引用的实际流不受影响。请注意,在 PHP 5.2.1 之前,PHP 在这方面表现出错误的行为。建议您简单地使用常量 STDIN、STDOUT 和 STDERR,而不是使用这些包装器手动打开流。

【讨论】:

PHP Warning: fwrite() expects parameter 1 to be resource, string given in PHP 5.4 而$out = fopen('php://stdout', 'w'); 工作 fwrite(STDOUT, "foo"); --> Undefined constant "STDOUT"【参考方案3】:

这应该适合你

$out = fopen('php://output', 'w'); //output handler
fputs($out, "your output string.\n"); //writing output operation
fclose($out); //closing handler

【讨论】:

我不明白答案有什么问题..我试过了,它奏效了((:我认为糟糕的评论导致了这个。 它确实确​​实有效,我不是在批评它。但是这 3 个函数调用可以替换为 one 语言结构。 echoprint. @Cicada 请记住,回声在大多数情况下是一种副作用。流是依赖项。如果您正在编写单元测试,您将需要使用流以便在您的测试中模拟/存根它们。 +1 for php://output , php://stdout 对我不起作用 @Cicada 我需要使用 fputcsv 并且 STDOUT 未定义 php://output是客户端输出,stdout是PHP服务器的标准输出。

以上是关于如何在 php 中使用 STDOUT的主要内容,如果未能解决你的问题,请参考以下文章

如何在实时输出的同时将命令的 stdout 和 stderr 重定向到控制台和日志文件?

如何在unittest中捕获python子进程stdout

我如何在 .NET 中管道 stdout/stderr?

如何在 Perl 中读取和写入大缓冲区到进程 stdin/stdout/stderr?

请写出并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数

如何在 Windows 中访问继承的匿名管道句柄,而不是 stdout、stderr 和 stdin?