Heim > Artikel > Backend-Entwicklung > Asynchrone Anfrage an PHP-Server ohne Rückgabe von Daten? (Anbei die Lösung)
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
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
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 SESSION
Sperre🎜Verwenden Sie session_write_close()
, um die Schreibsperre von SESSION
zu schließen, die geeignet ist für SESSION
Speichern 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"> $('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-Code🎜
cf44e1b56b3cc8a68161c85bcd1685b9 $_SESSION['time']]); exit();}if ($action == 'get') { echo json_encode([session_id() => $_SESSION['time']]); exit();}🎜🎜 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!