কিছু চিত্রের জন্য ক্যাশে অক্ষম করুন


113

আমি পিএইচপি লিব ব্যবহার করে কিছু চিত্র তৈরি করি।

কখনও কখনও ব্রাউজারটি নতুন উত্পন্ন ফাইল লোড করে না।

কেবলমাত্র আমার দ্বারা গতিশীল তৈরি করা চিত্রগুলির জন্য আমি কীভাবে অক্ষম করতে পারি?

দ্রষ্টব্য: সময়ের সাথে সাথে তৈরি চিত্রগুলির জন্য আমাকে একই নাম ব্যবহার করতে হবে।

উত্তর:


233

এই সমস্যার একটি সাধারণ এবং সাধারণ সমাধান যা হ্যাকের মতো মনে হয় তবে মোটামুটি বহনযোগ্য এটি হ'ল গতিশীল চিত্রটির জন্য প্রতিটি অনুরোধে এলোমেলোভাবে উত্পন্ন উত্পন্ন ক্যোয়ারী স্ট্রিং যুক্ত করা।

সুতরাং, উদাহরণস্বরূপ -

<img src="image.png" />

হবে

<img src="image.png?dummy=8484744" />

অথবা

<img src="image.png?dummy=371662" />

ওয়েব-সার্ভারের দৃষ্টিকোণ থেকে একই ফাইলটি অ্যাক্সেস করা হয় তবে ব্রাউজারের দৃষ্টিকোণ থেকে কোনও ক্যাচিং করা যায় না।

পৃষ্ঠাটি পরিবেশন করার সময় এলোমেলো সংখ্যা জেনারেশনটি সার্ভারে ঘটতে পারে (কেবল নিশ্চিত করুন যে পৃষ্ঠাটি নিজেই ক্যাশেড নয় ...) অথবা ক্লায়েন্টে (জাভাস্ক্রিপ্ট ব্যবহার করে)।

আপনার ওয়েব-সার্ভার এই কৌশলটি মোকাবেলা করতে পারে কিনা তা যাচাই করতে হবে।


87
এলোমেলো সংখ্যার পরিবর্তে, ডেটা পরিবর্তিত টাইমস্ট্যাম্প বা প্রতিবিম্বিত ডেটার একটি সংস্করণ নম্বর ব্যবহার করুন।
lhunath


19
দয়া করে নোট করুন: আপনি আসলে ব্রাউজারটিকে চিত্রটি ক্যাশে করা থেকে বিরত করেন না, আপনি কেবল ক্যাশেড ইমেজটি দেখানো থেকে বিরত হন। আপনার ইমেজে যথাযথ শিরোনাম প্রয়োগ করা উত্তম উপায় ইমো (নীচে লুনাথের সমাধান দেখুন)। যেহেতু আপনি যে চিত্রগুলিতে ক্যাশে রাখতে চান তার জন্য কম ক্যাশে স্থান দেওয়ার ব্যয় নিয়ে আপনি যে চিত্রগুলি ক্যাশে করতে চান না সেগুলি দিয়ে আপনি অকারণে ক্যাশেও পূরণ করেন।
জোস

আমি বিশ্বাস করি যে এই নিবন্ধটি এরকম আচরণের কারণ ব্যাখ্যা করে।
ধাতব কোডার

1
এটি সত্যিই কাজ করে না, চিত্রটিকে অন্যভাবে ফ্লাশ করা দরকার (সাধারণত চিত্রের ক্রপিংয়ে চিত্রটি একই থাকে)
বেন

44

ব্রাউজার ক্যাচিং কৌশলগুলি HTTP শিরোনাম দ্বারা নিয়ন্ত্রিত হতে পারে। মনে রাখবেন যে এগুলি সত্যই সত্য। ব্রাউজারগুলি যেহেতু এই (এবং অন্য কোনও) ক্ষেত্রে মারাত্মকভাবে বেমানান, তাই আপনাকে বিভিন্ন ব্রাউজারে পছন্দসই প্রভাব পেতে বেশ কয়েকটি শিরোনামের প্রয়োজন need

header ("Pragma-directive: no-cache");
header ("Cache-directive: no-cache");
header ("Cache-control: no-cache");
header ("Pragma: no-cache");
header ("Expires: 0");

1
এটি পুরো পৃষ্ঠায় আবেদন করবে .... আমি কেবল একটি চিত্রের জন্য ক্যাশে অক্ষম করতে পারি না (সেই পৃষ্ঠা থেকে একটি নির্দিষ্ট চিত্র)?
ডোল ডগ

5
@ থরপ: এটি HTTP প্রতিক্রিয়াগুলিতে প্রযোজ্য। প্রতিক্রিয়াতে যা রয়েছে তা অপ্রাসঙ্গিক। তা চিত্রের ডেটা, এইচটিএমএল ডেটা বা অন্য যাই হোক না কেন যদি এটি কাজ না করে, আপনি সম্ভবত এটি সঠিকভাবে করেননি। আপনার প্রতিক্রিয়াতে HTTP শিরোনামগুলি পরীক্ষা করুন যাতে সেগুলি সঠিকভাবে অর্পণ করা হয়েছে কিনা to
lhunath

আমি আশা করি এটি কাজ করেছে ... ক্রোমের কোনও সমস্যা না থাকলেও ফায়ারফক্স ১৪ এবং আইই ৮ ছবিটির উপরের শিরোনামগুলি প্রেরণ করা সত্ত্বেও চিত্রগুলি রিফ্রেশ করতে অস্বীকার করেছে। এটি ক্যোরি স্ট্রিংয়ে কিছু স্বেচ্ছাসেবী পরামিতি যুক্ত করার চেয়ে অনেক ক্লিনার সমাধান হত। দীর্ঘশ্বাস
ফেলুন

2
@ পাওলক্রাওকিয়াক নোট করুন যে শিরোনামগুলি যোগ করা ইতোমধ্যে ক্যাশে হওয়া চিত্রগুলির জন্য কাজ করবে না , যেহেতু ব্রাউজারটি তাদের সম্পর্কে সার্ভারকে জিজ্ঞাসা করে না এবং তাই হেডারগুলি কখনই দেখতে পাবে না। আপনার যুক্ত করার পরে যে কোনও চিত্র অনুরোধের জন্য তারা কাজ করবে।
lhunath

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

12

আপনার যদি জাভাস্ক্রিপ্ট ব্যবহার করে ব্রাউজারে গতিশীলভাবে এটি করার দরকার হয় তবে এখানে একটি উদাহরণ ...

<img id=graph alt="" 
  src="http://www.kitco.com/images/live/gold.gif" 
  />

<script language="javascript" type="text/javascript">
    var d = new Date(); 
    document.getElementById("graph").src = 
      "http://www.kitco.com/images/live/gold.gif?ver=" + 
       d.getTime();
</script>

12

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

সমাধান 2 অকেজো। যোগ করার পদ্ধতি nocacheচিত্র ফাইলের সঙ্গে হেডার শুধুমাত্র খুব কঠিন বাস্তবায়ন নয়, কিন্তু এটি সম্পূর্ণ অবাস্তব কারণ এটা করতে হবে যখন এটি আগাম প্রয়োজন হবে ভবিষ্যদ্বাণী করা , প্রথমবার যদি আপনি কোন ইমেজ যা আপনি কি মনে করেন লোড শক্তি ভবিষ্যতে কিছু সময়ে পরিবর্তন ।

Etags প্রবেশ করুন ...

পরম শ্রেষ্ঠ উপায় আমি এই সমস্যা সমাধানের পেয়েছি ব্যবহার করা ETAGS একটি .htaccess ভিতরে আপনার ছবি ডিরেক্টরির মধ্যে ফাইল। নিম্নলিখিতটি অ্যাপাচিকে চিত্র ফাইলের শিরোনামগুলির ব্রাউজারে একটি অনন্য হ্যাশ প্রেরণ করতে বলে। এই হ্যাশটি কেবল তখনই পরিবর্তিত হয় যখন ইমেজ ফাইলটি সংশোধন করা হয় এবং এই পরিবর্তনটি ব্রাউজারটিকে পরের বার অনুরোধ করার পরে চিত্রটি পুনরায় লোড করতে ট্রিগার করে।

<FilesMatch "\.(jpg|jpeg)$">
FileETag MTime Size
</FilesMatch>

11

আমি সমস্ত উত্তর যাচাই করেছিলাম এবং সেরাটি মনে হয়েছিল (যা তা নয়):

<img src="image.png?cache=none">

প্রথমে.

তবে, আপনি যদি ক্যাশে = কোনওটি প্যারামিটার যোগ করেন না (যা স্থিতিশীল "কিছুই নয়" শব্দ হয়) তবে এটি কোনও কিছুর উপর প্রভাব ফেলবে না, ব্রাউজার এখনও ক্যাশে থেকে লোড হয়।

এই সমস্যার সমাধান ছিল:

<img src="image.png?nocache=<?php echo time(); ?>">

যেখানে আপনি প্যারামিটারটিকে গতিশীল করতে এবং কোনও ক্যাশে তৈরি করতে মূলত ইউনিক্স টাইমস্ট্যাম্প যুক্ত করেছেন, এটি কার্যকর হয়েছে।

তবে, আমার সমস্যাটি কিছুটা আলাদা ছিল: আমি ফ্লাই জেনারেটেড পিএইচপি চার্ট চিত্রটি লোড করছিলাম এবং $ _GET পরামিতি সহ পৃষ্ঠাটি নিয়ন্ত্রণ করছিলাম। ইউআরএল জিইটি প্যারামিটার একই থাকে এবং যখন জিইটি প্যারামিটারগুলি পরিবর্তিত হয় তখন আমি ক্যাশে থেকে চিত্রটি পড়তে চেয়েছিলাম।

এই সমস্যাটি সমাধান করার জন্য, আমার হ্যাশ needed _GET দরকার ছিল তবে এটি অ্যারে হওয়ায় এটি সমাধান:

$chart_hash = md5(implode('-', $_GET));
echo "<img src='/images/mychart.png?hash=$chart_hash'>";

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

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

echo "<img src='/images/mychart.png?hash=" . filemtime('mychart.png') . "'>";

ফাইলমাইম () ফাইল পরিবর্তনের সময় পায়।


4

আমি জানি এই বিষয়টি পুরানো, তবে গুগলে এটি বেশ ভাল। আমি জানতে পেরেছি যে এটি আপনার হেডারে রেখে দেওয়া ভাল কাজ করে;

<meta Http-Equiv="Cache-Control" Content="no-cache">
<meta Http-Equiv="Pragma" Content="no-cache">
<meta Http-Equiv="Expires" Content="0">
<meta Http-Equiv="Pragma-directive: no-cache">
<meta Http-Equiv="Cache-directive: no-cache">

আধুনিক ব্রাউজার দুর্ভাগ্যক্রমে এই নির্দেশনাগুলি অগ্রাহ্য করছে, সুতরাং এই সমাধানটি কেবল কিছু ব্রাউজারগুলিতেই কাজ করতে পারে, এটি কেবল নির্দিষ্ট চিত্র নয়, সমস্ত কিছুর জন্য ক্যাশে অক্ষম করে দেবে
ZioCain

4

আমি কেবল এটির সমাধান খুঁজছিলাম, এবং উপরের উত্তরগুলি আমার ক্ষেত্রে কার্যকর হয়নি (এবং এগুলিতে মন্তব্য করার ক্ষেত্রে আমার যথেষ্ট অপরিসীম আছে)। এটি প্রমাণিত হয়েছে যে অন্তত আমার ব্যবহারের ক্ষেত্রে এবং আমি যে ব্রাউজারটি ব্যবহার করছিলাম (ওএসএক্সে ক্রোম), কেবল ক্যাচিং প্রতিরোধ করার জন্য কেবল একমাত্র জিনিসটি হ'ল:

Cache-Control = 'no-store'

সম্পূর্ণতার জন্য আমি এখন 'নো-ক্যাশে, নো-স্টোর, তিনটি অবশ্যই পুনরায় চালু করতে চাই'

সুতরাং আমার ক্ষেত্রে (পাইথনের ফ্লাস্কের বাইরে গতিশীল উত্পন্ন চিত্রগুলির পরিবেশন করা), আশা করি যতটা সম্ভব ব্রাউজারে কাজ করার জন্য নিম্নলিখিতগুলি করতে হয়েছিল ...

def make_uncached_response(inFile):
    response = make_response(inFile)
    response.headers['Pragma-Directive'] = 'no-cache'
    response.headers['Cache-Directive'] = 'no-cache'
    response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
    response.headers['Pragma'] = 'no-cache'
    response.headers['Expires'] = '0'
    return response

প্রতিক্রিয়াটির জন্য কেবল কোনও স্টোর রাখা আমার পক্ষে এটি কাজ করার জন্য যথেষ্ট ছিল
scourge192

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

3

চিত্রের উত্স পরিবর্তন করা সমাধান। আপনি ইমেজটিতে একটি টাইমস্ট্যাম্প বা এলোমেলো নম্বর যোগ করে এটি করতে পারেন।

চিত্রের প্রতিনিধিত্ব করে এমন ডেটা যেমন উদাহরণস্বরূপ একটি চেকসাম যুক্ত করা ভাল। এটি সম্ভব হলে ক্যাচিং সক্ষম করে।


1

গুচ্ছটিতে আরও একটি সমাধান যুক্ত করা যাক।

শেষে একটি অনন্য স্ট্রিং যুক্ত করা একটি নিখুঁত সমাধান।

example.jpg?646413154

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

চিত্রটি আপডেট করা হলে ফাইলটাইম পরিবর্তন হবে।

<?php
$filename = "path/to/images/example.jpg";
$filemtime = filemtime($filename);
?>

এখন চিত্রটি আউটপুট করুন:

<img src="images/example.jpg?<?php echo $filemtime; ?>" >

1
যা আমি ক্যাশেডের বৈধতার কারণে ব্যবহার করেছি।
জিন

1

আমি এই সমস্যা ছিল এবং এই মত কাটিয়ে ওঠা।

var newtags='<div class="addedimage"><h5>preview image</h5><img src="'+one+'?nocache='+Math.floor(Math.random() * 1000)+'"></div>';

0

আমি আমার অনুরূপ সমস্যা সমাধানের জন্য এটি ব্যবহার করেছি ... একটি চিত্রের কাউন্টার প্রদর্শিত হচ্ছে (বাহ্যিক সরবরাহকারী থেকে)। এটি সর্বদা সঠিকভাবে রিফ্রেশ হয়নি। এবং এলোমেলো প্যারামিটার যুক্ত হওয়ার পরে, সমস্ত ঠিকঠাক কাজ করে :)

কমপক্ষে প্রতি মিনিটে রিফ্রেশ নিশ্চিত করতে আমি একটি তারিখের স্ট্রিং যুক্ত করেছি।

নমুনা কোড (পিএইচপি):

$output .= "<img src=\"http://xy.somecounter.com/?id=1234567890&".date(ymdHi)."\" alt=\"somecounter.com\" style=\"border:none;\">";

এর ফলে একটি srcলিঙ্কে ফলাফল :

http://xy.somecounter.com/?id=1234567890&1207241014

0

আপনার যদি হার্ডকডযুক্ত চিত্র URL থাকে তবে উদাহরণস্বরূপ: http://example.com/image.jpg আপনি আপনার চিত্রটিতে শিরোনাম যুক্ত করতে পিএইচপি ব্যবহার করতে পারেন।

প্রথমে আপনাকে app প্রক্রিয়াটি আপনার jpg পিএইচপি হিসাবে তৈরি করতে হবে। এখানে দেখুন: এক্সটেনশন file.php.jpg দিয়ে পিএইচপি চালানো সম্ভব?

ফাইল থেকে চিত্রটি (ইমেজক্রিয়াট্রোমজপেইগ) লোড করুন তারপরে পূর্ববর্তী উত্তরগুলি থেকে শিরোনাম যুক্ত করুন। শিরোনামগুলি যুক্ত করতে পিএইচপি ফাংশন শিরোনাম ব্যবহার করুন।

তারপরে ইমেজজেপিগ ফাংশন সহ চিত্রটি আউটপুট করুন।

দয়া করে লক্ষ্য করুন যে পিএইচপি প্রক্রিয়াটি jpg চিত্রগুলিকে প্রস্থান করতে এটি অত্যন্ত সুরক্ষিত। এছাড়াও দয়া করে সচেতন থাকুন আমি এই সমাধানটি পরীক্ষা করি নি তাই এটি কাজ করা আপনার নিজের উপর নির্ভর করে।


-1

সরল, একটি শিরোনামের অবস্থান পাঠান।

আমার সাইটটিতে একটি চিত্র রয়েছে এবং চিত্রটি আপলোড করার পরে কোনও পরিবর্তন হয় না, তারপরে আমি এই কোডটি যুক্ত করি:

<?php header("Location: pagelocalimage.php"); ?>

আমার জন্য কাজ কর.

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