Proverò una risposta più semplice:
Spiegazione del problema
Innanzitutto, comprendiamo il flusso di eventi quando una pagina viene pubblicata dal nostro server:
- Viene eseguito innanzitutto PHP, genera l'HTML che viene offerto al client.
- Quindi, l'HTML viene consegnato al client, dopo che PHP ha finito con esso, vorrei sottolineare che una volta che il codice lascia il server - PHP ha finito con esso e non può più accedervi.
- Quindi, l'HTML con JavaScript raggiunge il client, che può eseguire JavaScript su quell'HTML.
Quindi, davvero, la cosa fondamentale da ricordare qui è che HTTP è apolide . Una volta che una richiesta ha lasciato il server, il server non può toccarlo. Quindi, ciò lascia le nostre opzioni a:
- Invia più richieste dal client al termine della richiesta iniziale.
- Codifica ciò che il server aveva da dire nella richiesta iniziale.
soluzioni
Questa è la domanda principale che dovresti porti è:
Sto scrivendo un sito Web o un'applicazione?
I siti Web si basano principalmente su pagine e i tempi di caricamento della pagina devono essere il più rapidi possibile (ad esempio Wikipedia). Le applicazioni Web sono più pesanti di AJAX ed eseguono molti viaggi di andata e ritorno per ottenere informazioni rapide sul client (ad esempio un pannello di controllo).
Sito web
L'invio di più richieste dal client dopo l' esecuzione della richiesta iniziale è lento in quanto richiede più richieste HTTP con un sovraccarico significativo. Inoltre, richiede l' asincronia poiché la richiesta AJAX richiede un gestore per quando è completa.
Vorrei non consiglierei di effettuare una nuova richiesta a meno che il sito è un'applicazione per ottenere le informazioni dal server.
Desideri tempi di risposta rapidi che abbiano un impatto enorme sui tempi di conversione e caricamento. In questo caso, le richieste Ajax sono lente per il tempo di attività iniziale e non sono necessarie.
Hai due modi per affrontare il problema
- Imposta un cookie : i cookie sono intestazioni inviate nelle richieste HTTP che possono essere lette sia dal server che dal client.
- Codifica la variabile come JSON : JSON sembra molto vicino agli oggetti JavaScript e la maggior parte degli oggetti JSON sono variabili JavaScript valide.
L'impostazione di un cookie non è davvero molto difficile, basta assegnargli un valore:
setcookie("MyCookie", $value); // Sets the cookie to the value, remember, do not
// Set it with HTTP only to true.
Quindi, puoi leggerlo con JavaScript utilizzando document.cookie
:
Ecco un parser laminato a mano corta, ma la risposta a cui ho collegato proprio sopra ha testati meglio:
var cookies = document.cookie.split(";").
map(function(el){ return el.split("="); }).
reduce(function(prev,cur){ prev[cur[0]] = cur[1];return prev },{});
cookies["MyCookie"] // Value set with PHP.
I cookie sono buoni per pochi dati. Questo è ciò che fanno spesso i servizi di localizzazione.
Quando avremo più dati, possiamo invece codificarli con JSON all'interno di una variabile JavaScript:
<script>
var myServerData = <?=json_encode($value)?>; // Don't forget to sanitize
//server data
</script>
Supponendo che $value
sia in json_encode
grado dal lato PHP (di solito lo è). Questa tecnica è quella che fa Stack Overflow con la sua chat (usando solo .NET invece di PHP).
Applicazione
Se stai scrivendo un'applicazione, improvvisamente il tempo di caricamento iniziale non è sempre importante quanto le prestazioni in corso dell'applicazione e inizia a pagare per caricare dati e codice separatamente.
La mia risposta qui spiega come caricare i dati utilizzando AJAX in 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();
O con jQuery:
$.get("/your/url").done(function(data){
// What do I do with the data?
});
Ora, il server deve solo contenere una /your/url
route / file che contiene codice che acquisisce i dati e fa qualcosa con esso, nel tuo caso:
<$php
...
$val = myService->getValue(); // Makes an API and database call
echo json_encode($val); // Write it to the output
$>
In questo modo, il nostro file JavaScript richiede i dati e li mostra invece di chiedere il codice o il layout. Questo è più pulito e inizia a dare i suoi frutti quando l'applicazione aumenta. È anche una migliore separazione delle preoccupazioni e consente di testare il codice lato client senza alcuna tecnologia lato server coinvolta, il che è un altro vantaggio.
Postscript: devi essere molto consapevole dei vettori di attacco XSS quando inietti qualcosa da PHP a JavaScript. È molto difficile sfuggire ai valori correttamente ed è sensibile al contesto. Se non sei sicuro di come gestire XSS o non ne sei a conoscenza, leggi questo articolo OWASP , questo e questa domanda .
myPlugin.start(<?=$val?>
intenzionale? È vero che "questo a volte funziona"?