Je vais essayer une réponse plus simple :
Explication du problème
Tout d'abord, comprenons le déroulement des événements lorsqu'une page est servie par notre serveur :
- Lorsque PHP est exécuté, il génère le HTML qui est servi au client.
- Ensuite, le HTML est livré au client, après que PHP en ait fini avec lui. Je tiens à souligner qu'une fois que le code quitte le serveur, PHP en a fini avec lui et ne peut plus y accéder.
- Ensuite, le HTML avec JavaScript atteint le client, qui peut exécuter JavaScript sur ce HTML.
Donc vraiment, la chose essentielle à retenir ici est que HTTP est apatride . Une fois qu'une demande a quitté le serveur, le serveur ne peut plus y toucher. Donc, cela laisse nos options à :
- Envoyer plus de demandes du client après la demande initiale est faite.
- Encodez ce que le serveur avait à dire dans la demande initiale.
Solutions
La question centrale que vous devriez vous poser est la suivante :
Suis-je en train d'écrire un site web ou une application ?
Les sites web sont principalement basés sur des pages, et les temps de chargement des pages doivent être aussi rapides que possible (par exemple - Wikipedia). Les applications Web sont davantage axées sur AJAX et effectuent de nombreux allers-retours pour fournir rapidement des informations au client (par exemple, un tableau de bord boursier).
Site web
Envoyer d'autres requêtes du client après que la requête initiale ait été effectuée est lent car elle nécessite davantage de requêtes HTTP, ce qui entraîne une surcharge importante. En outre, elle nécessite asynchronisme car la réalisation d'une requête AJAX nécessite un gestionnaire pour le moment où elle est terminée.
Je voudrais no recommander de faire une autre demande à moins que votre site soit une application pour obtenir cette information du serveur.
Vous voulez des temps de réponse rapides qui ont un énorme impact sur la conversion et les temps de chargement. Faire des requêtes Ajax est lent pour le temps de chargement initial dans ce cas et inutile.
Vous avez deux façons d'aborder le problème
-
Définir un cookie - Les cookies sont des en-têtes envoyés dans les requêtes HTTP que le serveur et le client peuvent lire.
-
Encodez la variable en JSON - JSON est très proche des objets JavaScript, et le plus Les objets JSON sont des variables JavaScript valides.
Mise en place d'un cookie n'est vraiment pas très difficile, il suffit de lui attribuer une valeur :
setcookie("MyCookie", $value); // Sets the cookie to the value, remember, do not
// Set it with HTTP only to true.
Ensuite, vous pouvez le lire avec JavaScript en utilisant document.cookie
:
Voici un parseur roulé à la main, mais la réponse dont j'ai donné le lien juste au-dessus en propose de meilleurs :
var cookies = document.cookie.split(";").
map(function(el){ return el.split("="); }).
reduce(function(prev,cur){ prev[cur[0]] = cur[1]; return prev },{});
alert(cookies["MyCookie"]); // Value set with PHP.
Les cookies sont bons pour un petit nombre de données. C'est ce que font souvent les services de suivi.
Une fois que nous avons plus de données, nous pouvons les encoder avec JSON à l'intérieur d'une variable JavaScript :
<script>
var myServerData = <?=json_encode($value)?>; // Don't forget to sanitize
//server data
</script>
En supposant que $value
es json_encode
capable du côté PHP (il l'est généralement). C'est ce que fait Stack Overflow avec son chat par exemple (mais en utilisant .NET au lieu de PHP).
Application
Si vous écrivez une application, le temps de chargement initial n'est pas toujours aussi important que les performances continues de l'application, et il devient intéressant de charger les données et le code séparément.
Ma réponse aquí explique comment charger des données en utilisant AJAX en JavaScript :
function callback(data){
// What do I do with the response?
}
var httpRequest = new XMLHttpRequest;
httpRequest.onreadystatechange = function(){
if (httpRequest.readyState === 4) { // Request is done
if (httpRequest.status === 200) { // successfully
callback(httpRequest.responseText); // We're calling our method
}
}
};
httpRequest.open('GET', "/echo/json");
httpRequest.send();
Ou avec jQuery :
$.get("/your/url").done(function(data){
// What do I do with the data?
});
Maintenant, le serveur doit juste contenir un /your/url
route/fichier qui contient le code qui saisit les données et en fait quelque chose, dans votre cas :
<?php
$val = myService->getValue(); // Makes an API and database call
header("Content-Type: application/json"); // Advise client of response type
echo json_encode($val); // Write it to the output
De cette façon, notre fichier JavaScript demande les données et les affiche plutôt que de demander du code ou de la mise en page. C'est plus propre et cela commence à porter ses fruits à mesure que l'application s'élève. C'est aussi une meilleure séparation des préoccupations et cela permet de tester le code côté client sans qu'aucune technologie côté serveur ne soit impliquée, ce qui est un autre avantage.
Post-scriptum : Vous devez être très conscient des vecteurs d'attaque XSS lorsque vous injectez n'importe quoi, du PHP au JavaScript. C'est très difficile d'échapper aux valeurs correctement et c'est sensible au contexte. Si vous n'êtes pas sûr de la façon de traiter les XSS, ou si vous n'en êtes pas conscient, lisez ce qui suit. cet article de l'OWASP , celui-ci y cette question .
3 votes
Est-ce que la parenthèse fermante manquante dans
myPlugin.start(<?=$val?>
intentionnel ? Est-il vrai que "ça marche parfois" ?2 votes
En fait, c'est Ben qui l'a fait, mais disons que si $val est
"42)"
ça va bien marcher :D