php ajax轮询 session文件锁_ajax长轮询时php被阻塞

刚接触实时通讯这块,知道用websocket更高效,但我想了解轮询的实现过程,循序渐进

短轮询用定时器setInterval已经实现了,但长轮询时后台进入死循环模块导致整个网站的php网页无响应,比如刷新页面、提交消息都没法进行。具体代码如下:

chat.php:

style="width: 570px;height: 120px;margin: 5px;resize: none">

发送

chat.js:

//拉取新消息

var setting = {

type: "POST",

dataType: "html",

url: "./util/action.php?action=message_pull",

data: {uid_get: $('#chat_content').attr('uid')},//传递目标用户uid

success: function (msg) {

if (msg.length > 0) {

$('.chat_content_list_table').append(msg);//追加消息列表

}

$.ajax(setting);//立即继续请求

}

};

$.ajax(setting);

action.php中的对应函数:

function message_pull($conn)

{

session_start();

session_write_close();//关闭session锁并没有效果,仍被阻塞

$uid_post = $_SESSION['userinfo'][0]['id'];//发送者,即当前登录用户uid

$uid_get = $_POST['uid_get'];//消息目标用户uid

$message_list = '';

//建立长连接,直到拉取到新消息后断开连接

while (true) {

//查询新消息

foreach (select($conn, 'message', "(uid_get=$uid_post AND uid_post=$uid_get AND read_flag<>1)") as $message) {

update($conn, 'message', 'read_flag=1', "id={$message['id']}");//每读取一条则将其置为已读状态

$message_list .= "

" . $message['content'] . "" . $message['post_time'] . "";

}

if (strlen($message_list) > 0) {

echo $message_list;//输出新消息

break;//断开连接

}else

sleep(1);//挂起1s后继续查询

}

mysqli_close($conn);

}

之后测试一下,发现一旦php后台进入while循环,就会导致被阻塞,但我看到网上很多demo都这样写,于是感觉很疑惑,谢谢大大们指教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值