2012-01-06 11 views
6

मेरे पास एक ऐसी वेबसाइट है जो मूल रूप से केवल किसी भी रूप और पोस्ट-होट के बिना चीजें प्रदर्शित करती है। यह वेबसाइट PHP आधारित है और साझा होस्टिंग पर होस्ट की गई है। यह शायद ही कभी बदलता है। मैं इस वेबसाइट के लिए कैशिंग सक्षम करना चाहता हूं। इसका इतना होस्टिंग साझा मैं एक समाधान है कि जरूरत है:सुपरसंपल स्थिर फ़ाइल आधारित (एचटीएमएल) PHP साइट कैश

  • Memcached
  • का उपयोग नहीं करता VPS
  • के लिए मेरी वेबसाइट स्थानांतरित करने के लिए
  • न उपयोग एपीसी या अन्य चीजें

तो मूल रूप से की जरूरत है न क्या मैं एचडीएमएल के हर सबसाइट को कैश करना चाहता हूं और पीएचपी को वर्तमान सबसाइट के एचटीएमएल कैश किए गए संस्करण के लिए 5 मिनट के लिए और इसे उपयोगकर्ता को प्रदर्शित करने के लिए कहूंगा। और कैश रीफ्रेश करने के लिए 5 मिनट के बाद।

मैं इंटर्ननेट पर कुछ समय की तलाश कर रहा हूं और इस तरह के अजीब कैश का समर्थन करने वाले कुछ ट्यूटोरियल और ढांचे हैं।

लेकिन मुझे जो चाहिए वह सिर्फ एक अच्छी लाइब्रेरी है जिसका उपयोग करना बेहद आसान है।

मैं इसे इस तरह से काम करने के लिए कल्पना:

<? 

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

..mywebsite rendering code 

?> 

तो सरल रूप में यह लग रहा है, लेकिन मैं आशा कुछ अच्छे साथी डेवलपर इस तरह के पुस्तकालय से पहले किया था। तो क्या आप इस तरह के उपयोग के लिए तैयार हैं, समाधान को लागू करने में बहुत समय नहीं लेते?

+0

यदि आप पीयर का उपयोग कर सकते हैं, तो PEAR_Cache आपको बस चाहिए: http://pear.php.net/package/Cache –

+0

क्या आपके पास apache + .htaccess है? – hakre

+0

संभावित डुप्लिकेट: [मैं एक PHP साइट के लिए एक HTML कैश कैसे कार्यान्वित करूं?] (Http://stackoverflow.com/questions/55223/how-do-i-implement-a-html-cache-for-a- PHP साइट) – hakre

उत्तर

5

इस प्रकार मैं सामान्य रूप से ऐसा करता हूं, हालांकि मुझे आपका यूआरएल डिज़ाइन और न ही आपकी निर्देशिका/फ़ाइल लेआउट पता नहीं है।

मैं इसे .htaccess और mod_rewrite­Docs के साथ करता हूं।

वेबसर्वर जांचता है कि कैश की गई HTML फ़ाइल मौजूद है, और यदि हां, तो यह वितरित किया जाता है। आप इसकी उम्र भी देख सकते हैं।

यदि यह बहुत पुराना है या यदि यह मौजूद नहीं है तो आपकी PHP स्क्रिप्ट शुरू हो गई है। आपकी स्क्रिप्ट की शुरुआत में आप start the output buffer­Docs। अपनी स्क्रिप्ट के अंत में, आप आउटपुट बफर प्राप्त करते हैं और आप सामग्री को कैश फ़ाइल में डालते हैं और फिर आप इसे आउटपुट करते हैं।

इस समाधान का लाभ यह है कि अपाचे तब मौजूद होने पर स्थिर फाइलें प्रदान करेगा और PHP प्रक्रिया को लागू करने की आवश्यकता नहीं है। यदि आप इसे PHP के भीतर ही करते हैं, तो आपके पास वह लाभ नहीं होगा।

मैं भी एक कदम आगे जाकर एक क्रॉन नौकरी कि बजाय एक कर के पुराने कैश-फ़ाइलों को हटा चल पाएंगे .htaccess अंदर समय की जाँच करें। ऐसा करने के बाद, आप .php फ़ाइल के बजाय .php.cached फ़ाइल को प्राथमिकता देने के लिए पुनः जटिल लिख सकते हैं।

+1

और इसे कैसे कार्यान्वित करें? –

+0

@tomaszs: जैसा कि आपको इसकी आवश्यकता है, यह आपके यूआरएल/फ़ाइल/कैश-लेआउट पर निर्भर करता है। यदि आप उदाहरणों, विचारों की तलाश में हैं, तो मुझे यह आलेख काफी अंतर्दृष्टिपूर्ण लगता है: [PHP, सी ++ और अपाचे mod_rewrite का उपयोग कर उन्नत कैश तंत्र] (http://sven.webiny.com/advanced-cache-mechanism-using-php- cpp-and-apache /) - इसके आगे कृपया इस संबंधित प्रश्न को देखें: [rewriten फ़ाइल पथ में रीवाइटरूल जांच फ़ाइल मौजूद है] (http: // stackoverflow।कॉम/प्रश्न/470880/पुनः लिखने-जांच-फ़ाइल-इन-रीवाइटन-फ़ाइल-पथ-मौजूद है) – hakre

1

आपको skycache एक प्रयास देना चाहिए। संपादित करें: इस परियोजना शांत भी लगता है: cacheme

एक अन्य समाधान auto_prepend_file/auto_append_file उपयोग करने के लिए है।क्या इस ट्यूटोरियल में वर्णित की तरह कुछ: Output caching for beginners

+0

स्काईकैच दिलचस्प लगता है लेकिन ऐसा लगता है कि यह सुरक्षित-मोड में काम नहीं करता है। कोई विचार? –

+0

यह पाया गया: https://github.com/tlrobinson/cacheme.php – greut

3

मैं HTML कैशिंग के लिए एक सरल algo है, निम्न स्थितियों के

  • उपयोगकर्ता पर प्रतिपादित एक अतिथि (उन पर लॉग इन एक blog_user कुकी सेट)
  • है
  • अनुरोध URI किसी GET है कि कोई अनुरोध पैरामीटर
  • फ़ाइल की एक HTML कैश संस्करण मौजूद

तो एकहोता हैएक कैश्ड फ़ाइल के अनुरोध को मैप करने में नियम को फिर से लिखता है। कुछ और संदर्भ-विशिष्ट माना जाता है और इसलिए कैशबल नहीं है। ध्यान दें कि मैं अपने ब्लॉग के लिए विकिपीडिया-शैली यूआरआई मैपिंग का उपयोग करता हूं, इसलिए /article-23 कैश नहीं होने पर /index.php=article-23 पर मैप किया जाता है।

मैं अपने DOCUMENT_ROOT निर्देशिका में एक एकल HTML एक्सेस फ़ाइल का उपयोग करता हूं और यहां प्रासंगिक निकास है। यह तीसरा पुनर्लेखन नियम है जो आप चाहते हैं। कोई भी स्क्रिप्ट जो कैशबल ओ/पी उत्पन्न करती है उसे 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

यह कुछ समय है जब आपने यह पूछा था, लेकिन चूंकि यह अभी भी खोज हिट एकत्र कर रहा है, मैंने सोचा कि मैं आपको एक बेहतर उत्तर दूंगा।

आप PHP में स्थिर कैशिंग को बिना .htaccess या अन्य trickery के कर सकते हैं। मैं 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

2

बस निको के जवाबी कार्रवाई के लिए एक छोटे से अधिक जोड़ने के लिए बचाया प्रत्येक फ़ाइल के लिए अलग-अलग cachefile नाम में टाइप के समय की बचत से यह अधिक सामान्य कॉपी और पेस्ट उपयोग के लिए उपयोगी बनाने के लिए।

मूल:

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

संशोधित:

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

यह क्या करता है, जो कुछ भी फ़ाइल उस में स्थित है फ़ाइल नाम लेने के लिए है, शून्य से विस्तार (मेरे मामले में .php) और "-cached.html" लेबल और कैश की गई फ़ाइल में नया एक्सटेंशन जोड़ता है। ऐसा करने के शायद अधिक कुशल तरीके हैं, लेकिन यह मेरे लिए काम करता है और उम्मीद है कि दूसरों को कुछ समय और प्रयास बचाएगा।

संबंधित मुद्दे