在页面完成 PHP 处理之前捕获上传文件的时刻


Capture the moment of an uploaded file before the page finished processing in PHP?

我正在通过 iframe 包装器中的 POST 上传一些文件,这些文件可能需要异常

的时间来处理。

在我输出结果以由 iframe 的 onload 事件捕获之前,我想以某种方式让用户知道上传已完成,现在处理已经开始。

否则,用户可能会因长时间等待而感到困惑。

我想显示一条初始消息,然后在完成后添加另一行,然后在 iframe 中比较输出页面的内容。但由于某种原因,这种方法永远行不通。

例:

print 'processing started';
for ($i=0; $i < 10; $i++) { 
    echo '...still processing';
    sleep(1);
}
echo 'done';
(期望看到"处理已开始"消息,并在

完成加载后看到"完成"消息,但它只是在等待 10 秒后一次性将其吐出)。

所以我想知道如何做到这一点?

我的另一个想法是在页面开头设置重定向标头,因此一旦文件上传,它就会重定向到其他页面,在那里进行处理。然后尝试捕获重定向和最终响应。

但这是一种奇怪的方式,它还需要传递提交的参数并将上传的文件从临时文件夹中移动到某个地方,因此一旦输出 php 脚本,它们就不会被删除。

。所以我想知道是否有更好的方法来做我想做的事情?

当文件完成上传时,你的PHP将被调用,以便你可以(a)将文件放在你想要的地方,(b)向浏览器发出一些HTML作为响应,(c)在你的情况下,开始处理。

所以我要做的是保存文件,然后在服务器上作为后台作业开始处理(使用命令行运行单独的 PHP 脚本,PHP通过 exec 等系统调用之一启动)。给作业一个唯一的ID,你可以(a)创建一个根据ID命名的临时文件,(b)传递给HTML中某处的浏览器,我们可以查询该文件是否仍然存在;(c) 作业完成后,它会删除该文件,因此我们知道它已完成。

现在响应上传的HTML页面可以说"完成上传,处理开始",然后运行一些Javascript来轮询服务器(使用Ajax - 在jQuery中很容易,直接使用XMLHttpRequest不太难)询问作业是否已完成(通过轮询请求URL中的查询字符串识别作业)。服务器上的轮询脚本会查看相关文件是否仍然存在,如果是,则相应地说"否,仍在工作"或"是,已完成"。

如果有办法让作业告诉它有多远,例如,如果您正在按顺序处理上传的文件,您可以让作业定期将进度百分比写入文件并返回以响应轮询,并在客户端将其显示为进度条。