找回密码
 立即注册
搜索
查看: 896|回复: 1

[基础语法] EventSource的php与前端事件推送

[复制链接]

581

主题

110

回帖

4066

积分

管理员

积分
4066

众神之神

发表于 2023-11-1 20:10:18 | 显示全部楼层 |阅读模式
EventSource
EventSource 是服务器推送的一个网络事件接口。一个 EventSource 实例会对 HTTP 服务开启一个持久化的连接,以text/event-stream 格式发送事件,会一直保持开启直到被要求关闭。
一旦连接开启,来自服务端传入的消息会以事件的形式分发至你代码中。如果接收消息中有一个事件字段,触发的事件与事件字段的值相同。如果没有事件字段存在,则将触发通用事件。
与 WebSockets,不同的是,服务端推送是单向的。数据信息被单向从服务端到客户端分发。当不需要以消息形式将数据从客户端发送到服务器时,这使它们成为绝佳的选择。例如,对于处理社交媒体状态更新,新闻提要或将数据传递到客户端存储机制(如 IndexedDB 或 Web 存储)之类的,EventSource 无疑是一个有效方案。
php代码(服务端)
主要借鉴下面两个文章
创建文件message.php
  1. <?php
  2. header("Access-Control-Allow-Origin:*");
  3. header('X-Accel-Buffering: no');
  4. header('Content-Type: text/event-stream');
  5. header('Cache-Control: no-cache');
  6. ob_end_clean();
  7. ob_implicit_flush(1);

  8. while(1) {
  9.     $data = [
  10.         "id" => time(),
  11.         "message" => '欢迎来到helloweba,现在是北京时间'.date('Y-m-d H:i:s')
  12.     ];
  13.     $xh = $xh + 1;
  14.     returnEventData($data,"message",$xh);
  15.     sleep(2);
  16. }

  17. function returnEventData($returnData, $event='message', $id=0, $retry=0) {
  18.     $str = '';
  19.     if($id>0) {
  20.         $str .= "id: {$id}".PHP_EOL;
  21.     }
  22.     if($event) {
  23.         $str.= "event: {$event}".PHP_EOL;
  24.     }
  25.     if($retry>0) {
  26.         $str .= "retry: {$retry}".PHP_EOL;
  27.     }
  28.     if(is_array($returnData)) {
  29.         $returnData = json_encode($returnData);
  30.     }
  31.     $str .= "data: {$returnData}".PHP_EOL;
  32.     $str .= PHP_EOL;
  33.     echo $str;
  34. }
  35. ?>
复制代码
前端js代码
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.         <meta charset="utf-8">
  5.         <meta name="viewport" content="width=device-width, initial-scale=1">
  6.         <title>EventSource测试</title>
  7. </head>
  8. <body>
  9.         <div>EventSource测试</div>
  10.         <ul></ul>
  11.         <script>
  12.                 console.log("1111")
  13.                 //这里填写要链接的地址
  14.                 var evtSource = new EventSource('message.php');
  15.                 evtSource.addEventListener('message',function(evt){
  16.                         // console.log(evt)
  17.                         document.querySelector("ul").innerHTML+=("<li>"+JSON.parse(evt.data).message+"</li>")
  18.                 })
  19.                 // evtSource.onmessage=(evt)=>{
  20.                 //         console.log(evt.data)
  21.                 //         document.querySelector("ul").innerHTML+=("<li>"+JSON.parse(evt.data).message+"</li>")
  22.                 //         //console.log(e.data)
  23.                 // }
  24.         </script>
  25. </body>
  26. </html>
复制代码



581

主题

110

回帖

4066

积分

管理员

积分
4066

众神之神

 楼主| 发表于 2023-11-1 20:10:47 | 显示全部楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|十三博客 ( 鲁ICP备2023000528号 )

GMT+8, 2026-6-1 18:39 , Processed in 0.049707 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表