日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php长轮询阻塞,ajax长轮询时php被阻塞

發布時間:2023/12/10 php 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php长轮询阻塞,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都這樣寫,于是感覺很疑惑,謝謝大大們指教

總結

以上是生活随笔為你收集整理的php长轮询阻塞,ajax长轮询时php被阻塞的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。