Я спробую простіше відповісти:
Пояснення проблеми
Спочатку давайте розберемося з потоком подій, коли сторінка подається з нашого сервера:
- Спочатку запускається 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.
Потім ви можете прочитати його за допомогою JavaScriptdocument.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?>
навмисно? Чи правда, що «це працює іноді»?