使用PHP和MySQL的服务器端事件
我正在使用PHP和MySQL构建一个(非常基本的)应用程序。此应用程序的目的是在网页上显示“实时”数据交易。这些事务来自MySQL数据库中的transactions
表。使用PHP和MySQL的服务器端事件
到目前为止,我可以检索和网页上显示的数据。不过我期待看到的数据只刷新当新的交易被插入到transactions
表?
当前活动馈送显示最后一条记录,直到插入新的事务,此循环。
我的代码到目前为止;
transactions.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>HTML5 Server-Sent Events</title>
<script type="text/javascript">
window.onload = function(){
var source = new EventSource("transactions.php");
source.onmessage = function(event){
document.getElementById("result").innerHTML += "New transaction: " + event.data + "<br>";
};
};
</script>
</head>
<body>
<div id="result">
<!--Server response will be inserted here-->
</div>
</body>
</html>
transactions.php
<?php
include 'conn.php'; // database connection
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
$query = "SELECT TimeStamp, CardNo FROM transactions ORDER BY TimeStamp DESC LIMIT 1";
// `TimeStamp` is in the format YYYY-MM-DD H:i:s
if ($result = $conn->query($query)) {
$row = $result->fetch_assoc();
echo "data: " . $row['CardNo'] . "\n\n";
}
flush();
?>
我一直在关注this tutorial如果有什么差别。
我的问题;
- 如何仅在插入新交易时刷新实时供稿?
- 活动饲料目前每3秒刷新一次,这个套餐在哪里?
任何帮助表示赞赏。
你缺少服务器端的几件事情,使这项工作。
首先,正如@RiggsFilly指出的那样,您需要在语句中使用WHERE子句。条件应该是查找比上次发送的更新的的交易。
对于这一点,你需要保持跟踪的最后发送消息的时间戳的。
如果现在使用条件的查询返回结果,则服务器应只发送消息。
最后,检查新事务并发送消息的整个例程必须保持循环。
<?php
include 'conn.php'; // database connection
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
$query = "SELECT TimeStamp, CardNo FROM transactions WHERE TimeStamp > ?";
$stmt = $conn->prepare($query);
$ts = time();
while(true)
{
if ($result = $stmt->execute([$ts])) {
$row = $result->fetch_assoc();
echo "data: " . $row['CardNo'] . "\n\n";
$ts = $row['TimeStamp'];
flush();
}
sleep(2);
}
是的,那更像是它 – RiggsFolly
感谢这个详细的答案@marekful,我很感激。但是,当我使用您提供的代码时,我在屏幕上看不到任何数据,只是一个白页。你有什么建议可以解决这个问题吗?如果这有什么区别,我数据库中的'TimeStamp'格式为'YYYY-MM-DD H:i:s'。 – TheOrdinaryGeek
另外,我不需要在查询中将“绑定”到占位符“?”?谢谢 – TheOrdinaryGeek
-
我怎么能刷新插入新的交易,只有当活饲料?
我不清楚这个问题。
transactions.php总是返回事务表的最后一条记录。
如果你想从交易表中显示新插入的记录,您必须验证添加到您的脚本,客户端或服务器端
下面是检查查询事务表修改?
SELECT update_time FROM information_schema.tables WHERE table_schema='mydb' AND table_name='mytable' and update_time = 'your validation time';
-
现场直播目前刷新每3秒左右,这是哪里设置?
通常,浏览器在连接关闭时自动重新连接到事件源,但可以从客户端或服务器取消该行为。 要取消来自客户端的数据流,只需拨打:
source.close();
您的查询看起来像它会从交易表中获取所有行。但你只有每一个从结果集中获取一行??????这可能总是相同的行,但不一定是第一个或最后一个输入到表 – RiggsFolly
基于这段代码,你可能需要在每次检索值时存储最新的id,并检查id是 Naruto
您的服务器PHP代码应该在一个循环。循环应该以某种方式检查新条目,并且只在发现新条目时才发送。它是通过连续循环提供_Message Pump_的服务器。 JavaScript只是对来自服务器PHP代码 – RiggsFolly