2012-01-06 92 views
6

我有一個網站,基本上只顯示沒有任何形式和事後獲取的東西。 這個網站是基於PHP的,並託管在共享主機上。它很少改變。 我想爲這個網站啓用緩存。 它的共享託管,所以我需要一個解決方案:基於超靜態文件(html)的PHP網站緩存

  • 沒有使用Memcached的
  • 不需要到我的網站轉移到VPS
  • 不要使用APC或其他東西

所以基本上什麼我想說的是將每個子網站緩存到HTML並告訴PHP獲取5分鐘當前子網站的HTML緩存版本並將其顯示給用戶。並在5分鐘後刷新緩存。

我一直在尋找一些在互聯網上,有一些教程和框架,支持這種扭曲的緩存。

但我需要的只是一個非常好用的庫。

我想象它以這種方式工作:

<? 

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

..mywebsite rendering code 

?> 

,因爲它聽起來很簡單,但我希望有好人開發商之前做過這樣的圖書館。那麼您是否知道這樣準備好使用,而不是非常耗時地實施解決方案?

+0

如果你可以使用PEAR,PEAR_Cache可能是你所需要的:http://pear.php.net/package/Cache – 2012-01-06 12:59:50

+0

你有apache + .htaccess嗎? – hakre 2012-01-06 13:01:40

+0

可能的重複:[如何爲PHP網站實現HTML緩存?](http://stackoverflow.com/questions/55223/how-do-i-implement-a-html-cache-for-a- php站點) – hakre 2012-01-06 13:51:08

回答

5

這是我通常這樣做的,但是我不知道你的URL設計,也沒有你的目錄/文件格式。

我用.htaccessmod_rewrite­Docs這樣做。

網絡服務器檢查緩存的HTML文件是否存在,如果存在,它將被傳送。你也可以檢查它的年齡。

如果太舊或者它不存在,則啓動PHP腳本(s?)。在你的腳本的開頭你start the output buffer­Docs。在腳本結尾處,您將獲得輸出緩衝區,並將內容放入緩存文件中,然後輸出它。

這個解決方案的好處是,apache將提供靜態文件,以防它們存在並且不需要調用PHP進程。如果你在PHP本身內部完成這些工作,你將不會獲得這種好處。

我甚至會更進一步,運行一個cron-job,刪除較舊的緩存文件,而不是在.htaccess中進行時間檢查。完成之後,您可以使重寫更簡單,以選擇.php.cached文件而不是.php文件。

+1

以及如何實現它? – 2012-01-07 20:46:48

+0

@tomaszs:當你需要它時,它取決於你的url/file/cache-layout。如果您正在尋找示例和想法,我覺得這篇文章非常有見地:[使用PHP,C++和Apache mod_rewrite的高級緩存機制](http://sven.webiny.com/advanced-cache-mechanism-using-php- cpp-and-apache /) - 接下來請看這個相關的問題:[RewriteRule檢查文件在重寫文件路徑中存在](http:// stackoverflow。com/questions/470880/rewriterule-checking-file-in-rewriten-file-path-exists) – hakre 2012-02-15 17:19:46

1

您應該試試skycache編輯:這個項目似乎也很酷:cacheme

另一種解決方案是使用auto_prepend_file/auto_append_file。像什麼在本教程中所描述的內容:Output caching for beginners

+0

skycache似乎很有趣,但它似乎不能在安全模式下工作。有任何想法嗎? – 2012-01-07 21:43:37

+0

發現這個:https://github.com/tlrobinson/cacheme.php – greut 2012-01-11 12:46:26

3

我有一個HTML緩存簡單的算法中,預測下列條件

  • 用戶是遊客(登錄的用戶有一個blog_user設置Cookie)
  • 請求URI是不包含請求參數
  • 文件的HTML緩存版本存在

那麼一個GET重寫規則,將請求映射到緩存文件。其他任何東西都被假定爲特定於上下文的,因此不可緩存。請注意,我爲我的博客使用wikipedia風格的URI映射,因此/article-23在未緩存時映射到/index.php=article-23

我在我的DOCUMENT_ROOT目錄中使用一個HTML訪問文件,這裏是相關的提取。這是第三個重寫規則,可以做你想做的事情。任何生成可高速緩存的O/P的腳本都會在ob_start()ob_get_clean()對中包裝它並寫出HTML緩存文件(儘管這全部由我的模板引擎處理)。更新也會根據需要刷新HTML緩存目錄。

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] 

希望這會有所幫助。我的博客更詳細地描述了這一點。 :-)

2

自從你問這個問題有一段時間了,但由於這仍然在收集搜索結果,我想我會給你一個更好的答案。

你可以在不使用.htaccess或其他技巧的PHP中進行靜態緩存。我發現這個在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

這是_not_靜態文件緩存,一個PHP進程仍然參與每個請求,它違背了靜態文件緩存的全部要點。 – kizzx2 2013-02-24 16:30:39

2

只需添加更多一點尼科的響應,使之成爲通用的複製和粘貼使用更加有用通過保存在保存每個文件單獨求CacheFile名打字的時間。

原文:

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

修改:

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

這樣做是採取一切文件,它位於的文件名,減去擴展名(在我的情況.PHP),和將「-cached.html」標籤和新擴展附加到緩存文件。有可能更有效的方法來做到這一點,但它適用於我,並希望爲他人節省一些時間和精力。