J'ai récemment découvert un problème avec la requête asynchroneajax
, utilisez$.post
,$.get
,$.ajax code >Lors de la requête du serveur PHP, les données ne peuvent pas être renvoyées de manière asynchrone.
ajax
异步请求的问题,用$.post
、$.get
、$.ajax
请求PHP服务器时,总是无法异步返回数据。
经多次测试才发现:
– 不同浏览器,请求不同域名-不阻塞:无需实验
– 不同浏览器,请求同域名-不阻塞:session_id()
返回不同
– 同一浏览器,请求不同域名-不阻塞:session_id
返回不同
– 同一浏览器,请求同域名-阻塞:session_id()
返回相同
发现问题所在:
1 关闭XDEBUG
2SESSION
锁
3 清除输出缓冲区
1 关闭XDEBUG
XDEBUG
是实时调试。调试时,它将保持FPM
以确保线程正在工作以避免数据污染。
典型的测试方法是,使用XDEBUG
进行调试时,打开另一个浏览器并访问该站点,该站点这个时候是无法访问的。
这对并行响应有重大影响,即,即使前端发送多个请求,它也受XDEBUG
控制,并且只能同时响应一个。
另外,由于XDEBUG
依赖于SESSION
,因此即使您使用session_write_close()
,也要关闭会话锁(请参见下文)。XDEBUG
仍会自动打开。
2SESSION
锁
用session_write_close()
关闭SESSION
的写锁,这适合SESSION
保存为File
的情况。如果SESSION
保存在Redis
,则不需要。
3 清除输出缓冲区
使用session_write_close()
可能无法立即关闭SESSION
锁,所以在这个方法之前加上:ob_end_flush()
。让session_write_close()
马上生效。
4 示例
有如下一个范例,当点击【提交】按钮时,前端会给后台服务器发送两种请求。
一种是get
请求,每隔1秒请求一次。
一种是post
Après de nombreux tests, nous avons découvert :
– Différents navigateurs, demandant des noms de domaine différents - pas de blocage : pas besoin d'expérimenter– Différents navigateurs, demandant le même nom de domaine - pas de blocage :session_id()
renvoie différents
session_id
renvoie différents
– le même navigateur, demande le même nom de domaine - bloquant : session_id() code>Renvoie la même choseProblème trouvé :1 FermezXDEBUG
2 VerrouillageSESSION
3 Effacer tampon de sortie
XDEBUG
XDEBUG
est un débogage en temps réel. Lors du débogage, il maintiendra
FPM
pour garantir que les threads fonctionnent pour éviter la pollution des données. La méthode de test typique consiste à ouvrir un autre navigateur et à accéder au site lors du débogage à l'aide de
XDEBUG
. Le site est inaccessible pour le moment. Cela a un impact significatif sur les réponses parallèles, c'est-à-dire que même si le frontend envoie plusieurs requêtes, il est contrôlé par
XDEBUG
et ne peut répondre qu'à une seule à la fois. De plus, puisque
XDEBUG
dépend de
SESSION
, vous devez fermer le verrouillage de session même si vous utilisez
session_write_close()
(voir ci-dessous).
XDEBUG
s'ouvrira toujours automatiquement.
2SESSION
LockUtilisez
session_write_close()
pour fermer le verrou en écriture de
SESSION
, qui convient à
SESSION
Enregistrer sous
Fichier
. Non requis si
SESSION
est enregistré dans
Redis
.
3 Effacer le tampon de sortieL'utilisation de
session_write_close()
peut ne pas fermer le verrou
SESSION
immédiatement, alors ajoutez :
avant cette méthode >ob_end_flush()
. Laissez
session_write_close()
prendre effet immédiatement.
4 ExempleIl existe un exemple comme suit Lorsque vous cliquez sur le bouton [Soumettre], le front-end enverra deux requêtes au serveur backend. L'une est la requête
get
, qui est demandée toutes les secondes. L'une est la requête
post
, qui est envoyée une fois au début puis attend la fin correspondante. Regardez le code HTML
$_SESSION['time']]); exit();}if ($action == 'get') { echo json_encode([session_id() => $_SESSION['time']]); exit();}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!