溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

異步請求PHP服務器,不返回數據怎么辦

發布時間:2022-01-24 09:17:45 來源:億速云 閱讀:209 作者:iii 欄目:編程語言

本篇內容主要講解“異步請求PHP服務器,不返回數據怎么辦”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“異步請求PHP服務器,不返回數據怎么辦”吧!

                           

最近發現了一個ajax異步請求的問題,用$.post、$.get、$.ajax請求PHP服務器時,總是無法異步返回數據。

經多次測試才發現:
– 不同瀏覽器,請求不同域名-不阻塞:無需實驗
– 不同瀏覽器,請求同域名-不阻塞:session_id()返回不同
– 同一瀏覽器,請求不同域名-不阻塞:session_id返回不同
– 同一瀏覽器,請求同域名-阻塞:session_id()返回相同

發現問題所在:
1 關閉XDEBUG
2 SESSION
3 清除輸出緩沖區

1 關閉XDEBUG
XDEBUG是實時調試。調試時,它將保持FPM以確保線程正在工作以避免數據污染。
典型的測試方法是,使用XDEBUG進行調試時,打開另一個瀏覽器并訪問該站點,該站點這個時候是無法訪問的。

這對并行響應有重大影響,即,即使前端發送多個請求,它也受XDEBUG控制,并且只能同時響應一個。
另外,由于XDEBUG依賴于SESSION,因此即使您使用session_write_close(),也要關閉會話鎖(請參見下文)。XDEBUG仍會自動打開。

2 SESSION
session_write_close() 關閉SESSION的寫鎖,這適合SESSION保存為File的情況。如果SESSION保存在Redis,則不需要。

3 清除輸出緩沖區
使用session_write_close()可能無法立即關閉SESSION鎖,所以在這個方法之前加上:ob_end_flush()。讓 session_write_close() 馬上生效。

4 示例
有如下一個范例,當點擊【提交】按鈕時,前端會給后臺服務器發送兩種請求。
一種是get請求,每隔1秒請求一次。
一種是post請求,最開始的時候發送一次,然后等待相應結束。

看看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);
                // 停止定時循環
                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數據寫入文件中,并關閉寫鎖
      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服務器,不返回數據怎么辦”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女