J'ai un problème avec deux demandes Ajax simultanées en cours d'exécution. J'ai un script PHP qui exporte des données sur XSLX. Cette opération prend beaucoup de temps, alors j'essaie de montrer des progrès accomplis à l'utilisateur. J'utilise une approche Ajax et de base de données. En fait, je suis à peu près sûr que cela travaillait pour travailler, mais je ne peux pas comprendre pourquoi, cela ne fonctionne plus dans aucun navigateur. A fait quelque chose de changement dans de nouveaux navigateurs?
$(document).ready(function() { $("#progressbar").progressbar(); $.ajax({ type: "POST", url: "{$BASE_URL}/export/project/ajaxExport", data: "type={$type}&progressUid={$progressUid}" // unique ID I'm using to track progress from database }).done(function(data) { $("#progressbar-box").hide(); clearInterval(progressInterval); }); progressInterval = setInterval(function() { $.ajax({ type: "POST", url: "{$BASE_URL}/ajax/progressShow", data: "statusId={$progressUid}" // the same uinque ID }).done(function(data) { data = jQuery.parseJSON(data); $("#progressbar").progressbar({ value: parseInt(data.progress) }); if (data.title) { $("#progressbar-title").text(data.title); } }); }, 500); });
Alors, pourquoi le deuxième appel AJAX attend-il pour la première fois? P> P>
6 Réponses :
sonne comme un problème de blocage de session
Par défaut PHP écrit ses données de session dans un fichier. Lorsque vous initiez une session avec session_start (), il ouvre le fichier pour écrire et le verrouiller pour éviter les modifications simultanées. Cela signifie que pour chaque demande passant par un script PHP à l'aide d'une session doit attendre que la première session soit effectuée avec le fichier. P>
Le moyen de résoudre ce problème est de modifier les sessions PHP pour ne pas utiliser de fichiers ou Pour fermer votre session, écrivez comme suit: p>
Ay Carumba. Pas un fan de sessions PHP, mais développer à l'aide de symfony qui l'utilise exhaustive. A du sens mais n'a jamais deviné. Bonne aide!
Vous pouvez également définir
async: true,
Ceci est pour les extjs que je prends?
Après un peu de poils, j'ai trouvé un autre fort> de la manière dont ces demandes AJAX non parallèles peuvent se produire, totalement indépendante de la manipulation de session PHP ... Donc je l'affiche ici Juste pour que quiconque passe ici par Google avec le même problème. P>
Xdebug peut causer cela, et je ne serais pas surpris si Zend Debugger pourrait aussi. p>
Dans mon cas, j'avais: p>
Cela a provoqué que tous mes tests Ajax sont exécutés de manière séquentielle, peu importe quoi. En rétrospectivement, il a beaucoup de sens (du point de vue des choses de débogage) pour forcer le traitement séquentiel, mais je n'avais tout simplement pas remarqué que mon IDE interagit toujours dans les coulisses. P>
Après avoir dit à l'IDE d'arrêter d'écouter entièrement, des courses parallèles ont repris et j'ai pu reproduire la condition de course que je cherchais. p>
xdebug.remote_autoStart code> activé li>
Lorsque vous travaillez avec API, vous devez parfois émettre plusieurs demandes AJAX à différents points d'extrémité. Au lieu d'attendre une demande de remplir avant d'émettre le suivant, vous pouvez accélérer les choses avec JQuery en demandant aux données en parallèle, en utilisant JQuery's $ .Quand () Fonction: P>
Soyez au courant, que session_write_close () code> ( Réponse de Chrislondon) peut ne pas résoudre le Problème Si vous avez activé la mémoire tampon de sortie (par défaut dans PHP 7+). Vous devez définir
sortie_buffering = off code> dans php.ini strong>, sinon la session ne sera pas fermée correctement. P>
Certaines configurations de serveur Web PHP ne permettent qu'une connexion par session fonctionne simultanément. Donc, si vous utilisez des sessions, essayez une expérience dans une page où vous (a) démarrez une session, puis (B) de sommeil pendant 60 secondes. Ensuite, essayez de charger un certain nombre d'instances de cette page dans le même navigateur - ils peuvent bien se charger l'un après l'autre.
Avez-vous mis à jour la version JQuery récemment?
De plus, en général, plus d'un Ajax OP n'est pas la meilleure pratique, car il gaspille du temps sur l'excès d'appels HTTP. Pouvez-vous les fusionner en un, et retourner plusieurs résultats dans une chaîne JSON?
Si vous utilisez des sessions côté serveur, PHP verrouille par défaut le fichier de session pendant que une demande est active, ce qui signifie que vous ne pouvez pas avoir plus d'une demande exceptionnelle active à la fois.
Marc B Tu as raison! C'était le problème de la session. J'utilisais la bibliothèque de session de Cadedigniter, mais je l'ai changé en bibliothèque de session native récemment et je n'ai pas réalisé que cela pourrait être le problème. Merci. Vous pouvez le poster comme réponse afin que je puisse le marquer comme accepté.
[Exécutez plusieurs demandes AJAX en parallèle avec jQuery] [1] [1]: Stackoverflow.com/Questtions/1060539/...