যদি প্রথম প্রতিক্রিয়া অ্যাপক্যাচে (সিমফনি 2) ব্যক্তিগত হয় তবে তা কি ঠিক আছে?


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 এ আমি অ্যাপ্লিকেশানে কার্নেলটি গুটিয়ে রেখেছি।

প্রথম প্রতিক্রিয়া নিম্নোক্ত শিরোনাম সহ 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

আমি এটা সম্পর্কে চিন্তা করা উচিত? এটা কি প্রত্যাশিত আচরণ?

আমি যদি এর আগে ওয়ার্নিশ বা আকামাই সার্ভার রাখি তবে কী হবে?

আমি কিছুটা ডিবাগিং করেছি এবং আমি বুঝতে পেরেছি যে শেষ পরিবর্তনিত শিরোনামের কারণে প্রতিক্রিয়াটি ব্যক্তিগত। ক্যাচড রেসপন্স ( এইচটিটিপিচী :: হ্যান্ডেল () পদ্ধতি) আপডেট করার জন্য এইচটিটিপিচ কার্নেল EsiResponseCacheStrategy ব্যবহার করে

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

EsiResponseCacheStrategy কোনও প্রতিক্রিয়াটিকে নন-ক্যাশেয়ায় পরিণত করে যদি এটি লাস্ট-রেসপন্স বা ইটাগ ( এসিআরেস্পোনসক্যাচস্ট্রজি :: অ্যাড () পদ্ধতি) ব্যবহার করে:

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

প্রতিক্রিয়া :: লাস্ট-রেসপন্স বা ইটাগ শিরোনাম উপস্থিত থাকলে ভ্যালিডিয়েটেবল () সত্য দেয়।

এটি ক্যাশে-নিয়ন্ত্রণ শিরোনাম ( EsiResponseCacheStrategy :: আপডেট () পদ্ধতি) ওভাররাইটিংয়ের ফলস্বরূপ :

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

    return;
}

আমি এই প্রশ্নটি সিমফনি 2 ব্যবহারকারী গোষ্ঠীতে জিজ্ঞাসা করেছি তবে আমি এখন পর্যন্ত কোনও উত্তর পাইনি: 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
যখন আমি $ কার্নেল = নতুন অ্যাপক্যাস ($ কার্নেল) অক্ষম করি; এটি আমার কাছে প্রকাশ্য হিসাবে দেখানো হয়েছে। তবে তারপরে এটি সর্বদা 200 200 কোড সহ প্রতিক্রিয়া জানাবে ... আমি রিভারি প্রক্সি এনজিনেক্স হিসাবে ব্যবহার করি।
মাইকেল

আপনার app.phpএবং app_dev.phpএকই? (ডিবাগ এবং env উপেক্ষা করে)
ফ্লোরিয়ান ক্লিন

1
এই প্রকল্পে আমার আর অ্যাক্সেস নেই তাই আমি এটি নিশ্চিত করতে পারছি না। আমার মনে আছে অ্যাপলক্যাশ সক্ষম থাকা কন্ট্রোলাররা ডিফল্ট ছিল।
জাকুব জালাস

1
@ ফ্লোরিয়ান আমি সমস্যার পুনঃপ্রজনন করার চেষ্টা করেছি এবং সর্বশেষ সিমফনি সংস্করণটির সাথে আমার কিছুটা আলাদা আচরণ হয়েছে (একটি আপডেট দেখুন)।
জাকুব জালাস

2
আপনি শিরোনাম debug=>trueপেতে যাতে আপনি অ্যাপক্যাচে getOptions () সেট আপ করতে পারেন X-Symfony-Cache?
ডেনকিরিওকাহাটসুডেন

উত্তর:


9

আমিও একই সমস্যার মুখোমুখি হয়েছি। আমাকে আমার সিডিএন 'পাবলিক' শিরোনাম সরবরাহ করতে হয়েছিল। ডিফল্টরূপে যখন গেটওয়ে ক্যাচিং প্রোড মোডে সক্ষম হয়, এটি ব্যক্তিগত সাথে 200 ওকে ফিরিয়ে দেয়, নোকেচ অবশ্যই শিরোনামকে বৈধ করে তুলবে।

আমি এইভাবে সমস্যার সমাধান করেছি।

অ্যাপ.এফপি-তে আমি ব্যবহারকারীর কাছে প্রতিক্রিয়া প্রেরণের আগে ($ প্রতিক্রিয়া-> প্রেরণ), আমি ক্যাশে নিয়ন্ত্রণ শিরোনামটি ফাঁকাতে ওভাররাইট করেছি এবং ক্যাশে শিরোনামগুলি সর্বজনীন এবং সর্বোচ্চ বয়সের (কিছু মান) সেট করে রেখেছি।

app.php থেকে // কোড স্নিপেট

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

একটি নিয়ামক হিসাবে জনসাধারণ সেট করা সত্ত্বেও আপনি ব্যক্তিগত প্রতিক্রিয়া পেয়েছেন?
জাকুব জালাস

হ্যাঁ, আমি যদি গেটওয়ে ক্যাচিং সক্ষম করি এবং এটি প্রোড মোডে চালিত করি। স্থির বিষয়বস্তুর জন্য আমার উপরের সমাধান প্রয়োজন।
শ্রীকণ্ঠসতুরি

-4

আপনি যে আচরণটি অনুভব করছেন এটি উদ্দেশ্য। Symfony2 ডক্স স্পষ্টভাবে যখন পরিস্থিতিতে বর্ণনা ব্যক্তিগত এবং পাবলিক , ব্যবহার করা হয় ডিফল্ট হচ্ছে ব্যক্তিগত


দুঃখিত, এটা আমার ঘটনা নয়।
জাকুব জালাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.