データを返さないPHPサーバーへの非同期リクエスト? (解決策を添付します)

藏色散人
リリース: 2023-04-10 21:34:02
転載
4863 人が閲覧しました

最近 ajax の非同期リクエストの問題を発見しました。$.post$.get$.ajax を使用してください。 PHP サーバーにリクエストを行う場合、データを非同期で返すことはできません。

多くのテストの結果、次のことがわかりました:
– 異なるブラウザー、異なるドメイン名をリクエスト - ブロックなし: 実験の必要なし
– 異なるブラウザー、同じものをリクエストドメイン名 - 非ブロッキング: session_id() 異なる
を返します – 同じブラウザが異なるドメイン名を要求します - 非ブロッキング: session_id 異なる
を返します – 同じブラウザ同じドメイン名を要求します - ブロッキング: session_id() 同じ

を返します 問題が見つかりました:
1 閉じる XDEBUG
2 SESSION Lock
3 出力バッファをクリアします

1 CloseXDEBUG
XDEBUG はリアルタイムデバッグ。デバッグ中は、データ汚染を避けるためにスレッドが確実に動作していることを確認するために、FPM を維持します。
典型的なテスト方法は、XDEBUG を使用してデバッグするときに、別のブラウザを開いてサイトにアクセスすることです。現在、サイトにはアクセスできません。

これは並列応答に大きな影響を与えます。つまり、フロントエンドが複数のリクエストを送信したとしても、XDEBUG によって制御され、一度に 1 つしか応答できません。
また、以降XDEBUG は引き続き自動的に開きます。 2 SESSIONLock

session_write_close() を使用して、SESSION の書き込みロックを閉じます。
SESSION に適したファイルは File として保存されます。 SESSIONRedis に保存されている場合は必要ありません。 3 出力バッファをクリアします

session_write_close()

を使用しても、SESSION ロックがすぐに閉じない可能性があるため、このメソッドの前に追加します。 :
ob_end_flush()session_write_close() をすぐに有効にします。 4 例以下に例を示しますが、[送信]ボタンをクリックすると、フロントエンドからバックエンドサーバーに2つのリクエストが送信されます。

1 つは

get リクエストで、1 秒ごとにリクエストされます。 1 つは
post
リクエストで、最初に 1 回送信され、その後、対応する終了を待ちます。 HTML コードを見てください

<form>
<input type="submit" value="提交" />
</form>

<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>

<script type="text/javascript">
    $(&#39;form&#39;).on(&#39;submit&#39;, function(e) {
        e.preventDefault();

        // 每隔一秒请求一次服务器
        var id = setInterval(function() {
            $.get(
                &#39;save.php?action=get&#39;,
                {},
                function(data) {
                    console.log(data);
                },
                &#39;json&#39;
            );
        }, 1000);

        $.post(
            &#39;save.php?action=post&#39;,
            {},
            function(data) {
                console.log(data);
                // 停止定时循环
                clearInterval(id);
            },
            &#39;json&#39;
        );
    });
</script>
ログイン後にコピー
php コード
<?php
session_start();$action = $_GET[&#39;action&#39;];
if ($action == &#39;post&#39;) {

   $_SESSION[&#39;time&#39;] = 0;
   session_write_close();

    while ($_SESSION[&#39;time&#39;] < 5) {
      session_start();
      $_SESSION[&#39;time&#39;] = $_SESSION[&#39;time&#39;] + 1;

      // 将SESSION数据写入文件中,并关闭写锁
      session_write_close();

      // sleep()模拟花费时间较长的程序,这样在关闭写锁之后,
      // 服务器就能够相应别的请求,如下的$action=get,
      sleep(1);
    }

    echo json_encode([session_id() => $_SESSION[&#39;time&#39;]]);
    exit();}if ($action == &#39;get&#39;) {
    echo json_encode([session_id() => $_SESSION[&#39;time&#39;]]);
    exit();}
ログイン後にコピー

推奨される学習: 「

PHP ビデオ チュートリアル

」 ##

以上がデータを返さないPHPサーバーへの非同期リクエスト? (解決策を添付します)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート