最终更新
好像我确实犯了一个非常简单的错误。由于我已经有一个流实现,我不能开始从流中读取:D
我正在尝试在 PHP中实现类似即发即弃的功能。
<?php
ignore_user_abort(true);
header("Content-Length: 4");
header("Connection: Close");
echo "abcd";
flush();
sleep(5);
echo "Text user should not see"; // because it should have terminated
?>
如果我用浏览器打开脚本,这将有效。(显示“abcd”)。但是,如果我用file_get_contents
某个流库打开它,它会等待约 5 秒并显示第二个文本。
我正在使用 PHP 5.2.11 / Apache 2.0
更新
我似乎对我要完成的工作有些困惑。
我不想使用输出缓冲区隐藏输出(这很愚蠢)。sleep(5)
我想让客户端在服务器启动一个可能很长的进程(使用输出缓冲区只是一个副作用。我在不使用输出缓冲区的情况下修改了示例代码。
我不明白的是:为什么这个脚本在从浏览器访问它与在 PHP 中使用file_get_contents("http://dev/test.php")
或某些流库获取它时表现不同?我在测试中看到的是,例如stream_get_contents
在返回任何输出之前实际上会阻塞 5 秒,这与我想要的完全相反。
更新2
更多结果:
- 浏览器以某种方式响应
flush()
. 我不知道如何用PHP 中的流复制这种行为,我的流一直阻塞。 - 我试过
fread
了,发现它的行为类似于stream_get_contents
. - 指定 a
maxlength
无效,它仍会阻塞约 5 秒。 - 更改阻塞模式没有任何效果(除了产生更多的调用
to stream_get_contents()
)。它会在返回任何东西之前等待约 5 秒。 stream_set_read_buffer
没有效果(在 PHP 5.3.5 服务器上测试)