使用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秒刷新一次,这个套餐在哪里?

任何帮助表示赞赏。

+0

您的查询看起来像它会从交易表中获取所有行。但你只有每一个从结果集中获取一行??????这可能总是相同的行,但不一定是第一个或最后一个输入到表 – RiggsFolly

+0

基于这段代码,你可能需要在每次检索值时存储最新的id,并检查id是 Naruto

+0

您的服务器PHP代码应该在一个循环。循环应该以某种方式检查新条目,并且只在发现新条目时才发送。它是通过连续循环提供_Message Pump_的服务器。 JavaScript只是对来自服务器PHP代码 – RiggsFolly

你缺少服务器端的几件事情,使这项工作。

首先,正如@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); 
} 
+0

是的,那更像是它 – RiggsFolly

+0

感谢这个详细的答案@marekful,我很感激。但是,当我使用您提供的代码时,我在屏幕上看不到任何数据,只是一个白页。你有什么建议可以解决这个问题吗?如果这有什么区别,我数据库中的'TimeStamp'格式为'YYYY-MM-DD H:i:s'。 – TheOrdinaryGeek

+0

另外,我不需要在查询中将“绑定”到占位符“?”?谢谢 – TheOrdinaryGeek

  1. 我怎么能刷新插入新的交易,只有当活饲料?

    我不清楚这个问题。

    transactions.php总是返回事务表的最后一条记录。

    如果你想从交易表中显示新插入的记录,您必须验证添加到您的脚本,客户端或服务器端

    下面是检查查询事务表修改?

    SELECT update_time FROM information_schema.tables WHERE table_schema='mydb' AND table_name='mytable' and update_time = 'your validation time'; 
    
  2. 现场直播目前刷新每3秒左右,这是哪里设置?

    通常,浏览器在连接关闭时自动重新连接到事件源,但可以从客户端或服务器取消该行为。 要取消来自客户端的数据流,只需拨打:source.close();