PHP-在 PHP 中如何实现 long polling 式的消息传输模式?

PHP-在 PHP 中如何实现 long polling 式的消息传输模式?

瑾兮 发布于 2017-10-15 字数 0 浏览 1220 回复 3

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夜无邪 2017-11-10 3 楼

参考项目:phpdaemon

晚风撩人 2017-11-03 2 楼

<?php
header("Expires: Sun, 19 Nov 1978 05:00:00 GMT");
header("Last-Modified: ". gmdate("D, d M Y H:i:s") ." GMT");
header("Cache-Control: store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", FALSE);
//在$timeout之后,关闭连接,并且要求客户3秒后重新请求
for ($i = 0, $timeout = 60; $i < $timeout; $i++ ) {
$msg = get_msg();
if ($msg) {
echo json_encode(array('t' => 'info' , 'c' => $msg));
flush();
exit(0);
}
usleep(3000000);
}
echo json_encode(array('t' => 'refresh', 'c' => 3000));
flush();
?>

来源地址:http://happy90.iteye.com/blog/998767

灵芸 2017-11-01 1 楼

Nginx的HTTP push模块可以实现长Polling。利用PHP管理频道的订阅和发布消息,这样就可以非常方便的实现聊天、即时信息等传递到客户端,并且不会增加PHP的进程数量。

下载nginx http push module源代码,降压到/var/tmp中
下来nginx的src.rpm包,安装后修改spec文件中的configure指令,增加:

--add-module=/var/tmp/nginx_http_push_module

rpmbuild nginx包,并安装
配置nginx:

location /polling/ {

proxy_pass http://127.0.0.1:8080;

}

location /polling/sub/ {
internal;
set $push_channel_id $arg_id;
push_subscriber;
push_subscriber_concurrency broadcast;
push_channel_group broadcast;
}

location /polling/pub/ {

allow 127.0.0.1;

deny all;
set $push_channel_id $arg_id;
push_publisher;
push_min_message_buffer_length 5;
push_max_message_buffer_length 20;
push_message_timeout 2m;
push_channel_group broadcast;
}

5. PHP部分

 在PHP中处理/polling/请求的GET和POST方法。

5.1 处理GET的时候判断客户的Cookie,如果已经有权限,则:

header("X-Accel-Redirect: /polling/sub/?".$_SERVER['QUERY_STRING']);

否则就去鉴权用户。

5.2 处理POST的时候判断客户是否有POST权限,如果有则发起HTTP POST调用,将数据完全转发给:

http://127.0.0.1/polling/pub/?$_SERVER['QUERY_STRING']