मैं एक सरल उत्तर की कोशिश करने जा रहा हूं:
समस्या का स्पष्टीकरण
सबसे पहले, आइए घटनाओं के प्रवाह को समझते हैं जब एक पृष्ठ हमारे सर्वर से परोसा जाता है:
- पहले PHP चलाया जाता है, यह क्लाइंट को दी जाने वाली HTML उत्पन्न करता है।
- फिर, क्लाइंट को HTML डिलीवर कर दिया जाता है, उसके बाद PHP के साथ किया जाता है, मैं इस बात पर जोर देना चाहता हूं कि एक बार कोड सर्वर को छोड़ देगा - PHP इसके साथ किया जाता है और अब इसे एक्सेस नहीं कर सकता है।
- फिर, जावास्क्रिप्ट के साथ HTML क्लाइंट तक पहुंचता है, जो उस HTML पर जावास्क्रिप्ट को निष्पादित कर सकता है।
तो वास्तव में, यहाँ याद रखने वाली मुख्य बात यह है कि HTTP स्टेटलेस है । एक बार सर्वर के अनुरोध के बाद, सर्वर उसे छू नहीं सकता। तो, यह हमारे विकल्प छोड़ता है:
- प्रारंभिक अनुरोध किए जाने के बाद क्लाइंट से अधिक अनुरोध भेजें ।
- शुरुआती अनुरोध में सर्वर को जो कहना था, उसे एनकोड करें।
समाधान
यही मूल प्रश्न है जो आपको खुद से पूछना चाहिए:
क्या मैं वेबसाइट या एप्लिकेशन लिख रहा हूं?
वेबसाइटें मुख्य रूप से पृष्ठ आधारित हैं, और पृष्ठ लोड समय को जितनी जल्दी हो सके उतनी ही तेजी से करने की आवश्यकता है (उदाहरण के लिए - विकिपीडिया)। वेब एप्लिकेशन अधिक AJAX के भारी होते हैं और क्लाइंट फास्ट जानकारी (उदाहरण के लिए - एक स्टॉक डैशबोर्ड) प्राप्त करने के लिए बहुत सारी गोल यात्राएं करते हैं।
वेबसाइट
प्रारंभिक अनुरोध किए जाने के बाद क्लाइंट से अधिक अनुरोध भेजना धीमा है क्योंकि इसके लिए अधिक HTTP अनुरोधों की आवश्यकता होती है जिनके लिए महत्वपूर्ण ओवरहेड है। इसके अलावा, AJAX अनुरोध करने के लिए इसे अतुल्यकालिकता की आवश्यकता होती है जब इसे पूरा करने के लिए हैंडलर की आवश्यकता होती है।
जब तक आपकी साइट सर्वर से उस जानकारी को प्राप्त करने के लिए एक आवेदन नहीं है, मैं एक और अनुरोध करने की सिफारिश नहीं करूंगा ।
आप तेजी से प्रतिक्रिया समय चाहते हैं जिसका रूपांतरण और लोड समय पर भारी प्रभाव पड़ता है। इस मामले में प्रारंभिक अपटाइम के लिए अजाक्स अनुरोध करना धीमी और अनावश्यक है।
आपके पास समस्या से निपटने के दो तरीके हैं
- कुकी सेट करें - कुकीज़ HTTP अनुरोधों में भेजे गए हेडर हैं जो सर्वर और क्लाइंट दोनों पढ़ सकते हैं।
- चर को JSON के रूप में एन्कोड करें - JSON जावास्क्रिप्ट ऑब्जेक्ट्स के बहुत करीब दिखता है और अधिकांश JSON ऑब्जेक्ट्स जावास्क्रिप्ट वेरिएबल मान्य होते हैं।
कुकी सेट करना वास्तव में बहुत मुश्किल नहीं है, आप बस इसे एक मूल्य प्रदान करते हैं:
setcookie("MyCookie", $value); // Sets the cookie to the value, remember, do not
// Set it with HTTP only to true.
फिर, आप जावास्क्रिप्ट का उपयोग करके इसे पढ़ सकते हैं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.
कुकीज़ थोड़े डेटा के लिए अच्छी हैं। यह वही है जो ट्रैकिंग सेवाएं अक्सर करती हैं।
एक बार जब हमारे पास अधिक डेटा होता है, तो हम इसे JSON के साथ जावास्क्रिप्ट चर के अंदर एन्कोड कर सकते हैं:
<script>
var myServerData = <?=json_encode($value)?>; // Don't forget to sanitize
//server data
</script>
मान लिया जाए कि $value
यह json_encode
PHP की तरफ है (यह आमतौर पर है)। यह तकनीक वह है जो स्टैक ओवरफ्लो उदाहरण के लिए अपनी चैट के साथ करता है (केवल PHP के बजाय .NET का उपयोग करके)।
आवेदन
यदि आप एक एप्लिकेशन लिख रहे हैं - अचानक प्रारंभिक लोड समय हमेशा अनुप्रयोग के चल रहे प्रदर्शन जितना महत्वपूर्ण नहीं होता है, और यह डेटा और कोड को अलग-अलग लोड करने के लिए भुगतान करना शुरू कर देता है।
मेरा उत्तर यहां बताता है कि जावास्क्रिप्ट में AJAX का उपयोग करके डेटा को कैसे लोड किया जाए:
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
$>
इस तरह, हमारी जावास्क्रिप्ट फ़ाइल डेटा मांगती है और कोड या लेआउट के लिए पूछने के बजाय इसे दिखाती है। यह क्लीनर है और आवेदन अधिक होने के कारण भुगतान करना शुरू कर देता है। यह चिंताओं का बेहतर पृथक्करण भी है और यह बिना किसी सर्वर साइड तकनीक के क्लाइंट साइड कोड का परीक्षण करने की अनुमति देता है जो एक और प्लस है।
पोस्टस्क्रिप्ट: जब आप PHP से जावास्क्रिप्ट में कुछ भी इंजेक्ट करते हैं तो आपको XSS अटैक वैक्टर के बारे में बहुत जागरूक होना चाहिए । यह बहुत मान ठीक से बचने के लिए कठिन है और यह संदर्भ संवेदनशील है। यदि आप XSS से निपटने के बारे में अनिश्चित हैं, या इससे अनजान हैं - कृपया इस OWASP लेख , इस एक और इस प्रश्न को पढ़ें ।
myPlugin.start(<?=$val?>
जानबूझकर लापता क्लोजिंग कोष्ठक था ? क्या यह सच है कि "यह कभी-कभी काम करता है"?