4 votes

Requête PHP asynchrone avec Ajax ?

J'ai du mal à comprendre. Ajax est asynchrone, c'est certain... il fait appel de manière asynchrone à PHP, et ce PHP a une requête sql pour la base de données. Cela signifie que la requête sql de PHP est également effectuée de manière asynchrone, n'est-ce pas ? Sinon, cela va à l'encontre du but recherché. Mais sans utiliser Ajax, la requête sql de PHP serait synchrone, n'est-ce pas ? Je sais comment le mettre en code, mais je ne comprends pas comment cela fonctionne en interne.

4voto

Ian Points 23712

La requête SQL est "asynchrone" dans la mesure où elle fait partie de l'appel AJAX original. Ne vous attardez pas sur la terminologie au-delà de cela. Le client et le serveur sont totalement séparés, surtout lorsqu'il s'agit de requêtes HTTP, et dans ce scénario. La signification du terme "asynchrone" avec AJAX est qu'il est traité de manière asynchrone par rapport au reste du Javascript - il ne bloque pas l'exécution des autres codes. Mais à partir de là, tout doit être synchrone, sinon cela ne fonctionnera pas (à l'exception du changement d'état pour l'AJAX).

La demande AJAX est envoyée au serveur, le serveur interroge la base de données, le serveur répond, le Javascript entend cette réponse, et le gestionnaire AJAX traite la réponse dès qu'elle n'est pas bloquée par un autre Javascript.

Donc non, la requête SQL PHP elle-même est toujours synchrone ; c'est la requête HTTP qui est asynchrone.

UPDATE :

À titre d'exemple, voici un niveau très bas et très dépouillé d'AJAX que la plupart des bibliothèques enveloppent de certaines manières :

var xhr= new XMLHttpRequest();
var params = "x=2&y=3";
var url = "/your/url";
xhr.open("POST", url, true);
xhr.onreadystatechange = function () {
    // The `xhr.readyState` changes based on the client's 
    // The `xhr.status` is set based on the server's response
    // Normally, you check for `readyState` being 4 and `status` being 200
    //   meaning that the request is complete and the HTTP status code is 200 (good response)
    if (xhr.readyState == 4) {
        if (xhr.status == 200) {
            // All good
        }
    } else {

    }
};
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(encodeURIComponent(params));

Lorsque xhr.send est appelé, il envoie la requête HTTP asynchrone au serveur, et c'est à peu près tout pour le Javascript. Le site onreadystatechange est ce qui s'exécute lorsque le readyState changements. Une valeur de 4 signifie qu'il est terminé, et status 200 est ce que vous cherchez... chaque fois que c'est-à-dire.

Tout peut arriver sur le serveur. Vous pouvez faire un appel "asynchrone" (sans rapport) à la base de données, contacter un autre serveur de n'importe quelle manière, retarder pour n'importe quelle raison (jusqu'à une certaine limite) ou quelque chose comme ça. Le fait est que rien n'est connu sur le client (Javascript) jusqu'à ce que le serveur renvoie une réponse. Le serveur pourrait tourner en boucle pendant un long moment en vérifiant la base de données à chaque fois, et ne jamais répondre jusqu'à ce qu'il y ait un certain changement (un exemple de polling long).

2voto

usumoio Points 1618

Ok, vous avez à peu près raison, mais voici quelques précisions. Vous avez raison de dire qu'une requête à votre base de données sera asynchrone. Il est important de noter que votre serveur PHP va créer une session de données ouverte et unique avec la machine cliente. Maintenant, quand une page est demandée, le client enverra une réponse qui inclura un script (probablement en javascript) qui exécutera des commandes sur la machine cliente. Dans votre cas, certaines de ces commandes font des appels asynchrones à votre serveur, et votre serveur peut s'en souvenir à cause de la session. Ensuite, sur la base de ce que votre serveur sait de la session, il répondra aux appels comme vous le demandez. Vous pouvez appeler votre serveur de base de données, accéder à des variables de session ou effectuer des traitements qui pourraient être plus faciles en PHP. Une fois le traitement terminé, le serveur renverra une réponse au client en question en fonction de la session unique. Comme une note latérale importante, rappelez-vous que tout ce que vous faites de manière asynchrone prendra son temps sur le serveur et fera ce qu'il a à faire. Si vous faites référence à des variables dans vos script clients qui ont été traitées par le serveur avant qu'il ne termine son travail, elles apparaîtront sur votre machine client comme erronées (potentiellement mais très probablement). Vos appels de base de données se produiront de manière asynchrone comme vous l'aviez prévu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X