Voy a intentar una respuesta más simple:
Explicación del problema.
Primero, comprendamos el flujo de eventos cuando se sirve una página desde nuestro servidor:
- Primero se ejecuta PHP, genera el HTML que se sirve al cliente.
- Luego, el HTML se entrega al cliente, una vez que PHP termina con él, me gustaría enfatizar que una vez que el código abandona el servidor, PHP termina con él y ya no puede acceder a él.
- Luego, el HTML con JavaScript llega al cliente, que puede ejecutar JavaScript en ese HTML.
Entonces, realmente, lo más importante para recordar aquí es que HTTP no tiene estado . Una vez que una solicitud abandona el servidor, el servidor no puede tocarla. Entonces, eso deja nuestras opciones para:
- Enviar más solicitudes del cliente después de que se realiza la solicitud inicial.
- Codifique lo que el servidor tenía que decir en la solicitud inicial.
Soluciones
Esa es la pregunta central que debe hacerse es:
¿Estoy escribiendo un sitio web o una aplicación?
Los sitios web se basan principalmente en páginas, y los tiempos de carga de la página deben ser lo más rápidos posible (por ejemplo, Wikipedia). Las aplicaciones web son más pesadas en AJAX y realizan muchos viajes de ida y vuelta para obtener información rápida del cliente (por ejemplo, un tablero de valores).
Sitio web
Enviar más solicitudes del cliente después de que se realiza la solicitud inicial es lento, ya que requiere más solicitudes HTTP que tienen una sobrecarga significativa. Además, requiere asincronía ya que realizar una solicitud AJAX requiere un controlador para cuando se complete.
Yo no recomendaría hacer una nueva solicitud a menos que su sitio es una aplicación para conseguir que la información del servidor.
Desea tiempos de respuesta rápidos que tengan un gran impacto en los tiempos de conversión y carga. Hacer solicitudes de Ajax es lento para el tiempo de actividad inicial en este caso e innecesario.
Tienes dos formas de abordar el problema
- Establecer una cookie : las cookies son encabezados enviados en solicitudes HTTP que tanto el servidor como el cliente pueden leer.
- Codifique la variable como JSON : JSON se parece mucho a los objetos JavaScript y la mayoría de los objetos JSON son variables válidas de JavaScript.
Configurar una cookie no es realmente muy difícil, solo tiene que asignarle un valor:
setcookie("MyCookie", $value); // Sets the cookie to the value, remember, do not
// Set it with HTTP only to true.
Luego, puede leerlo con JavaScript usando document.cookie
:
Aquí hay un breve analizador enrollado a mano, pero la respuesta que vinculé justo encima de esta tiene mejores resultados:
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.
Las cookies son buenas para algunos datos. Esto es lo que a menudo hacen los servicios de rastreo.
Una vez que tenemos más datos, podemos codificarlos con JSON dentro de una variable de JavaScript:
<script>
var myServerData = <?=json_encode($value)?>; // Don't forget to sanitize
//server data
</script>
Suponiendo que $value
es json_encode
capaz en el lado de PHP (generalmente lo es). Esta técnica es lo que hace Stack Overflow con su chat, por ejemplo (solo usando .NET en lugar de PHP).
Solicitud
Si está escribiendo una aplicación, de repente, el tiempo de carga inicial no siempre es tan importante como el rendimiento continuo de la aplicación, y comienza a dar frutos para cargar datos y códigos por separado.
Mi respuesta aquí explica cómo cargar datos usando 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();
O con jQuery:
$.get("/your/url").done(function(data){
// What do I do with the data?
});
Ahora, el servidor solo necesita contener una /your/url
ruta / archivo que contenga código que tome los datos y haga algo con ellos, en su caso:
<$php
...
$val = myService->getValue(); // Makes an API and database call
echo json_encode($val); // Write it to the output
$>
De esta manera, nuestro archivo JavaScript solicita los datos y los muestra en lugar de solicitar el código o el diseño. Esto es más limpio y comienza a dar sus frutos a medida que la aplicación aumenta. También es una mejor separación de preocupaciones y permite probar el código del lado del cliente sin ninguna tecnología del lado del servidor, lo cual es otra ventaja.
Postdata: debe ser muy consciente de los vectores de ataque XSS cuando inyecta cualquier cosa desde PHP a JavaScript. Es muy difícil escapar de los valores correctamente y es sensible al contexto. Si no está seguro de cómo lidiar con XSS o no lo sabe, lea este artículo de OWASP , este y esta pregunta .
myPlugin.start(<?=$val?>
intencional? ¿Es cierto que "esto funciona a veces"?