当前位置: 首页 > 工具软件 > PHP SSE > 使用案例 >

sse php,sse.php · Gitee 极速下载/modphp - Gitee.com

宇文修筠
2023-12-01

/**

* 本程序用来实现 Server-Sent Events (服务器推送)功能。

* 要在 IE8+/Edge 浏览器中使用这项技术,你需要在页面中引入 Yaffle/EventSource 项目

* 源码地址:https://github.com/Yaffle/EventSource

* 你需要在 URL 查询参数中设置 obj={module}&act={method},来调用 ModPHP 的功能,

* 同时还可以提供一个 sleep={seconds} 参数来设置程序的休眠时间,默认为 3。

*/

include 'mod.php'; //引入 ModPHP 程序入口

// 设置头部信息

header("Content-Type: text/event-stream");

header("Cache-Control: no-cache");

header("Access-Control-Allow-Origin: *"); //允许跨域访问,要在 IE8/IE9 中使用 SSE,必须允许跨域

//Yaffle/EventSource 设置,上一次事件 ID

$lastEventId = floatval(isset($_SERVER["HTTP_LAST_EVENT_ID"]) ? $_SERVER["HTTP_LAST_EVENT_ID"] : 0);

if($lastEventId == 0){

$lastEventId = floatval(isset($_GET["lastEventId"]) ? $_GET["lastEventId"] : 0);

}

$obj = isset($_GET['obj']) ? strtolower($_GET['obj']) : ''; //对象

$act = isset($_GET['act']) ? $_GET['act'] : ''; //操作

$sleep = !empty($_GET['sleep']) ? (int)$_GET['sleep'] : 3; //休眠时间

//判断请求是否合法

if(!$obj || !$act || ($obj != 'mod' && !is_subclass_of($obj, 'mod')) || (!method_exists($obj, $act) && !is_callable(hooks($obj.'.'.$act))) || in_array($obj.'::'.strtolower($act), ${'DENIES'.INIT_TIME})){

report_403(lang('mod.permissionDenied')); //请求不合法则报告 403 错误

exit();

}

do_hooks('mod.client.call.sse'); //执行挂钩回调函数

echo ":" . str_repeat(" ", 2048) . "\n"; // 2 KB padding for IE

echo "retry: 2000\n";

//事件流

$id = $lastEventId;

$max = $i + 100; //最多执行 100 次后要求客户端重新连接

while (++$id < $max && !connection_aborted()) {

$result = $obj::$act($_GET);

echo "id: " . $id . "\n";

echo "data: " . json_encode($result) . "\n\n"; //输出消息到客户端

error(null); //重置 ModPHP 错误信息

@ob_flush();

flush(); //将内容刷出到客户端

sleep($sleep); //暂停程序

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

 类似资料: