【发布时间】:2014-09-23 10:37:59
【问题描述】:
我有一个运行很长时间的 PHP 脚本(最多 5 分钟)。我想在每一步之后通知用户(“完成 10 项任务中的第 1 项”)。
我知道,这是一个老问题,我尝试通过服务器端事件来解决它。
在 HTML 端有一个表单,其中包含我的 PHP 脚本作为操作:
<form action="my_script.php"><input type="submit" value="Submit!"/></form>
一个要求是,hole HTML 页面可以在没有任何脚本的情况下工作(并通过提交表单调用 my_script.php)。 PHP 脚本中的“实时状态报告”旨在成为一项附加功能,但如果没有它,页面应该可以完全正常工作。
这就是我尝试这样做的方式:在客户端,我向调用 JavaScript 函数的 form 标记添加了一个 onsubmit() 事件:
var source = new EventSource("my_script.php");
source.onmessage = function(event)
{
// display data in a div
};
在服务器端,PHP 应该向调用的 HTML 页面发送一些消息(在执行其任务时),并且在所有任务完成后构建一个包含所有输出的新 HTML 页面。 我试着这样做:
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$output_stream = '';
// do something here. If a taks is done call send_to_output('something done');
function send_to_output($message)
{
global $output_stream;
echo "data: {$message}\n\n";
flush();
$output_stream .= $message;
}
header('Content-Type: text/html');
header('Cache-Control: no-cache');
echo "Everything is finished";
echo $output_stream;
但这不起作用。
经过一番测试,我认为有两个问题:
- 浏览器无法处理标题“Content-Type: text/event-stream”并提供下载文件。
- 表单操作 (
<form action="my_script.php">) 和 JavaScript 事件 (var source = new EventSource("my_script.php");) 似乎都打开了自己的 PHP 脚本线程,因此该脚本有 两个 实例运行服务器。
我该如何解决这些问题?
【问题讨论】:
-
如果这只是一个常规的表单提交,它在处理过程中不会在浏览器中停止执行吗?
-
为什么要发明自己的自行车?我想要类似 sockets.io 的东西
-
请确认如果客户端不支持javascript会发生什么
-
@adeneo:我不明白你的意思。我的问题是:脚本执行良好,但仅在完全完成后才打印文本。我希望用户在脚本仍在运行时看到消息。
-
@user574632:如果客户端不支持 JavaScript,用户单击“提交”,PHP 脚本会运行并在几分钟后显示其结果。不显示任何状态消息。这已经奏效了。所以,这里没问题。
标签: javascript php html server-sent-events