gpt4 book ai didi

php - 如何通过触发器使用服务器发送的事件?

转载 作者:行者123 更新时间:2023-11-29 10:38:34 26 4
gpt4 key购买 nike

我正在考虑迁移我的通知系统,该系统使用 ajax 池来以类似于以下方式的服务器发送事件:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$sql = "SELECT name,body FROM notification where id='user1'";
...
echo 'data: ' . json_encode($arrayResult) . "\n\n";
$conn->close();
flush();
?>

我的问题是,这似乎不断地对数据库进行查询(以类似于 ajax 池的方式),这似乎会变得相当密集。

您建议对服务器端代码进行哪些更改,以便它不会不断地汇集数据库,而是仅在插入通知后才查询数据库?

最佳答案

默认情况下,浏览器将在 3 秒后重新打开连接,您的脚本将再次运行并查询数据库。我看到的另一个问题是,即使自上次检查以来没有新的通知,您的 sql 查询也将始终返回结果。更好的查询将仅选择最近的通知。您有三个简单的选择

设置重试参数

通过在第一条消息中向浏览器发送一个重试值,您可以控制浏览器等待重新打开连接的时间:

echo "retry: 60000\n"; // reopen the connection in 60 seconds
echo 'data: ' . json_encode($arrayResult) . "\n\n";

使用带有暂停的无限循环

您可以在循环中执行数据库检查,其频率由您控制,而不是让脚本快速执行到最后并让浏览器在 3 秒后重新打开连接

set_time_limit(0); // remove any time limit to script execution

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header("Connection: keep-alive");

while(true){
$sql = 'SELECT...'; // alter your query to only fetch recent notifications
// fetch results and put in $arrayResult
if(!empty($arrayResult)) echo 'data: ' . json_encode($arrayResult) . "\n\n";
ob_flush(); flush();
sleep(60); // sleep for 60 seconds
}

使用内存缓存

内存缓存可以在一个脚本执行中存储通知,并在另一个脚本执行中检索它们。所以你的脚本会:

  • 检查缓存中是否有属于当前用户的通知
  • 如果找到,则回显通知并将其从缓存中删除(或设置 SENT 标志)
  • 否则 sleep ,然后循环

我用过memcache但还有其他的。这确实需要您在网络服务器上安装新软件,但这可能就是我会做的。

关于php - 如何通过触发器使用服务器发送的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45963575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com