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


ก็เป็นปัญหาของ 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');

คำสำคัญ (Tags): #ajax#ie#cache#header
หมายเลขบันทึก: 122329เขียนเมื่อ 27 สิงหาคม 2007 11:18 น. ()แก้ไขเมื่อ 23 มิถุนายน 2012 20:50 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (5)
อีกวิธีคือไปบังคับใน Web Server เลยครับ

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

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

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

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

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

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

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

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

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

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

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

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

แต่อาจมีปัญหาถ้า 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>

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท