PHP标准未编写
我正在编写一个在ApacheHttpDweb服务器上运行的PHP脚本(不是由我管理的)。在函数中,变量PHP标准未编写,php,apache,stdout,Php,Apache,Stdout,我正在编写一个在ApacheHttpDweb服务器上运行的PHP脚本(不是由我管理的)。在函数中,变量$outfile作为函数参数给出,函数的开头是: if (isset($outfile)) $fh = fopen($outfile, 'wb'); else $fh = fopen('php://stdout', 'w'); echo 'Hello, '; fwrite($fh, 'World'); 我用$outfile=NULL调用这个函数,所以$fh应该指向stdout。
$outfile
作为函数参数给出,函数的开头是:
if (isset($outfile))
$fh = fopen($outfile, 'wb');
else
$fh = fopen('php://stdout', 'w');
echo 'Hello, ';
fwrite($fh, 'World');
我用$outfile=NULL
调用这个函数,所以$fh
应该指向stdout。我可以通过取消条件来进一步消除这一点:
$fh = fopen('php://stdout', 'w');
echo 'Hello, ';
fwrite($fh, 'world');
关键是,它只输出
Hello,
而不是我所期望的:
Hello, world!
为什么以及如何规避此问题?使用
php://output
而不是php://stdout
。正如上面所说的
php://output
是一个只写流,允许您以与打印
和回送
相同的方式写入输出缓冲机制
php://stdout
直接写入stdout
文件描述符,因此无法与echo
的缓冲输出正确同步。为什么要再次写入stdout?可能是因为输出缓冲。@webjujuju,正如您从第一个代码中看到的,变量$output
可以是NULL
或文件名。@Barmar,脚本执行结束时是否应该刷新缓冲区?添加flush()。你有什么理由要退出fclose
?与php://stdout
至php://output
?也许澄清这一点有助于回答这个问题。php://stdout
直接写入标准输出文件描述符,php://output
写入PHP的输出缓冲区,因此它与echo
语句的顺序正确。@Barmar,就是这样。显然,echo
更像是fwrite
tophp://output
比tophp://stdout
。