Я собираюсь попробовать более простой ответ:
Объяснение проблемы
Во-первых, давайте разберемся с потоком событий, когда страница обслуживается с нашего сервера:
- Сначала запускается PHP, он генерирует HTML, который подается клиенту.
- Затем HTML-код доставляется клиенту, после того как PHP завершит работу с ним, я хотел бы подчеркнуть, что, как только код покидает сервер - PHP завершает работу с ним и больше не может получить к нему доступ.
- Затем HTML с JavaScript достигает клиента, который может выполнить JavaScript на этом HTML.
В общем, главное, что нужно помнить, это то, что HTTP не имеет состояния . Как только запрос покинул сервер, сервер не может его коснуться. Итак, это оставляет наши варианты:
- Отправьте больше запросов от клиента после того, как начальный запрос сделан.
- Закодируйте, что сервер должен был сказать в начальном запросе.
Решения
Вот основной вопрос, который вы должны задать себе:
Я пишу веб-сайт или приложение?
Сайты в основном основаны на страницах, и время загрузки страницы должно быть максимально быстрым (например, Википедия). Веб-приложения более тяжелы в AJAX и выполняют множество обходных шагов, чтобы быстро получить информацию о клиенте (например, панель инструментов).
Веб-сайт
Посылка большего количества запросов от клиента после того, как начальный запрос сделан, медленна, поскольку это требует большего количества запросов HTTP, которые имеют значительные накладные расходы. Более того, он требует асинхронности, поскольку для выполнения AJAX-запроса требуется обработчик, когда он завершается.
Я не рекомендовал бы делать еще один запрос, если ваш сайт не является приложением для получения этой информации с сервера.
Вам нужно быстрое время отклика, которое оказывает огромное влияние на конверсию и время загрузки. В этом случае выполнение запросов Ajax является медленным для начального времени безотказной работы и не требуется.
У вас есть два способа решения проблемы
- Установить cookie - cookie - это заголовки, отправляемые в HTTP-запросах, которые могут прочитать и сервер, и клиент.
- Закодируйте переменную как JSON - JSON выглядит очень близко к объектам JavaScript, и большинство объектов JSON являются допустимыми переменными JavaScript.
Настройка cookie действительно не очень сложна, вы просто присваиваете ей значение:
setcookie("MyCookie", $value); // Sets the cookie to the value, remember, do not
// Set it with HTTP only to true.
Затем вы можете прочитать его с помощью JavaScript, используя document.cookie
:
Вот краткий парсер, но ответ, который я привел выше, лучше проверен:
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.
Файлы cookie хороши для небольших данных. Это то, что сервисы отслеживания часто делают.
Как только у нас будет больше данных, мы можем вместо этого кодировать их с помощью JSON внутри переменной JavaScript:
<script>
var myServerData = <?=json_encode($value)?>; // Don't forget to sanitize
//server data
</script>
Предполагая $value
, json_encode
может на стороне PHP (обычно это так). Эта техника - то, что Stack Overflow делает, например, со своим чатом (только с использованием .NET вместо PHP).
заявка
Если вы пишете приложение - внезапно начальное время загрузки не всегда так важно, как текущая производительность приложения, и оно начинает окупаться, загружая данные и код отдельно.
Мой ответ здесь объясняет, как загрузить данные с помощью AJAX в 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();
Или с помощью jQuery:
$.get("/your/url").done(function(data){
// What do I do with the data?
});
Теперь сервер просто должен содержать /your/url
маршрут / файл, который содержит код, который захватывает данные и что-то делает с ним, в вашем случае:
<$php
...
$val = myService->getValue(); // Makes an API and database call
echo json_encode($val); // Write it to the output
$>
Таким образом, наш файл JavaScript запрашивает данные и показывает их, а не запрашивает код или макет. Это чище и начинает окупаться, когда приложение становится выше. Это также лучшее разделение проблем и позволяет тестировать код на стороне клиента без какой-либо технологии на стороне сервера, что является еще одним плюсом.
Постскриптум: вы должны очень хорошо знать векторы атак XSS, когда вводите что-либо из PHP в JavaScript. Это очень трудно избежать ценности должным образом , и это контекстная. Если вы не знаете, как обращаться с XSS, или не знаете об этом - прочитайте эту статью OWASP , эту и этот вопрос .
myPlugin.start(<?=$val?>
умышленном? Правда ли, что «это иногда работает»?