如何在 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
输出它,我查看了手册,但我不知道如何使用它,请你制作我是一个使用示例。
【问题讨论】:
你尝试了什么?你有没有试过?print
和 echo
?
是的,但我的项目要求是使用 STDOUT,打印和回显是 STDOUT 流的一部分吗?
是的,@Cicada 所写的标准回声和打印会进入 STDOUT。
从您的第一个代码示例来看,看起来您实际上想要使用 STDIN,而不是 STDOUT。您的 shell 命令会将cat
的输出通过管道传送到php
进程中,在该进程中它变为输入 到php
。
【参考方案1】:
好的,让我再举一个例子说明STDIN
和STDOUT
的用法。
在 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】:
常量STDIN
和STDOUT
已经是资源了,所以你需要做的就是
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 语言结构。echo
或 print
.
@Cicada 请记住,回声在大多数情况下是一种副作用。流是依赖项。如果您正在编写单元测试,您将需要使用流以便在您的测试中模拟/存根它们。
+1 for php://output
, php://stdout
对我不起作用 @Cicada 我需要使用 fputcsv 并且 STDOUT 未定义
php://output是客户端输出,stdout是PHP服务器的标准输出。以上是关于如何在 php 中使用 STDOUT的主要内容,如果未能解决你的问题,请参考以下文章
如何在实时输出的同时将命令的 stdout 和 stderr 重定向到控制台和日志文件?
如何在 Perl 中读取和写入大缓冲区到进程 stdin/stdout/stderr?