Vou tentar uma resposta mais simples:
Explicação do problema
Primeiro, vamos entender o fluxo de eventos quando uma página é veiculada em nosso servidor:
- Primeiro, o PHP é executado, ele gera o HTML que é veiculado no cliente.
- Então, o HTML é entregue ao cliente, depois que o PHP é concluído, eu gostaria de enfatizar que quando o código sai do servidor - o PHP é finalizado e não pode mais acessá-lo.
- Em seguida, o HTML com JavaScript chega ao cliente, que pode executar o JavaScript nesse HTML.
Realmente, a principal coisa a lembrar aqui é que o HTTP é sem estado . Depois que uma solicitação sai do servidor, o servidor não pode tocá-lo. Então, isso deixa nossas opções para:
- Envie mais solicitações do cliente após a da solicitação inicial.
- Codifique o que o servidor tinha a dizer na solicitação inicial.
Soluções
Essa é a pergunta principal que você deve se perguntar:
Estou escrevendo um site ou aplicativo?
Os sites são baseados principalmente em páginas e o tempo de carregamento da página precisa ser o mais rápido possível (por exemplo - Wikipedia). Os aplicativos da Web são mais pesados para o AJAX e realizam várias viagens de ida e volta para obter informações rápidas do cliente (por exemplo - um painel de ações).
Local na rede Internet
O envio de mais solicitações do cliente após a conclusão da solicitação inicial é lento , pois requer mais solicitações HTTP com sobrecarga significativa. Além disso, requer assincronicidade, pois fazer uma solicitação AJAX requer um manipulador para quando estiver completo.
Eu não recomendaria fazer outra solicitação, a menos que seu site seja um aplicativo para obter essas informações do servidor.
Você deseja tempos de resposta rápidos, com uma enorme impacto nos tempos de conversão e carregamento. Fazer solicitações do Ajax é lento para o tempo de atividade inicial nesse caso e desnecessário.
Você tem duas maneiras de resolver o problema
- Definir um cookie - os cookies são cabeçalhos enviados em solicitações HTTP que o servidor e o cliente podem ler.
- Codifique a variável como JSON - JSON parece muito próximo aos objetos JavaScript e a maioria dos objetos JSON são variáveis JavaScript válidas.
Definir um cookie não é realmente muito difícil, basta atribuir um valor a ele:
setcookie("MyCookie", $value); // Sets the cookie to the value, remember, do not
// Set it with HTTP only to true.
Em seguida, você pode lê-lo com JavaScript usandodocument.cookie
:
Aqui está um analisador de rolagem manual, mas a resposta que eu vinculei logo acima tem os melhores:
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.
Os cookies são bons para um pouco de dados. É isso que os serviços de rastreamento costumam fazer.
Quando tivermos mais dados, podemos codificá-los com JSON dentro de uma variável JavaScript:
<script>
var myServerData = <?=json_encode($value)?>; // Don't forget to sanitize
//server data
</script>
Supondo que $value
seja json_encode
capaz no lado do PHP (geralmente é). Essa técnica é o que o Stack Overflow faz com seu bate-papo, por exemplo (apenas usando .NET em vez de PHP).
Inscrição
Se você estiver escrevendo um aplicativo - de repente, o tempo de carregamento inicial nem sempre é tão importante quanto o desempenho contínuo do aplicativo e começa a valer a pena carregar dados e códigos separadamente.
Minha resposta aqui explica como carregar dados usando o AJAX em 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 com jQuery:
$.get("/your/url").done(function(data){
// What do I do with the data?
});
Agora, o servidor só precisa conter uma /your/url
rota / arquivo que contenha código que pegue os dados e faça algo com eles, no seu caso:
<$php
...
$val = myService->getValue(); // Makes an API and database call
echo json_encode($val); // Write it to the output
$>
Dessa forma, nosso arquivo JavaScript solicita os dados e os mostra em vez de solicitar código ou layout. Isso é mais limpo e começa a valer a pena à medida que o aplicativo aumenta. Também é uma melhor separação de preocupações e permite testar o código do lado do cliente sem a necessidade de qualquer tecnologia do servidor, o que é outra vantagem.
Postscript: Você deve estar muito ciente dos vetores de ataque XSS ao injetar algo do PHP ao JavaScript. É muito difícil escapar dos valores corretamente e é sensível ao contexto. Se você não tiver certeza de como lidar com o XSS ou não o conhecer - leia este artigo da OWASP , esta e esta pergunta .
myPlugin.start(<?=$val?>
intencional? É verdade que "isso funciona às vezes"?