ฉันจะลองคำตอบที่ง่ายกว่านี้:
คำอธิบายของปัญหา
ก่อนอื่นให้ทำความเข้าใจกับการไหลของเหตุการณ์เมื่อมีการแสดงหน้าจากเซิร์ฟเวอร์ของเรา:
- PHP แรกถูกเรียกใช้มันสร้าง HTML ที่ให้บริการกับลูกค้า
- จากนั้น HTML จะถูกส่งไปยังไคลเอนต์หลังจาก PHP เสร็จสิ้นแล้วฉันต้องการเน้นว่าเมื่อโค้ดออกจากเซิร์ฟเวอร์ - PHP นั้นเสร็จสิ้นแล้วและไม่สามารถเข้าถึงได้อีกต่อไป
- จากนั้น HTML ที่มี JavaScript จะถึงไคลเอ็นต์ซึ่งสามารถเรียกใช้ JavaScript บน HTML นั้นได้
ดังนั้นจริงๆสิ่งหลักที่ต้องจำไว้ว่านี่คือHTTP เป็นไร้สัญชาติ เมื่อคำขอออกจากเซิร์ฟเวอร์เซิร์ฟเวอร์จะไม่สามารถแตะได้ ดังนั้นนี่เป็นตัวเลือกของเรา:
- ส่งคำขอเพิ่มเติมจากลูกค้าหลังจากทำคำขอเริ่มต้นแล้ว
- เข้ารหัสสิ่งที่เซิร์ฟเวอร์พูดในคำขอเริ่มต้น
โซลูชั่น
นั่นคือคำถามหลักที่คุณควรถามตัวเองคือ:
ฉันกำลังเขียนเว็บไซต์หรือแอปพลิเคชันหรือไม่
เว็บไซต์ส่วนใหญ่ใช้หน้าเว็บและเวลาในการโหลดหน้าเว็บต้องเร็วที่สุดเท่าที่จะเป็นไปได้ (ตัวอย่างเช่น - Wikipedia) แอปพลิเคชันบนเว็บนั้นมี AJAX ที่หนักกว่าและมีการเดินทางไปกลับเป็นจำนวนมากเพื่อรับข้อมูลลูกค้าอย่างรวดเร็ว (ตัวอย่างเช่นแดชบอร์ดหุ้น)
เว็บไซต์
การส่งคำขอเพิ่มเติมจากไคลเอนต์หลังจากทำคำขอเริ่มต้นช้าเนื่องจากต้องการคำขอ HTTP เพิ่มเติมซึ่งมีค่าใช้จ่ายสูง ยิ่งไปกว่านั้นมันต้องการแบบอะซิงโครนัสเนื่องจากการร้องขอ AJAX ต้องการตัวจัดการสำหรับเมื่อมันเสร็จสมบูรณ์
ฉันจะไม่แนะนำให้ทำการร้องขออื่นนอกจากว่าเว็บไซต์ของคุณเป็นแอปพลิเคชันสำหรับรับข้อมูลนั้นจากเซิร์ฟเวอร์
คุณต้องการเวลาตอบสนองที่รวดเร็วซึ่งมีผลกระทบอย่างมากต่อการแปลงและเวลาโหลด การทำคำขอ Ajax นั้นช้าสำหรับช่วงเวลาเริ่มต้นในกรณีนี้และไม่จำเป็น
คุณมีสองวิธีในการแก้ไขปัญหานี้
- ตั้งค่าคุกกี้ - คุกกี้เป็นส่วนหัวที่ส่งในคำขอ HTTP ที่ทั้งเซิร์ฟเวอร์และไคลเอนต์สามารถอ่านได้
- เข้ารหัสตัวแปรเนื่องจาก JSON - JSON ดูใกล้กับวัตถุ JavaScript และวัตถุ JSON ส่วนใหญ่เป็นตัวแปร JavaScript ที่ถูกต้อง
การตั้งค่าคุกกี้นั้นไม่ยากจริง ๆ เพียงแค่คุณกำหนดค่า:
setcookie("MyCookie", $value); // Sets the cookie to the value, remember, do not
// Set it with HTTP only to true.
จากนั้นคุณสามารถอ่านด้วย JavaScriptโดยใช้document.cookie
:
นี่คือ parser ที่ใช้มือหมุนสั้น ๆ แต่คำตอบที่ฉันเชื่อมโยงกับด้านบนมีคำทดสอบที่ดีกว่า
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.
คุกกี้เป็นข้อมูลที่ดี นี่คือสิ่งที่บริการติดตามมักจะทำ
เมื่อเรามีข้อมูลเพิ่มเติมเราสามารถเข้ารหัสมันด้วย 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 ของเราจะขอข้อมูลและแสดงข้อมูลแทนที่จะขอรหัสหรือโครงร่าง สิ่งนี้สะอาดและเริ่มชำระเงินเมื่อแอปพลิเคชันเริ่มสูงขึ้น นอกจากนี้ยังแยกความกังวลได้ดีขึ้นและช่วยให้สามารถทดสอบรหัสฝั่งไคลเอ็นต์โดยไม่ต้องใช้เทคโนโลยีด้านเซิร์ฟเวอร์ใด ๆ ที่เกี่ยวข้องซึ่งเป็นข้อดีอีกข้อหนึ่ง
Postscript:คุณต้องระวังการโจมตีของเว็กเตอร์ XSS มากเมื่อคุณฉีดอะไรจาก PHP ไปยังจาวาสคริปต์ เป็นเรื่องยากมากที่จะหลีกเลี่ยงค่าที่เหมาะสมและบริบทนั้นไว หากคุณไม่แน่ใจวิธีการจัดการกับ XSS หรือไม่รู้มัน - โปรดอ่านบทความ OWASP นี้ , คนนี้และคำถามนี้
myPlugin.start(<?=$val?>
โดยเจตนาหรือไม่? เป็นความจริงหรือไม่ที่ "บางครั้งใช้งานได้"