কীভাবে পিএইচপি সাইটের ব্রাউজার ক্যাশে প্রতিরোধ করবেন


120

আমার ক্লাউড সার্ভারে একটি পিএইচপি সাইট চলছে। যখনই আমি নতুন ফাইল সিএসএস, জেএস বা চিত্র যুক্ত করি তখন ব্রাউজারটি ক্যাশে সঞ্চিত একই পুরানো জেএস, সিএসএস এবং চিত্র ফাইলগুলি লোড করছে।

আমার সাইটের নীচে একটি ডক্টাইপ এবং মেটা ট্যাগ রয়েছে

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <meta http-equiv="Page-Enter" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Page-Exit" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Site-Enter" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Site-Exit" content="blendTrans(Duration=1.0)">

উপরের ডক্টাইপ এবং মেটা কোডের কারণে আমি ব্রাউজারে ক্যাশে একই ফাইলগুলি নতুনের পরিবর্তে লোড করছি


No Cache in all Browsers। আপনি যে ফাইলগুলি ক্যাশে করতে চান না সেগুলিতে আপনি একটি "এলোমেলো জেনারেটেড নাম্বার "ও করতে পারেন।
কোডেমন

2
আপনি সম্ভবত সম্পূর্ণরূপে ইমেজ / JS / CSS এর জন্য অক্ষম ক্যাশে করতে চান না: stackoverflow.com/questions/4206224/...
FoolishSeth

নেক্রো প্রলোভন প্রতিরোধ, কিন্তু দয়া করে, যে কেউ এই বিবেচনা: থামান। ক্যাচিং নিয়ন্ত্রণ এবং ব্যবহার করতে শিখুন, কেবল কোনও অসুবিধাগ্রস্ত পর্বের কারণে এটি অন্ধভাবে অক্ষম করবেন না। এইচটিটিপি-র সংজ্ঞা গাইড থেকে ক্যাচিংয়ের অধ্যায়টি পড়ুন - এই বইটি (এবং আরএফসি) অবশ্যই একটি পরীক্ষা সহ বাধ্যতামূলক পাঠযোগ্য হওয়া উচিত। কীভাবে সর্বশেষ-সংশোধিত নির্দিষ্ট করতে হবে, যদি-সংশোধিত-এর থেকে প্রতিক্রিয়া জানায় এবং ETag শনাক্তকরণটি ব্যবহার করে তা শিখুন। তারপরে সম্পদটি আপডেট হয়ে গেলে ব্রাউজারগুলিকে অবহিত করা হবে যখন 304 আরও একবার 200 হয়ে যায়।
amcgregor

উত্তর:


282

এটা চেষ্টা কর

<?php

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>

6
"সর্বোচ্চ-বয়স = 0" ব্যতীত, সেগুলি হ'ল পিএইচপি দ্বারা প্রেরণ করা হয় আমার ইনস্টলেশনটিতে উপরেরটি নির্দিষ্ট করে না দিয়ে .. দেখে মনে হচ্ছে পিএইচপি ডিফল্টরূপে ব্রাউজারের ক্যাচিং প্রতিরোধ করার চেষ্টা করে ...
দ্রুত-প্রতিচ্ছবি

1
আমার কাছে একটি ওয়ার্ডপ্রেস প্লাগইন রয়েছে যা ইন্টারনেট এক্সপ্লোরারের পুরানো সংস্করণগুলিতে একটি বিকল্প থিম প্রেরণ করে এবং এটি কিছু ক্যাচিং সিস্টেমে খারাপভাবে ভেঙে ফেলা হচ্ছে। এই পোস্টটি আমার প্রথম গুগল অনুসন্ধানে উঠে এসেছে। ভালো খেলেছ.
অনুজ্ঞাসূচক

3
মনে রাখবেন যে এটি এইচটিএমএল এর ভিতরে এম্বেড করা যাবে না; এটি পৃষ্ঠার একেবারে শীর্ষে থাকা উচিত।
হান্টার এস

9
দ্রষ্টব্য: আপনি যদি session_start()পরে ব্যবহার করেন তবে এটি আপনার শিরোনামটিকে ওভাররাইট করে দেবে Cache-Control: private, max-age=10800, pre-check=10800কারণ 180 মিনিটের ডিফল্ট মান session.cache_expire। আপনি যদি সেশন শুরু করা এড়াতে না পারেন তবে আপনার ক্যাশে ব্যবহার নিষ্ক্রিয় করা দরকার session_cache_limiter('private');session_cache_expire(0);
মিগ্লুট

2
@thdoan headerফাংশনের দ্বিতীয় প্যারামিটারটি প্রতিস্থাপনের জন্য একটি বুলিয়ান । Alচ্ছিক প্রতিস্থাপনের প্যারামিটারটি নির্দেশ করে যে শিরোনামটি আগের অনুরূপ শিরোনামটি প্রতিস্থাপন করা উচিত, বা একই ধরণের দ্বিতীয় শিরোনাম যুক্ত করা উচিত।
mrRiiha

36

এখানে, আপনি যদি এইচটিএমএল এর মাধ্যমে এটি নিয়ন্ত্রণ করতে চান: বিকল্প 1 এর নীচে করুন :

<meta http-equiv="expires" content="Sun, 01 Jan 2014 00:00:00 GMT"/>
<meta http-equiv="pragma" content="no-cache" />

এবং যদি আপনি পিএইচপি এর মাধ্যমে এটি নিয়ন্ত্রণ করতে চান: বিকল্প 2 এর নীচে এটি করুন :

header('Expires: Sun, 01 Jan 2014 00:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');

প্রক্সি ভিত্তিক ক্যাচিং সমস্যা এড়াতে এবং বিকল্প 2 সর্বদা ভাল B


10

আপনি এটি চেষ্টা করতে পারেন:

    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Connection: close");

আশা করি এটি ক্যাশে প্রতিরোধে সহায়তা করবে, যদি থাকে!


এটি কেবল এইচটিএমএল ফাইলের ক্যাচিংয়ের সাথে সম্পর্কিত? এবং ইটাগের সাথে কিছু করার নেই? ধন্যবাদ!
স্যাম লেভিন

4
ঠিক প্রথম লাইনে পুরোপুরি যথেষ্ট হওয়া উচিত। 5 তম লাইনটি আসলে সরল ভুল এবং সার্ভারের প্রতিক্রিয়াতে কিছুই করার নেই (এটি একটি অনুরোধ শিরোনাম)। ষষ্ঠ লাইনে যাই হোক না কেন কোনও প্রভাব থাকবে না। আমি যেতে পারতাম ...
দ্য স্যারিকান

শটগান পদ্ধতির: সবকিছু দেয়ালে ফেলে দিন, আশা করি কিছু লাঠি আছে। এই প্রশ্নটিতে আমার মন্তব্য অনুসারে, আমি অত্যন্ত এইচটিটিপি: সংজ্ঞা নির্দেশিকা এবং ক্যাশিংয়ের উপরের অধ্যায়টি পড়ার সুপারিশ করতে পারি । আরএফসিও, তবে সেগুলি পড়া একটি স্বতন্ত্র দক্ষতা। ("সংযোগ: বন্ধ" হ'ল একটি হাসিখুশি পদক্ষেপ যা অনুরোধগুলির দক্ষ পাইপলাইন অক্ষম করে, বা কিছুই করবে না, তবে আমার সন্দেহ হয় যে পিএইচপি আসলে এটি দিয়ে যেতে পারে))
amcgregor

7

আমার সিএসএস ফাইলগুলি ক্যাশে করার ক্ষেত্রে আমার সমস্যা ছিল। পিএইচপি-তে শিরোনামগুলি সেট করা আমাকে সাহায্য করেনি (সম্ভবত এই কারণে যে পৃষ্ঠাগুলির সাথে লিঙ্ক করার পরিবর্তে শিরোনামগুলি স্টাইলশিট ফাইলে সেট করা দরকার ছিল?)।

আমি এই পৃষ্ঠায় সমাধানটি পেয়েছি: https://css-tricks.com/can-we-prevent-css-caching/

সমাধান:

সংযুক্ত ফাইলের জন্য ইউআরআইয়ের ক্যোয়ারী অংশ হিসাবে টাইমস্ট্যাম্প যুক্ত করুন।
(সিএসএস, জেএস, চিত্র ইত্যাদির জন্য ব্যবহার করা যেতে পারে)

উন্নয়নের জন্য:

<link rel="stylesheet" href="style.css?<?php echo date('Y-m-d_H:i:s'); ?>">

উত্পাদনের জন্য (যেখানে ক্যাশিং বেশিরভাগ ভাল জিনিস):

<link rel="stylesheet" type="text/css" href="style.css?version=3.2">
(এবং যখন প্রয়োজন হবে ম্যানুয়ালি পুনরায় লিখুন)

বা এই দুটি সংমিশ্রণ:

<?php
    define( "DEBUGGING", true ); // or false in production enviroment
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo (DEBUGGING) ? date('_Y-m-d_H:i:s') : ""; ?>">

সম্পাদনা করুন:

বা এই দু'জনের সুন্দর সমন্বয়:

<?php
    // Init
    define( "DEBUGGING", true ); // or false in production enviroment
    // Functions
    function get_cache_prevent_string( $always = false ) {
        return (DEBUGGING || $always) ? date('_Y-m-d_H:i:s') : "";
    }
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo get_cache_prevent_string(); ?>">

স্বেচ্ছাসেবী সংস্করণ, বর্তমান টাইমস্ট্যাম্পস (সম্পূর্ণরূপে ক্যাচকে পরাস্ত করা)… তবে "ডিবাগিং" পতাকা নির্বিশেষে বা সত্যিকার অর্থে এমন একটি জিনিস যা সত্যিকার অর্থে এবং কাজ করে না। আপনি ফাইলটির আসল এমটাইম ব্যবহার করছেন না কেন? তারপরে আপনার আক্ষরিক কখনও পিএইচপি আপডেট করার দরকার পড়বে না এবং ক্যাশেগুলি সম্পূর্ণ এবং চমত্কারভাবে অকেজো হয়ে উঠবে না। অথবা কেবলমাত্র আপনার স্ট্যাটিক্সগুলি এনগিনেক্স বা অ্যাপাচি এর মতো সঠিকভাবে কনফিগার করা এইচটিটিপি সার্ভারের সাথে সরবরাহ করুন যা একটি উপযুক্ত সর্বশেষ-সংশোধিত এবং ইটাগ সেট করে। একইভাবে, ব্রাউজারে "ডিবাগিং" পতাকাটি ইতিমধ্যে বিদ্যমান exists (ক্যাশে অক্ষম করুন, ক্যাশে ছাড়াই রিফ্রেশ করুন, খালি ক্যাশে, ...)
এমসিগ্রিগোর

5

ব্রাউজারের ক্যাশে প্রতিরোধ করা কেসের উপর নির্ভর করে একটি ভাল ধারণা নয়। সমাধানের সন্ধানে আমি এর মতো সমাধান পেয়েছি:

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=filemtime($file);?>">

এখানে সমস্যাটি হ'ল যদি সার্ভারের আপডেটের সময় যদি ফাইলটি ওভাররাইট করা হয়, যা আমার দৃশ্যপট, ক্যাশে উপেক্ষা করা হবে কারণ টাইমস্ট্যাম্পটি সংশোধন করা হলেও ফাইলের বিষয়বস্তু একই।

আমি ব্রাউজারের বিষয়বস্তু পরিবর্তিত হলেই সম্পদগুলি ডাউনলোড করতে বাধ্য করার জন্য এই সমাধানটি ব্যবহার করি:

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=hash_file('md5', $file);?>">

বাবা! পারফরম্যান্স এবং স্কেল্যাবিলিটি জন্য সর্বদা আপনার সিএসএস / জেএস ফাইলগুলি সমস্ত আকার / হ্যাশ যাচাই করতে মূল থ্রেডে লোড করা ততক্ষণ terrible
ডালিন

@ ডালিন আপনি জেন্টু সমৃদ্ধের কান্নার কান্নার আগে (উত্স এবং আর্কিটেকচারের সুরক্ষায় অতিরিক্ত সংকলন করে "দ্রুতগতিতে" পরিচিত একটি লিনাক্স) আমি একটি statকল করতাম । ফাইল সিস্টেম ক্যাশে ছাড়া, 16ns, টপস? ক্যাশে সহ, নির্ভরযোগ্য <8ns। ন্যানোসেকেন্ড। এবং আমার সিস্টেমে MD5 ঝাঁকুনি ছাড়াই 754 এমআইবি / গুলি প্রক্রিয়া করতে পারে। ( openssl speed md5) সম্মিলিত, একটি 100 কেবি সিএসএস ফাইলের… 129µs (মাইক্রোসেকেন্ডস, 0.1295 মিমি) + 8ns (যা অর্থপূর্ণভাবে চূড়ান্ত সংখ্যায় অবদান রাখে না) = 129µ এর সমন্বিত অতিরিক্ত ওভারহেড থাকবে।
amcgregor

আরও বিবেচনা করার পরে, এটি আমাকে বোঝায় যে একমাত্র "সঠিক" উত্তর (সর্বনিম্ন রক্ষণাবেক্ষণ বোঝা সহ, সবচেয়ে নির্ভুল / নির্ভরযোগ্য আচরণ) উভয়ই সবচেয়ে কম পক্ষে ভোট দিয়েছেন, এবং এই জাতীয় আপত্তিজনক এবং অবাস্তব কারণে কোনও এক মন্তব্যে বরখাস্ত।
amcgregor

আপনি এবং আমি সম্ভবত বিভিন্ন ওয়েবসাইটে কাজ করি। তবে আমি আমার মন্তব্যে দাঁড়িয়ে আছি। যদি কোনও মুহুর্তে ওয়েব পৃষ্ঠাগুলি বিতরণ করে এমন কয়েক দশকের সমতুল্য থ্রেড থাকে তবে আমি মনে করি এর থেকে আরও ভাল বিকল্প রয়েছে যে এটি এমনকি আপনার স্কেলযোগ্য কিনা তা নিয়ে প্রশ্ন করারও দরকার নেই। hash_file('md5', $deployment_counter)বা hash_file('md5', $cache_clear_counter)মনে হয় প্রথম হয়।
ডালিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.