【发布时间】:2012-10-06 18:52:03
【问题描述】:
我开始使用 JavaScript EventSource 对象在 HTML5 中使用 push。我对 PHP 中的工作解决方案非常满意:
$time = 0;
while(true) {
if(connection_status() != CONNECTION_NORMAL) {
mysql_close()
break;
}
$result = mysql_query("SELECT `id` FROM `table` WHERE UNIX_TIMESTAMP(`lastUpdate`) > '".$time."'");
while($row = mysql_fetch_array($result)) {
echo "data:".$row["id"].PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
$time = time();
sleep(1);
}
但突然间,我的 WebApp 因 MySQL 错误“连接过多”而无法访问。
原来在JavaScript中关闭事件源后MySQL连接没有关闭:
window.onload = function() {
sse = new EventSource("push.php");
sse.onmessage = function(event) {
console.log(event.data.split(":")[1]);
}
}
window.onbeforeunload = function() {
sse.close();
}
所以我猜PHP脚本不会停止执行。在客户端连接断开之前,有什么方法可以调用函数(如die();)?为什么我的脚本在 EventSource 上调用 .close(); 后没有终止?!
感谢您的帮助! ——
【问题讨论】:
-
似乎每个客户端会话都使用自己的mysql连接启动一个新的服务器端无限循环,不是吗?我看不到您发布的示例中的连接开始,所以我不确定。无论如何,这就是出现“连接太多”错误的原因。提供数据的服务器端服务可以使用(共享)单个数据库连接(也可以使用单个无限循环)。我没有将此作为答案发布,因为我手头没有示例。自从几年以来一直没有使用PHP。虽然我在 php.net 上看到 mysql_query 有点过时了。他们建议改用 MySQLi 或 PDO_MySQL。
-
那种。每个客户端会话都有自己的 mysql 连接。连接在无限循环之前开始。 真正的问题是,调用
EventSource.close()不会关闭或中止连接本身! -
据我了解,通过 push.php 提供的内容对于每个客户端都是相同的,不是吗?为什么然后连接到数据库并在每个客户端会话中进行查询,而不是在所有客户端会话之间共享相同的 SQL 结果?尽管它是更优化的解决方案,但它也可以解决您的问题。
-
听起来我应该尝试一下...当另一个客户端更改数据库时,我需要我的脚本将信息推送到客户端。如何在不为每个客户端建立数据库连接的情况下将结果共享给所有客户端?!我需要立即推送信息。
-
如果没有进一步的研究,我不知道确切的答案。我几年前使用过 PHP。但是尝试搜索诸如“应用程序范围”、“有状态服务”和“cron 作业”之类的内容,并添加关键字 PHP。也许你可以把一些东西粘在一起。
标签: php javascript html server-sent-events