Daha basit bir cevap deneyeceğim:
Sorunun açıklaması
İlk olarak, sunucumuzdan bir sayfa sunulduğunda etkinlik akışını anlayalım:
- İlk PHP çalıştırılır, istemciye sunulan HTML'yi oluşturur.
- Daha sonra, PHP istemciye teslim edilir, PHP onunla yapıldıktan sonra, kod sunucudan ayrıldıktan sonra - PHP onunla yapılır ve artık erişemez.
- Ardından, JavaScript içeren HTML istemciye ulaşır ve bu HTML üzerinde JavaScript çalıştırabilir.
Gerçekten, burada hatırlanması gereken en önemli şey HTTP'nin vatansız olmasıdır . Bir istek sunucudan ayrıldıktan sonra sunucu ona dokunamaz. Bu, seçeneklerimizi şu şekilde bırakır:
- İlk istek yapıldıktan sonra istemciden daha fazla istek gönderin .
- İlk istekte sunucunun söylediklerini kodlayın.
Çözümler
Kendinize sormanız gereken temel soru şudur:
Bir web sitesi veya uygulama yazıyor muyum?
Web siteleri çoğunlukla sayfa tabanlıdır ve sayfa yükleme sürelerinin mümkün olduğunca hızlı olması gerekir (örneğin - Wikipedia). Web uygulamaları daha fazla AJAX ağırdır ve istemciye hızlı bilgi almak için çok sayıda gidiş-dönüş gerçekleştirir (örneğin - stok panosu).
İnternet sitesi
İlk istek yapıldıktan sonra istemciden daha fazla istek göndermek yavaştır , çünkü önemli ek yüke sahip daha fazla HTTP isteği gerektirir. Dahası, bir AJAX isteği yapmak tamamlandığında bir işleyici gerektirdiğinden eşzamansızlık gerektirir.
Ben istiyorum değil başka istekte tavsiye Siteniz bir uygulama olmadığı sürece sunucudan bu bilgileri almak için.
Dönüşüm ve yükleme süreleri üzerinde büyük etkisi olan hızlı tepki süreleri istiyorsunuz . Ajax isteklerinin yapılması bu durumda ilk çalışma süresi için yavaştır ve gereksizdir.
Sorunu çözmek için iki yolunuz var
- Tanımlama bilgisi ayarlama - tanımlama bilgileri, hem sunucunun hem de istemcinin okuyabileceği HTTP isteklerinde gönderilen başlıklardır.
- Değişkeni JSON olarak kodlayın - JSON, JavaScript nesnelerine çok yakın görünüyor ve çoğu JSON nesnesi geçerli JavaScript değişkenleridir.
Bir çerez ayarlamak gerçekten zor değildir, sadece bir değer atarsınız:
setcookie("MyCookie", $value); // Sets the cookie to the value, remember, do not
// Set it with HTTP only to true.
Ardından, aşağıdakileri kullanarak JavaScript ile okuyabilirsinizdocument.cookie
:
İşte kısa elle yuvarlanmış bir ayrıştırıcı, ancak bunun üzerine bağladığım cevap daha iyi test edilmiş cevaplara sahip:
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.
Çerezler küçük veriler için iyidir. İzleme hizmetleri genellikle bunu yapar.
Daha fazla verimiz olduğunda, bunun yerine bir JavaScript değişkeninin içindeki JSON ile kodlayabiliriz:
<script>
var myServerData = <?=json_encode($value)?>; // Don't forget to sanitize
//server data
</script>
PHP tarafında $value
olduğunu varsayarsak json_encode
(genellikle). Bu teknik, Stack Overflow'un sohbeti ile yaptığı şeydir (sadece PHP yerine .NET kullanarak).
Uygulama
Bir uygulama yazıyorsanız - aniden ilk yükleme süresi her zaman uygulamanın devam eden performansı kadar önemli değildir ve verileri ve kodu ayrı ayrı yüklemek için ödeme yapmaya başlar.
Benim cevabım burada nasıl JavaScript AJAX kullanarak yük verilerine açıklıyor:
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();
Veya jQuery ile:
$.get("/your/url").done(function(data){
// What do I do with the data?
});
Şimdi, sunucunun, sadece /your/url
sizin durumunuzda verileri alan ve onunla bir şeyler yapan kodu içeren bir rota / dosya içermesi gerekir:
<$php
...
$val = myService->getValue(); // Makes an API and database call
echo json_encode($val); // Write it to the output
$>
Bu şekilde, JavaScript dosyamız veri ister kod ister mizanpaj istemek yerine verileri ister. Bu daha temiz ve uygulama yükseldikçe ödeme yapmaya başlar. Ayrıca endişelerin daha iyi ayrılması ve başka bir artı olan herhangi bir sunucu tarafı teknolojisi olmadan istemci tarafı kodunun test edilmesine izin verir.
Dipnot: Sen olmak zorunda çok PHP den JavaScript şey enjekte zaman XSS saldırı vektörleri farkında. Bu var çok düzgün değerlerini kaçmak için zor ve bağlam hassas. XSS ile nasıl başa çıkacağınızdan emin değilseniz veya bunun farkında değilseniz - lütfen bu OWASP makalesini , bu ve bu soruyu okuyun .
myPlugin.start(<?=$val?>
kasti miydi? "Bunun bazen işe yaradığı" doğru mu?