Requête asynchrone au serveur PHP sans renvoyer de données ? (Ci-joint la solution)

藏色散人
Libérer: 2023-04-10 21:34:02
avant
4783 Les gens l'ont consulté

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

– le même navigateur, demande des noms de domaine différents - non bloquant : session_idrenvoie 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 FermezXDEBUG2 VerrouillageSESSION
3 Effacer tampon de sortie

1 DésactivezXDEBUG XDEBUGest un débogage en temps réel. Lors du débogage, il maintiendra FPMpour 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 XDEBUGet ne peut répondre qu'à une seule à la fois. De plus, puisque XDEBUGdépend de SESSION, vous devez fermer le verrouillage de session même si vous utilisez session_write_close()(voir ci-dessous). XDEBUGs'ouvrira toujours automatiquement. 2SESSIONLockUtilisez session_write_close()pour fermer le verrou en écriture de SESSION, qui convient à SESSIONEnregistrer sous Fichier. Non requis si SESSIONest enregistré dans Redis. 3 Effacer le tampon de sortieL'utilisation de session_write_close()peut ne pas fermer le verrou SESSIONimmé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
Copier après la connexion
code php
 $_SESSION['time']]); exit();}if ($action == 'get') { echo json_encode([session_id() => $_SESSION['time']]); exit();}
Copier après la connexion
Apprentissage recommandé : "Tutoriel vidéo PHP"

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!

Étiquettes associées:
php
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!