Asynchrone Anfrage an PHP-Server ohne Rückgabe von Daten? (Anbei die Lösung)

藏色散人
Freigeben: 2023-04-10 21:34:02
nach vorne
4800 Leute haben es durchsucht

Kürzlich wurde ein Problem mit der asynchronen ajax-Anfrage entdeckt. Verwenden Sie die Codes $.post, $.get, $.ajax >Bei der Anfrage an den PHP-Server können Daten nicht asynchron zurückgegeben werden. <code>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

Nach vielen Tests haben wir Folgendes entdeckt:

– Verschiedene Browser, die unterschiedliche Domainnamen anfordern – keine Blockierung: kein Grund zum Experimentieren

– Verschiedene Browser, die denselben Domainnamen anfordern – keine Blockierung: session_id( ) gibt unterschiedliche

zurück – derselbe Browser, fordert unterschiedliche Domänennamen an – nicht blockierend: session_id gibt unterschiedliche

zurück – derselbe Browser, fordert unterschiedliche Domänennamen an – blockierend: session_id() code>Gibt das Gleiche zurückDas Problem wurde gefunden:1 XDEBUG schließen2 SESSION lock
3 Löschen Ausgabepuffer

🎜 1 Deaktivieren Sie XDEBUG🎜XDEBUG ist Echtzeit-Debugging. Beim Debuggen wird FPM beibehalten, um sicherzustellen, dass Threads funktionieren und Datenverschmutzung vermieden wird. 🎜Die typische Testmethode besteht darin, beim Debuggen mit XDEBUG einen anderen Browser zu öffnen und auf die Site zuzugreifen. 🎜🎜Dies hat erhebliche Auswirkungen auf parallele Antworten, d. h. selbst wenn das Frontend mehrere Anfragen sendet, wird es von XDEBUG gesteuert und kann jeweils nur auf eine antworten. 🎜Da XDEBUG außerdem von SESSION abhängt, müssen Sie die Sitzungssperre auch dann schließen, wenn Sie session_write_close() verwenden (siehe unten). XDEBUG wird weiterhin automatisch geöffnet. 🎜🎜2 SESSIONSperre🎜Verwenden Sie session_write_close(), um die Schreibsperre von SESSION zu schließen, die geeignet ist für SESSIONSpeichern als Datei. Nicht erforderlich, wenn SESSION in Redis gespeichert ist. 🎜🎜3 Löschen Sie den Ausgabepuffer🎜Die Verwendung von session_write_close() schließt die SESSION-Sperre möglicherweise nicht sofort, also fügen Sie vor dieser Methode Folgendes hinzu: >ob_end_flush(). Lassen Sie session_write_close() sofort wirksam werden. 🎜🎜4 Beispiel🎜Es gibt ein Beispiel wie folgt: Wenn auf die Schaltfläche [Senden] geklickt wird, sendet das Frontend zwei Anfragen an den Backend-Server. 🎜Eine davon ist die get-Anfrage, die alle 1 Sekunde angefordert wird. 🎜Eine davon ist die post-Anfrage, die einmalig zu Beginn gesendet wird und dann auf die entsprechende Fertigstellung wartet. 🎜🎜Sehen Sie sich den HTML-Code an🎜
<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>
Nach dem Login kopieren
🎜php-Code🎜
<?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();}
Nach dem Login kopieren
🎜🎜 Lernempfehlung: „🎜PHP-Video-Tutorial🎜“

Das obige ist der detaillierte Inhalt vonAsynchrone Anfrage an PHP-Server ohne Rückgabe von Daten? (Anbei die Lösung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!