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。

我正在编写一个在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。我可以通过取消条件来进一步消除这一点:

$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
to
php://output
比to
php://stdout