2010-06-29 11 views
14

Tôi có một danh sách các mục, cũng chứa một hình thu nhỏ của hình ảnh. Đôi khi tôi cần thay đổi hình thu nhỏ, nhưng giữ nguyên tên tệp. Có cách nào để buộc trình duyệt tải xuống hình ảnh mới tải lên thay vì lấy một hình ảnh từ bộ nhớ cache của trình duyệt không?Làm thế nào để xóa bộ nhớ cache của trình duyệt khi tải lên lại hình ảnh có cùng tên tệp, trong php?

Điều này rất phù hợp khi mọi người cập nhật hình đại diện của họ, điều này gây nhầm lẫn cho một số người dùng, những người vẫn nhìn thấy hình đại diện cũ của họ cho đến khi họ xóa bộ nhớ cache của trình duyệt hoặc khởi động lại trình duyệt.

Trả lời

2

Bạn có thể làm mất hiệu lực bộ nhớ cache cho toàn bộ trang bằng cách thay đổi headers:

<?php 
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
?> 
+2

này sẽ không may làm cho bộ nhớ đệm của tệp không thể, tăng thời gian tải trang và chi phí băng thông. –

+3

Sau đó, chỉ thực hiện sau khi tải lên? –

1

Khi gửi ra các hình ảnh, đảm bảo không gửi bất kỳ Expires tiêu đề. Đồng thời, hãy xem xét việc gửi tiêu đề bộ nhớ cache này:

Cache-Control: must-revalidate 

Điều này sẽ khiến trình duyệt hỏi máy chủ của bạn hình ảnh mọi lúc. Theo dõi tiêu đề If-Modified-Since trong yêu cầu; nếu hình ảnh không được sửa đổi, hãy trả lời bằng mã HTTP 304.

Toàn bộ thủ tục này (phải xác nhận lại, Nếu được sửa đổi từ, câu trả lời 304) sẽ làm cho trình duyệt có thể lưu nội dung hình ảnh nhưng đồng thời yêu cầu máy chủ của bạn nếu tệp đã thay đổi.


khác, có lẽ đơn giản hơn, giải pháp là chỉ đặt một tiêu đề Expires một thời gian ngắn trong tương lai Ví dụ mười phút, và thông báo cho người sử dụng sự chậm trễ mười phút. Điều này sẽ tăng tốc độ tải trang nhất vì không cần thực hiện bất kỳ yêu cầu HTTP nào cho hình ảnh.

+0

Bạn có ý nghĩa gì khi "gửi hình ảnh"? Sau khi tôi tải lên một hình ảnh, và sử dụng tiêu đề ("Location: whatever.php"); ? –

+0

Không, ý tôi là khi ai đó yêu cầu tệp hình ảnh, nghĩa là yêu cầu HTTP cho /example/image.jpg –

5

Bạn có thể sử dụng thời gian sửa đổi của tập tin:

<? 

$filename = 'avatar.jpg'; 
$filemtime = filemtime($filename); 

echo "<img src='".$filename."?".$filemtime."'>"; 

//result: <img src='avatar.jpg?1269538749'> 

?> 

khi tập tin được sửa đổi sẽ xóa bộ nhớ cache client

+0

Không thể xảy ra trong nhiều trường hợp do tính chất được lưu trong bộ nhớ cache của mã HTML. –

+0

có thể cho tôi biết trường hợp nào? – Leo

+0

Trường hợp bộ nhớ cache được tạo mã HTML vào DB, được cập nhật vài ngày một lần –

25

Nối một số duy nhất vào cuối của hình ảnh src

tức

<?php 

echo "<img src=../thumbnail.jpg?" . time() . ">"; 

làm điều này chỉ trên biểu mẫu cho hình đại diện đang cập nhật

công trình đối với tôi

btw, đây hoạt động tốt cho buộc cập nhật các tập tin tĩnh khác

tức html cho tập tin css là

<link rel="Stylesheet" href="../css/cssfile.css?<?= md5_file('cssfile.css'); ?>" /> 
+0

Lưu ý rằng tính toán md5 mất rất nhiều công suất xử lý. Sẽ tốt hơn nếu sử dụng 'filemtime()'. – oriadam

0

hình ảnh Cached cũng không còn giá trị về thủ công trang làm mới (nhấn F5 trong trình duyệt). Điều này có thể được mô phỏng bằng phương thức Javascript location.reload() được kích hoạt khi tải nội dung. Để tránh việc tải lại vĩnh viễn, điều này có thể diễn ra chỉ một lần. Khi người dùng tải lên hình đại diện mới, yêu cầu ReloadPending được đặt liên tục trong phiên của anh ấy và nó được đặt lại khi nó được trả lời.

<?php 
if ($session['ReloadPending']) 
{ $session['ReloadPending']=false; 
     echo "<body onload='location.reload(true);'>"; 
} else echo "<body>"; 
?> 

Tải lại toàn bộ trang sau khi tải lên hình đại diện sẽ khiến trang nhấp nháy nhưng điều này chỉ xảy ra một lần mà tôi tin là có thể chấp nhận được.

0

Tôi phát hiện ra rằng một trong những cách tốt nhất để làm điều này là có cùng URL để nhận và đăng hình ảnh (REST).

POST/my/hình ảnh (Cache-control: no-cache,-phải xác nhận lại)

GET/my/hình ảnh (Cache-control: phải xác nhận lại)

Các vấn đề liên quan