2012-01-06 43 views
6

Tôi có một trang web về cơ bản chỉ hiển thị mọi thứ mà không có bất kỳ biểu mẫu nào và sau khi tải. Trang web này dựa trên PHP và được lưu trữ trên máy chủ chia sẻ. Nó hiếm khi thay đổi. Tôi muốn kích hoạt bộ nhớ đệm cho trang web này. của nó chia sẻ lưu trữ vì vậy tôi cần một giải pháp:Siêu tệp dựa trên trang web tĩnh (html) php cache

  • không sử dụng memcached
  • không cần phải di chuyển trang web của tôi để VPS
  • không sử dụng APC hoặc những thứ khác

Vì vậy, về cơ bản những gì tôi muốn hoàn thành là bộ nhớ cache mỗi subsite để HTML và nói với PHP để có được 5 phút phiên bản cache HTML của subsite hiện tại và hiển thị nó cho người dùng. Và sau 5 phút để làm mới bộ nhớ cache.

Tôi đã tìm kiếm một số thời gian trên internets và có một số hướng dẫn và khung công tác hỗ trợ loại bộ nhớ đệm kinky này.

Nhưng những gì tôi cần chỉ là một thư viện tốt, cực kỳ dễ sử dụng.

tôi tưởng tượng nó để làm việc theo cách này:

<? 

if (current_site_cache_is_valid()) 
{ 
    display_cached_version(); 
    die; 
} 

..mywebsite rendering code 

?> 

Vì vậy, đơn giản như nó âm thanh nhưng tôi hy vọng một số nhà phát triển đồng tốt đã làm thư viện của loại hình này trước đây. Vì vậy, bạn có biết như vậy đã sẵn sàng để sử dụng, không phải là rất tốn thời gian để thực hiện giải pháp?

+0

Nếu bạn có thể sử dụng PEAR, PEAR_Cache có thể là tất cả những gì bạn cần: http://pear.php.net/package/Cache –

+0

Bạn có apache + .htaccess không? – hakre

+0

có thể trùng lặp: [Làm cách nào để triển khai bộ nhớ cache HTML cho trang web PHP?] (Http://stackoverflow.com/questions/55223/how-do-i-implement-a-html-cache-for-a- php-site) – hakre

Trả lời

5

Đây là cách tôi thường làm điều này, tuy nhiên tôi không biết thiết kế URL của bạn cũng như bố cục thư mục/tệp của bạn.

Tôi làm điều này với .htaccessmod_rewrite­Docs.

Máy chủ web kiểm tra xem tệp HTML đã lưu trong bộ nhớ cache có tồn tại hay không và nếu có, tệp được phân phối. Bạn cũng có thể kiểm tra độ tuổi của nó.

Nếu quá cũ hoặc nếu nó không tồn tại, tập lệnh PHP của bạn (s?) Được bắt đầu. Ở đầu tập lệnh của bạn, bạn start the output buffer­Docs. Ở cuối kịch bản, bạn có được bộ đệm đầu ra và bạn đặt nội dung đó vào tệp bộ đệm và sau đó bạn xuất nó ra.

Lợi ích của giải pháp này là, apache sẽ phân phối tệp tĩnh trong trường hợp chúng tồn tại và không cần phải gọi quy trình PHP. Nếu bạn làm tất cả trong chính PHP, bạn sẽ không có lợi ích đó.

Tôi thậm chí sẽ tiến thêm một bước nữa và chạy cron-job để xóa các tệp bộ nhớ cache cũ hơn thay vì thực hiện kiểm tra thời gian bên trong .htaccess. Điều đó được thực hiện, bạn có thể làm cho việc viết lại ít phức tạp hơn để thích tệp .php.cached thay vì tệp .php.

+1

Và cách triển khai? –

+0

@tomaszs: Khi bạn cần, nó phụ thuộc vào url/tệp/bố cục bộ nhớ cache của bạn. Nếu bạn đang tìm kiếm các ví dụ, ý tưởng, tôi thấy bài viết này khá sâu sắc: [Cơ chế bộ nhớ nâng cao bằng PHP, C++ và Apache mod_rewrite] (http://sven.webiny.com/advanced-cache-mechanism-using-php- cpp-and-apache /) - Bên cạnh đó vui lòng xem câu hỏi liên quan này: [RewriteRule kiểm tra tệp trong đường dẫn tệp đã ghi lại tồn tại] (http: // stackoverflow.com/questions/470880/rewriterule-check-file-in-rewriten-file-path-tồn tại) – hakre

1

Bạn nên dùng thử skycache. chỉnh sửa: dự án này có vẻ quá lạnh: cacheme

Một giải pháp khác là sử dụng auto_prepend_file/auto_append_file.Một cái gì đó giống như những gì được mô tả trong hướng dẫn này: Output caching for beginners

+0

skycache có vẻ thú vị nhưng có vẻ như không hoạt động ở chế độ an toàn. Bất kỳ ý tưởng? –

+0

Tìm thấy điều này: https://github.com/tlrobinson/cacheme.php – greut

3

Tôi có một algo đơn giản cho HTML bộ nhớ đệm, xác định trên các điều kiện sau

  • Người dùng là khách vãng lai (đăng nhập người dùng có một bộ Cookie blog_user)
  • yêu cầu URI là một GET mà không chứa thông số yêu cầu
  • một HTML phiên bản bộ nhớ cache của tập tin tồn tại

sau đó một .htaccess viết lại các quy tắc đá trong, ánh xạ yêu cầu tới tệp được lưu trong bộ nhớ cache. Bất cứ điều gì khác được giả định là bối cảnh cụ thể và do đó không thể lưu trữ. Lưu ý rằng tôi sử dụng ánh xạ URI kiểu wikipedia cho blog của tôi để /article-23 được ánh xạ tới /index.php=article-23 khi không được lưu trong bộ nhớ cache.

Tôi sử dụng một tệp truy cập HTML duy nhất trong thư mục DOCUMENT_ROOT của mình và đây là trích xuất có liên quan. Đó là quy tắc viết lại thứ ba thực hiện những gì bạn muốn. Bất kỳ tập lệnh nào tạo O/P có thể lưu trong bộ nhớ cache sẽ kết thúc tốt đẹp trong cặp ob_start()ob_get_clean() và ghi tệp bộ nhớ cache HTML (mặc dù tất cả điều này được xử lý bởi công cụ tạo khuôn mẫu của tôi). Cập nhật cũng xóa thư mục bộ nhớ cache HTML khi cần thiết.

RewriteEngine on 
RewriteBase/

# ... 
# Handle blog index 
RewriteRule ^blog/$         blog/index    [skip=1] 

# If the URI maps to a file that exists then stop. This will kill endless loops 

RewriteCond %{REQUEST_FILENAME}      -f 
RewriteRule ^blog/.*         -      [last] 

# If the request is HTML cacheable (a GET to a specific list, with no query params) 
# the user is not logged on and the HTML cache file exists then use it instead of executing PHP 

RewriteCond %{HTTP_COOKIE}        !blog_user 
RewriteCond %{REQUEST_METHOD}%{QUERY_STRING}   =GET      [nocase] 
RewriteCond %{DOCUMENT_ROOT}/blog/html_cache/$1.html -f 
RewriteRule ^blog/(article-\d+|index|sitemap.xml|search-\w+|rss-[0-9a-z]*)$ \ 
                 blog/html_cache/$1.html [last] 

# Anything else relating to the blog pass to index.php 
RewriteRule blog/(.*)         blog/index.php?page=$1 [qsappend,last] 

Hy vọng điều này sẽ hữu ích. Blog của tôi mô tả chi tiết hơn. :-)

2

Đó là một lúc kể từ khi bạn hỏi điều này, nhưng vì điều này vẫn thu thập số truy cập tìm kiếm, tôi nghĩ tôi sẽ cung cấp cho bạn câu trả lời tốt hơn.

Bạn có thể thực hiện bộ nhớ đệm tĩnh trong PHP mà không cần .htaccess hoặc thủ thuật khác. Tôi thấy điều này ở http://simonwillison.net/2003/may/5/cachingwithphp/:

<?php 
$cachefile = 'cache/index-cached.html'; 
$cachetime = 5 * 60; 
// Serve from the cache if it is younger than $cachetime 
if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) { 
    include($cachefile); 
    echo "<!-- Cached copy, generated ".date('H:i', filemtime($cachefile))." -->\n"; 
    exit; 
} 
ob_start(); // Start the output buffer 

/* The code to dynamically generate the page goes here */ 

// Cache the output to a file 
$fp = fopen($cachefile, 'w'); 
fwrite($fp, ob_get_contents()); 
fclose($fp); 
ob_end_flush(); // Send the output to the browser 
?> 
+1

Đây là bộ nhớ đệm tệp _not_ tĩnh, một quá trình PHP vẫn liên quan đến mọi yêu cầu đánh bại toàn bộ điểm lưu trữ tệp tĩnh. – kizzx2

2

Chỉ cần thêm một chút để đáp ứng nico của để làm cho nó hữu ích hơn cho bản generic và dán sử dụng bằng cách tiết kiệm thời gian bằng cách đánh vào tên cachefile riêng cho mỗi tập tin đã lưu.

gốc:

$cachefile = 'cache/index-cached.html'; 

Modified:

$cachefile = $_SERVER['DOCUMENT_ROOT'].'/cache/'.pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_FILENAME).'-cached.html'; 

Điều này không có gì để mất tên tập tin của bất cứ tập tin nó nằm ở, trừ đi phần mở rộng (.php trong trường hợp của tôi), và gắn nhãn "-cached.html" và phần mở rộng mới vào tệp được lưu trong bộ nhớ cache. Có lẽ có nhiều cách hiệu quả hơn để làm điều này, nhưng nó có tác dụng với tôi và hy vọng tiết kiệm cho người khác một thời gian và công sức.

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