您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“異步請求PHP服務器,不返回數(shù)據(jù)怎么辦”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“異步請求PHP服務器,不返回數(shù)據(jù)怎么辦”吧!
最近發(fā)現(xiàn)了一個ajax
異步請求的問題,用$.post
、$.get
、$.ajax
請求PHP服務器時,總是無法異步返回數(shù)據(jù)。
經(jīng)多次測試才發(fā)現(xiàn):
– 不同瀏覽器,請求不同域名-不阻塞:無需實驗
– 不同瀏覽器,請求同域名-不阻塞:session_id()
返回不同
– 同一瀏覽器,請求不同域名-不阻塞:session_id
返回不同
– 同一瀏覽器,請求同域名-阻塞:session_id()
返回相同
發(fā)現(xiàn)問題所在:
1 關閉XDEBUG
2 SESSION
鎖
3 清除輸出緩沖區(qū)
1 關閉XDEBUG
XDEBUG
是實時調試。調試時,它將保持FPM
以確保線程正在工作以避免數(shù)據(jù)污染。
典型的測試方法是,使用XDEBUG
進行調試時,打開另一個瀏覽器并訪問該站點,該站點這個時候是無法訪問的。
這對并行響應有重大影響,即,即使前端發(fā)送多個請求,它也受XDEBUG
控制,并且只能同時響應一個。
另外,由于XDEBUG
依賴于SESSION
,因此即使您使用session_write_close()
,也要關閉會話鎖(請參見下文)。XDEBUG
仍會自動打開。
2 SESSION
鎖
用 session_write_close()
關閉SESSION
的寫鎖,這適合SESSION
保存為File
的情況。如果SESSION
保存在Redis
,則不需要。
3 清除輸出緩沖區(qū)
使用session_write_close()
可能無法立即關閉SESSION
鎖,所以在這個方法之前加上:ob_end_flush()
。讓 session_write_close()
馬上生效。
4 示例
有如下一個范例,當點擊【提交】按鈕時,前端會給后臺服務器發(fā)送兩種請求。
一種是get
請求,每隔1秒請求一次。
一種是post
請求,最開始的時候發(fā)送一次,然后等待相應結束。
看看HTML代碼
<form> <input type="submit" value="提交" /> </form> <script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> <script type="text/javascript"> $('form').on('submit', function(e) { e.preventDefault(); // 每隔一秒請求一次服務器 var id = setInterval(function() { $.get( 'save.php?action=get', {}, function(data) { console.log(data); }, 'json' ); }, 1000); $.post( 'save.php?action=post', {}, function(data) { console.log(data); // 停止定時循環(huán) clearInterval(id); }, 'json' ); }); </script>
php代碼
<?php session_start();$action = $_GET['action']; if ($action == 'post') { $_SESSION['time'] = 0; session_write_close(); while ($_SESSION['time'] < 5) { session_start(); $_SESSION['time'] = $_SESSION['time'] + 1; // 將SESSION數(shù)據(jù)寫入文件中,并關閉寫鎖 session_write_close(); // sleep()模擬花費時間較長的程序,這樣在關閉寫鎖之后, // 服務器就能夠相應別的請求,如下的$action=get, sleep(1); } echo json_encode([session_id() => $_SESSION['time']]); exit();}if ($action == 'get') { echo json_encode([session_id() => $_SESSION['time']]); exit();}
到此,相信大家對“異步請求PHP服務器,不返回數(shù)據(jù)怎么辦”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。