我目前正在进行一个大型项目,需要实现服务器发送事件。我决定使用事件源传输来完成,从简单的聊天开始。目前客户端只监听新聊天消息事件,但未来该项目将有大量其他事件。首先,我非常关注服务器端脚本和其中的循环,其次,我不确定在此情况下是否实际上使用MySQL数据库作为存储(例如,用于聊天消息)是一个好的做法。当前循环根据出现在数据库中的新消息提供新消息:
$statement = $connect->prepare("SELECT id, event, user, message FROM chat WHERE id > :last_event_id");
while(TRUE) {
try {
$statement->execute(array(':last_event_id' => $lastEventId));
$result = $statement->fetchAll();
foreach($result as $row) {
echo "id: " . $row['id'] . "\n";
echo "event: " . $row['event'] . "\n";
echo "data: |" . $row['user'] . "| >>> \n";
echo "data: " . $row['message'] . "\n\n";
$lastEventId++;
}
} catch(PDOException $PDOEX) {
echo $PDOEX->getMessage();
}
ob_flush();
flush();
usleep(10000);
}
据我所了解,这种循环是不可避免的,我的任务是优化它的性能。目前,我在
while()
之外使用准备好的语句和合理的usleep()
。
因此,对于那些有服务器端事件经验的人,有以下问题:
- 在中等负载的网站(在线1000-5000用户)中使用这种技术是否合理?
- 如果是,有什么方法可以提高性能?
- MySQL数据库在这种情况下可能成为瓶颈吗?
非常感谢任何帮助,因为这个问题相当复杂,搜索信息也无法给我任何提示或测试方法。
max_execution_time
时,事件源会打开新连接,每30秒钟一次。我认为事件源的特性是它建立了保持活动连接并刷新服务器回显的所有内容,或者我错了吗?网络显示每30秒钟有一个请求。 - Damaged OrganicMEMORY
的mySQL数据库表 - 所有这些都应通过event-source
传递给客户端。这是目前对我来说的答案。谢谢!:) - Damaged Organic