在标题之后启动PHP脚本,但在收到正文之前

时间:2012-04-23 09:24:13

标签: php apache stream

使用PHP和Apache,是否可以在收到标题后但在发送正文之前启动PHP脚本?

我的意思是:

PUT /sync/testStream.php HTTP/1.1
Host: localhost
User-Agent: test
Content-Length: 500
Content-Type: text/plain

<start the script here>

hello
this is a test

目标是在脚本期间(实际上传期间)锁定文件。

我尝试从php://输入读取,但没有成功:脚本仅在收到整个主体时启动。

这是我的剧本:

<?php
echo "Hello. Start sending data.";
ob_flush();

$file = fopen('php://input', 'r');
if ($file === false) {
    die("Could not open php://input");
}

while (($line = fgets($file)) !== false) {
    echo $line;
}

echo "Bye";

欢迎任何提示!

3 个答案:

答案 0 :(得分:1)

我之前在这里看过这个问题(现在找不到,但我有)经过多次讨论/辩论后,结论是不,你不能。

这是因为文件上载过程和请求正文的接收由上层Web服务器处理,并且在完全接收/解析/验证请求之后才会启动PHP。

这里有一点是您的脚本似乎试图通过HTTP建立全双工通信,这是不可能的。 HTTP本身就是一种半双工协议 - 它有一个请求 - 响应架构,你无法在完全收到请求之前开始发送响应,这将是一个协议违规。

如果你准确地解释了你想要做什么/为什么你想在上传过程中锁定文件,也许我们可以找到另一种解决方案。

答案 1 :(得分:0)

实际上,这是不可能的,因为PHP在HTTP请求完成之前不知道任何请求。换句话说,PHP在上传完成后收到查询。

答案 2 :(得分:0)

PHP在整个请求后执行。 要实现此功能,您可以编写自定义apache模块。