12
votes

Deux demandes Ajax simultanées ne seront pas exécutées en parallèle

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);

    });
  • La progression est à jour correctement dans la base de données LI>
  • La minuterie JS tente d'obtenir la progression, je peux le voir dans la console, mais toutes ces demandes chargent toute la durée du premier script, dès que le script se termine, ces appels de progression AJAX sont chargés LI > ul>

    Alors, pourquoi le deuxième appel AJAX attend-il pour la première fois? P> P>


6 commentaires

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/...


6 Réponses :


37
votes

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.

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: xxx


1 commentaires

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!



-1
votes

Vous pouvez également définir

async: true,


1 commentaires

Ceci est pour les extjs que je prends?



2
votes

Après un peu de poils, j'ai trouvé un autre 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.

Xdebug peut causer cela, et je ne serais pas surpris si Zend Debugger pourrait aussi.

Dans mon cas, j'avais:

  • xdebug installé sur ma pile de lampe locale
  • xdebug.remote_autoStart activé
  • mon IDE acceptant les connexions de débogueur entrante, même si aucun point d'arrêt n'a été actif

    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.

    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.


0 commentaires

0
votes

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:

Exécuter plusieurs demandes Ajax en parallèle


0 commentaires

0
votes

A.PHP génère une page HTML principale contenant deux appels AJAX simultanés vers b.php et c.php . Pour B.PHP et C.PHP pour partager des variables de session, les variables de session doivent exister avant le premier appel AJAX. À condition que cela soit vrai, A.PHP et b.php peut modifier la valeur des variables de session et voir les valeurs de chacun. Par conséquent, créez les variables de session avec a.php tout en générant la page HTML. Au moins c'est comme ça que cela fonctionne avec l'hébergement Web partagé de Rogers.


0 commentaires

1
votes

Soyez au courant, que session_write_close () ( 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 dans php.ini , sinon la session ne sera pas fermée correctement.


0 commentaires