क्या यह ठीक है अगर पहली प्रतिक्रिया AppCache (Symfony2) के साथ निजी है?


140

मैं http कैशिंग का उपयोग करने की कोशिश कर रहा हूं। अपने नियंत्रक में मैं एक प्रतिक्रिया इस प्रकार सेट कर रहा हूं:

$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);

देव विधा

देव माहौल में पहली प्रतिक्रिया 200 हेडर के साथ होती है:

cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT

अगले 2 मिनट के लिए हर प्रतिक्रिया के बाद हेडर के साथ एक 304 है:

cache-control:max-age=120, public, s-maxage=120

यह मूल रूप से है जो मैं यह होने की उम्मीद करता हूं।

ठेस मोड

ठेस मोड प्रतिक्रिया में हेडर अलग हैं। ध्यान दें कि app.php में मैं AppCache में कर्नेल लपेटता हूं।

पहली प्रतिक्रिया 200 हेडर के साथ है:

cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT

तो यह एक निजी नो-कैश प्रतिक्रिया है।

हर अगले अनुरोध बहुत ज्यादा है जो मैं यह होने की उम्मीद करूँगा; निम्नलिखित हेडर के साथ एक 304:

cache-control:max-age=120, public, s-maxage=120

क्या मुझे इसकी चिंता करनी चाहिए? क्या यह एक अपेक्षित व्यवहार है?

अगर मैं वार्निश या अकामाई सर्वर को इसके सामने रखूं तो क्या होगा?

मैंने थोड़ी सी डिबगिंग की और मुझे लगा कि अंतिम-संशोधित हेडर के कारण प्रतिक्रिया निजी है। HttpCache कर्नेल कैश्ड प्रतिक्रिया ( HttpCache :: हैंडल) () विधि को अद्यतन करने के लिए EsiResponseCacheStrategy का उपयोग करता है

if (HttpKernelInterface::MASTER_REQUEST === $type) {
    $this->esiCacheStrategy->update($response);
}

EsiResponseCacheStrategy गैर संचित करने योग्य में एक प्रतिक्रिया बदल जाता है , तो इसे इस्तेमाल करता है या तो अंतिम-प्रतिक्रिया या ETag ( EsiResponseCacheStrategy :: ऐड () विधि):

if ($response->isValidateable()) {
    $this->cacheable = false;
} else {
    // ... 
}

यदि अंतिम-प्रतिक्रिया या ETag हेडर मौजूद है तो प्रतिक्रिया :: isValidateable () सही है।

यह कैश-कंट्रोल हेडर ( EsiResponseCacheStrategy :: update () मेथड) को ओवरराइट करने का परिणाम है :

if (!$this->cacheable) {
    $response->headers->set('Cache-Control', 'no-cache, must-revalidate');

    return;
}

मैंने Symfony2 उपयोगकर्ता समूह पर यह प्रश्न पूछा था, लेकिन मुझे अब तक कोई उत्तर नहीं मिला: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion

अपडेट करें।

चूंकि अब मेरे पास मूल कोड तक पहुंच नहीं है इसलिए मैंने नवीनतम सिम्फनी मानक संस्करण के साथ परिदृश्य को पुन: पेश करने की कोशिश की ।

रिस्पॉन्स हेडर अब अधिक सुसंगत हैं, लेकिन अभी भी गलत प्रतीत होते हैं।

जैसे ही मैंने Last-Modifiedप्रतिक्रिया पर एक हेडर सेट किया , ब्राउज़र द्वारा की गई पहली प्रतिक्रिया में एक:

Cache-Control:must-revalidate, no-cache, private

दूसरी प्रतिक्रिया की उम्मीद है:

Cache-Control:max-age=120, public, s-maxage=120

अगर मैं If-Modified-Sinceहेडर भेजने से बचता हूं , तो हर अनुरोध वापस आ जाता है must-revalidate, no-cache, private

इससे कोई फर्क नहीं पड़ता कि अनुरोध अब prodया devपर्यावरण में किया गया था ।


3
जब मैं $ कर्नेल = नया AppCache ($ कर्नेल) अक्षम करता हूं; यह मुझे सार्वजनिक रूप से दिखाया गया है। लेकिन फिर यह हमेशा एक कोड 200 के साथ प्रतिक्रिया करेगा ... मैं एक पुंज प्रॉक्सी nginx के रूप में उपयोग करता हूं।
माइकल

क्या आप app.phpऔर app_dev.phpवही हैं? (डेब्यू और env की अनदेखी)
फ्लोरियन क्लेन

1
मेरी अब उस परियोजना तक कोई पहुँच नहीं है इसलिए मैं इसकी पुष्टि नहीं कर सकता। मुझे याद है कि नियंत्रक AppCache सक्षम के साथ डिफ़ॉल्ट थे।
जैकब ज़लास

1
@Florian मैंने समस्या को पुन: पेश करने की कोशिश की और मुझे नवीनतम सिम्फनी संस्करण (अपडेट देखें) के साथ थोड़ा अलग व्यवहार मिला है।
जैकब ज़लास

2
क्या आप debug=>trueAppCache में getOptions () में सेट करेंगे ताकि आपको X-Symfony-Cacheहेडर मिले?
डेन्किरोकूहात्सुदेन

जवाबों:


9

मैंने उसी समस्या का सामना किया है। मुझे 'cdn' पब्लिक हेडर की आपूर्ति करनी थी। डिफ़ॉल्ट रूप से जब गेटवे कैशिंग को प्रोडक्ट मोड में सक्षम किया जाता है, तो यह 200 ओके को निजी के साथ देता है, नोचे को हेडर को मान्य करना चाहिए।

मैंने इस तरह से समस्या हल की।

App.php में, इससे पहले कि मैं उपयोगकर्ता को प्रतिक्रिया भेजें ($ response-> भेजें), मैंने कैश कंट्रोल हेडर को खाली कर दिया है और कैश हेडर को सार्वजनिक और अधिकतम आयु (कुछ मूल्य) पर सेट कर दिया है।

// कोड स्निपेट app.php से

    $response = $kernel->handle($request);
    $response->headers->set('Cache-Control', '');
    $response->setPublic();
    $response->setMaxAge(86400);
    $response->send();        

क्या आपको इस तथ्य के बावजूद निजी प्रतिक्रिया मिली कि उन्हें एक नियंत्रक में सार्वजनिक रूप से सेट किया गया था?
जैकब ज़लास

हां, अगर मैं गेटवे कैशिंग को सक्षम करता हूं और इसे ठेस मोड में चलाता हूं। मुझे स्थिर सामग्री के लिए उपरोक्त समाधान की आवश्यकता थी।
श्रीकांतसत्तुरी

-4

आपके द्वारा अनुभव किया गया व्यवहार अभिप्रेत है। Symfony2 डॉक्स उन स्थितियों का स्पष्ट रूप से वर्णन करता है जब निजी और सार्वजनिक उपयोग किए जाते हैं, डिफ़ॉल्ट रूप से निजी होते हैं


यह मेरा मामला नहीं है, क्षमा करें।
जकूब ज़लास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.