การแก้ปัญหา cache กับ AJAX

Jdeper
  ก็เป็นปัญหาของ IE เจ้าเดิมแหละ แต่อันนี้ผมชอบของ IE แฮะ ก็มันตรง concept ของ AJAX ดีนะ  

เนื่องจาก IE นั้นมีความสามารถที่จะไปเรียก cache ที่เคยมีการร้องขอ(request) ไว้แล้วได้เลย โดยไม่ต้องติดต่อกับ server

จนหลายคนมักบ่นกันว่า ทำไมข้อมูลที่แสดงขึ้นมา มันยังไม่ update สักทีทั้ง ๆ ที่เพิ่งเพิ่มข้อมูลเข้าไปแล้วเห็น ๆ ในdatabase ก็มีแล้วนิ

จนต้องปิด browser แล้วเปิดขึ้นมาใหม่ 

วิธีแก้นั้นมี 2 วิธีก็คงแล้วแต่สถานะการณ์นะครับ ว่าอยากจะให้ได้ข้อมูลแบบไหน

วิธีที่ 1 คือการ set header ใ้้ห้หน้าที่ AJAX จะเรียกมาใช้ซึ่งแต่ละ ภาษานั้นก็คล้าย ๆ กัน ผมขอยกตัวอย่างสำหรับ asp และ php แล้วกันนะครับ

สำหรับ ASP
<%
Response.AddHeader "Last-Modified", Now & " GMT"
Response.AddHeader "Pragma", "no-cache"
Response.AddHeader "Cache-Control", "no-cache, must-revalidate"
Response.Expires = -1
Response.CacheControl = "no-cache"
%>

สำหรับ PHP
<?
     header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
     header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
     header ("Cache-Control: no-cache, must-revalidate");
     header ("Pragma: no-cache");
?>

วิธีที่2  จะเป็นการหลอกมันด้วยการส่ง parameter ที่จะได้ค่าสุ่ม (random) หรือ ค่าวันและเวลาก็ได้ แต่ละครั้งที่มีการ request พ่วงท้ายไปด้วย 
เช่น  httpRep.open('get','./search.php?txt='+txt+'&temp='+Math.random(),'true');

บันทึกนี้เขียนที่ GotoKnow โดย  ใน AJedo Techblog ||

คำสำคัญ (Tags)#ajax#ie#cache#header

หมายเลขบันทึก: 122329, เขียน: 27 Aug 2007 @ 11:18 () , แก้ไข, 23 Jun 2012 @ 20:50 (),  | , สัญญาอนุญาต: สงวนสิทธิ์ทุกประการ, ความเห็น: 5, อ่าน: คลิก
บันทึกล่าสุด


ความเห็น (5)

อีกวิธีคือไปบังคับใน Web Server เลยครับ
Jdeper
เขียนเมื่อ 

ขอบคุณมากครับคุณPatrickz มากครับที่ให้คำแนะนำ

ผมลองไปหาข้อมูลมาใหม่เลยทำให้ผมรู้ว่าผมเข้าใจผิดไปเยอะเลยทีเดียว

 ซึ่งผมได้แก้แล้วนะครับ

แต่ก็รู้แค่ 2 วิธีอยู่ดีนะครับ ส่วนวิธีที่คุณ Patrickz บอกว่าสามารถ บังคับ web server ได้เลยนั้น ไม่ทราบว่าเป็นแบบวิธีที่ 1 หรือเปล่าครับ

IP: xxx.7.147.92
เขียนเมื่อ 

ขอบคุณมากครับ หาอยู่นานกว่าจะเจอเวบนี้

IP: xxx.28.24.76
เขียนเมื่อ 

ใช้แล้วไม่ work อ่าค่า คือตอนนี้ทำเกี่ยวกับเรื่อง upload รูป

แต่พอ delete แล้วมันยังจำรูปเดิม

(delete โดยการ ลบรูปที่ต้องการแล้ว rename อีกรูป ให้กลายเป็นชื่อของรูปที่โดนลบไป)

แต่ถ้าไป set (temporary file)evey time i visit new page ของ ie ถึงจะ work

--เป็นไปได้มั้ย ว่ามัน ดู ค่าที่ set บน brower ใหญ่สุด โดยมองข้าม header เราไป

หาวิธีมา เดือนกว่า แล้ว ค่า ช่วยด้วย+++

jdeper
IP: xxx.24.223.93
เขียนเมื่อ 

ลองแบบนี้ดูครับ

แต่อาจมีปัญหาถ้า server มีการเีรียก ผ่าน proxy server วิธีนี้จะไม่ค่อยได้ผลนะครับ

image.php

<?php

header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

header ("Cache-Control: no-cache, must-revalidate");

header ("Pragma: no-cache");

header('Content-Type: image/jpeg');

readfile("images/testimg.png");

?>

display.html

<body>

<img src="image.php" />

</body>