1

使用 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://input 读取,但没有成功:脚本仅在收到整个正文时启动。

这是我的脚本:

<?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";

欢迎任何提示!

4

3 回答 3

1

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

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

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

如果您准确解释您要做什么/为什么要在上传期间锁定文件,也许我们可以找到替代解决方案。

于 2012-04-23T09:31:22.273 回答
0

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

于 2012-04-23T09:31:20.257 回答
0

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

于 2012-04-23T09:31:21.367 回答