2009-10-10 46 views
11

Tôi làm cách nào để đệm một trang web bằng php để nếu một trang chưa được cập nhật, người xem sẽ nhận được bản sao được lưu trong bộ nhớ cache?Làm cách nào để cache một trang web bằng PHP?

Cảm ơn sự giúp đỡ của bạn. PS: Tôi là người mới bắt đầu trong php.

+0

Bạn có đang sử dụng bất kỳ khung công tác nào như Zend Framework không? Hãy cho chúng tôi biết thêm chi tiết! – Thomaschaaf

+1

Tôi không sử dụng bất kỳ khung công tác nào. – user187580

+0

bạn có thể muốn xem xét chuyển nó sang một khung công tác. http://code.google.com/p/samstyle-php-framework - khung công tác chính thức bao gồm bộ nhớ đệm của tệp và hỗ trợ memcache – mauris

Trả lời

13

Bạn thực sự có thể lưu đầu ra của trang trước khi bạn kết thúc tập lệnh, sau đó tải bộ nhớ cache vào đầu tập lệnh.

mã ví dụ:

<?php 

$cachefile = 'cache/'.basename($_SERVER['PHP_SELF']).'.cache'; // e.g. cache/index.php.cache 
$cachetime = 3600; // time to cache in seconds 

if(file_exists($cachefile) && time()-$cachetime <= filemtime($cachefile)){ 
    $c = @file_get_contents($cf); 
    echo $c; 
    exit; 
}else{ 
    unlink($cachefile); 
} 

ob_start(); 

// all the coding goes here 

$c = ob_get_contents(); 
file_put_contents($cachefile); 

?> 

Nếu bạn có nhiều trang cần bộ nhớ đệm này bạn có thể làm điều này:

trong cachestart.php:

<?php 
$cachefile = 'cache/'.basename($_SERVER['PHP_SELF']).'.cache'; // e.g. cache/index.php.cache 
$cachetime = 3600; // time to cache in seconds 

if(file_exists($cachefile) && time()-$cachetime <= filemtime($cachefile)){ 
    $c = @file_get_contents($cf); 
    echo $c; 
    exit; 
}else{ 
    unlink($cachefile); 
} 

ob_start(); 
?> 

trong cacheend.php:

<?php 

$c = ob_get_contents(); 
file_put_contents($cachefile); 

?> 

Sau đó, chỉ cần thêm

khi bắt đầu tập lệnh. và thêm

include('cacheend.php'); 

ở cuối tập lệnh. Hãy nhớ có một thư mục có tên là bộ nhớ cache và cho phép PHP truy cập vào thư mục đó. Ngoài ra, hãy nhớ rằng nếu bạn đang thực hiện bộ nhớ cache trang đầy đủ, trang của bạn không được hiển thị SESSION cụ thể (ví dụ: thanh hiển thị thành viên hoặc gì) vì chúng cũng sẽ được lưu trong bộ nhớ cache. Nhìn vào một khuôn khổ cho bộ nhớ đệm cụ thể (biến hoặc một phần của trang).

+0

nơi tôi đặt mã này? index.php? – user187580

+0

nhận thấy một phần mà tôi đã viết '// tất cả các mã hóa đi đây'? bạn có thể đặt mã chính của bạn ở đó. – mauris

+0

ahh Tôi hiểu rồi. Tôi sẽ kiểm tra nó và kiểm tra. Cảm ơn. – user187580

0

Sử dụng memcached. Có một lời giải thích về cách làm điều đó trên trang web đó.

0

Sử dụng Squid hoặc cập nhật tiêu đề HTTP chính xác để thực hiện bộ nhớ đệm của trình duyệt. Tôi không thấy cần phải quay phiên bản bộ nhớ đệm của riêng bạn dựa trên câu hỏi.

4

Ngoài câu trả lời cho mauris, tôi muốn chỉ ra điều này:

Bạn phải cẩn thận khi sử dụng bộ nhớ đệm. Khi bạn có dữ liệu động (trường hợp này khi bạn sử dụng php thay vì html tĩnh) thì bạn phải làm mất hiệu lực bộ nhớ cache khi thay đổi dữ liệu tương ứng.

Điều này có thể khá dễ dàng hoặc cực kỳ phức tạp, tùy thuộc vào loại dữ liệu động của bạn.

Cập nhật

Cách bạn làm mất hiệu lực bộ nhớ cache tùy thuộc vào loại bộ nhớ đệm cụ thể. Bạn phải biết các tệp bộ nhớ cache nào thuộc về trang nào (và có thể với đầu vào của người dùng). Khi thay đổi dữ liệu, bạn nên xóa tệp đã lưu trong bộ nhớ cache hoặc xóa đầu ra của trang khỏi cấu trúc dữ liệu bộ nhớ cache của bạn.

Tôi không thể cung cấp cho bạn bất kỳ thông tin chi tiết nào về điều đó mà không biết bạn triển khai bộ nhớ đệm nào cho việc triển khai bộ nhớ đệm nào.

Những người khác đề xuất ví dụ như gói Pear hoặc memcached. Các chức năng này có các chức năng cần thiết để vô hiệu toàn bộ bộ nhớ cache hoặc các phần của bộ nhớ cache khi dữ liệu thay đổi.

+0

vui lòng ném thêm một số ý tưởng về bộ nhớ cache không hợp lệ .. cảm ơn. – user187580

+0

@Patrick, Trên thực tế, bộ nhớ đệm yêu cầu truy cập vào đĩa cứng. Nó sẽ không chậm hơn? – Pacerier

+0

Vâng, thường thì hệ điều hành có bộ đệm tệp riêng, vì vậy ngay cả khi bạn sử dụng tệp, nó có thể được phục vụ từ bộ nhớ. nhưng thậm chí là không, nó là hầu hết thời gian performant hơn để đọc kết quả được lưu trữ từ đĩa và trả lại nó hơn tính toán lại trang. Nếu nó nhanh hơn để tính toán, thì đừng cache. –

3
$c = ob_get_contents(); 
file_put_contents($cachefile); 

đúng là

$c = ob_get_contents(); 
file_put_contents($cachefile,$c); 

nếu không thì kịch bản sẽ không hoạt động.

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