2010-09-24 7 views
18

Cách cache trang PHP có truy vấn mysql. Bất kỳ ví dụ nào cũng sẽ tuyệt vời và hữu ích.Cách cache trang PHP động

+0

Bạn có muốn tích hợp bộ nhớ đệm HTTP không? – Gumbo

Trả lời

2

memcache của bạn html ra và sau đó làm một cái gì đó như thế này:

$memcache = memcache_connect('localhost', 11211); 

$page = $memcache->get('homepage'); 
if($page == ""){ 
    $mtime = microtime(); 
    $page = get_home(); 
    $mtime = explode(" ",$mtime); 
    $mtime = $mtime[1] + $mtime[0]; 
    $endtime = $mtime; 
    $totaltime = ($endtime - $starttime); 
    memcache_set($memcache, 'homepage', $page, 0, 30); 
    $page .= "\n<!-- Duly stored ($totaltime) -->"; 
} 
else{ 
    $mtime = microtime(); 
    $mtime = explode(" ",$mtime); 
    $mtime = $mtime[1] + $mtime[0]; 
    $endtime = $mtime; 
    $totaltime = ($endtime - $starttime); 
    $page .= "\n&lt;!-- served from memcache ($totaltime) -->"; 
} 
die($page); 
13

sở thích của tôi là sử dụng một reverse proxy bộ nhớ đệm, như Varnish.

Theo như giải pháp PHP thuần túy, bạn có thể có một số mã ở cuối tập lệnh lưu trữ kết quả cuối cùng và mã ở đầu để kiểm tra xem trang có được lưu trong bộ nhớ cache hay không. Nếu trang được tìm thấy trong bộ nhớ cache, hãy gửi nó và thoát ra ngoài thay vì chạy lại các truy vấn.

<?php 

function cache_file() { 
    // something to (hopefully) uniquely identify the resource 
    $cache_key = md5($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING']); 
    $cache_dir = '/tmp/phpcache'; 

    return $cache_dir . '/' . $cache_key; 
} 

// if we have a cache file, deliver it 
if(is_file($cache_file = cache_file())) { 
    readfile($cache_file); 
    exit; 
} 

// cache via output buffering, with callback 
ob_start('cache_output'); 

// 
// expensive processing happens here, along with page output. 
// 

function cache_output($content) { 
    file_put_contents(cache_file(), $content); 
    return $content; 
} 

Rõ ràng điều này cần rất nhiều tùy biến cho các thiết lập của bạn, bao gồm hết hạn bộ nhớ cache, một $cache_key đáp ứng nhu cầu của bạn, và phát hiện lỗi trang quá tệ không được cache.

+0

Bạn gọi 'cache_output' ở đâu? –

+1

@AakilFernandes Bộ đệm đầu ra có một tuôn ra ngầm ở cuối yêu cầu. 'ob_start()' chỉ định 'cache_output()' làm gọi lại của nó. Vì vậy, sự tuôn ra ngầm ở cuối cuộc gọi 'cache_output()'. –

17

Tôi đang sử dụng phpFastCache (để chia sẻ lưu trữ, nếu bạn không muốn chạm vào php.ini và root để thiết lập memcached). Kiểm tra Menu ví dụ. Họ có đầy đủ chi tiết ví dụ, và rất dễ dàng.

Trước tiên bạn đặt bằng phpFastCache :: đặt và sau đó nhận bằng phpFastCache :: get - DONE!

Ví dụ: Giảm Cơ sở dữ liệu cuộc gọi

Trang web của bạn có 10.000 du khách đang trực tuyến và trang năng động của bạn phải gửi 10.000 truy vấn cùng một cơ sở dữ liệu trên mỗi tải trang. Với phpFastCache, trang của bạn chỉ gửi 1 truy vấn tới DB và sử dụng bộ nhớ cache để phục vụ 9,999 khách truy cập khác.

<?php 
    // In your config file 
    include("php_fast_cache.php"); 
    phpFastCache::$storage = "auto"; 
    // you can set it to files, apc, memcache, memcached, pdo, or wincache 
    // I like auto 

    // In your Class, Functions, PHP Pages 
    // try to get from Cache first. 
    $products = phpFastCache::get("products_page"); 

    if($products == null) { 
     $products = YOUR DB QUERIES || GET_PRODUCTS_FUNCTION; 
     // set products in to cache in 600 seconds = 5 minutes 
     phpFastCache::set("products_page",$products,600); 
    } 

    OUTPUT or RETURN your $products 
?> 
+0

+1 cho ví dụ và một ví dụ hoạt động với tính năng chia sẻ lưu trữ. Chúc mừng! –

+0

làm thế nào bạn có thể sử dụng lớp học này? bạn có thể trả lời câu hỏi của tôi không? http://stackoverflow.com/questions/22116573/how-to-use-phpfastcache –

1
<?php 
    //settings 
    $cache_ext = '.html'; //file extension 
    $cache_time  = 3600; //Cache file expires afere these seconds (1 hour = 3600 sec) 
    $cache_folder = 'cache/'; //folder to store Cache files 
    $ignore_pages = array('', ''); 

    $dynamic_url = 'http://'.$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING']; // requested dynamic page (full url) 
    $cache_file  = $cache_folder.md5($dynamic_url).$cache_ext; // construct a cache file 
    $ignore = (in_array($dynamic_url,$ignore_pages))?true:false; //check if url is in ignore list 

    if (!$ignore && file_exists($cache_file) && time() - $cache_time < filemtime($cache_file)) { //check Cache exist and it's not expired. 
     ob_start('ob_gzhandler'); //Turn on output buffering, "ob_gzhandler" for the compressed page with gzip. 
     readfile($cache_file); //read Cache file 
     echo '<!-- cached page - '.date('l jS \of F Y h:i:s A', filemtime($cache_file)).', Page : '.$dynamic_url.' -->'; 
     ob_end_flush(); //Flush and turn off output buffering 
     exit(); //no need to proceed further, exit the flow. 
    } 
    //Turn on output buffering with gzip compression. 
    ob_start('ob_gzhandler'); 
    ######## Your Website Content Starts Below ######### 
    ?> 
    <!DOCTYPE html> 
    <html> 
     <head> 
      <title>Page to Cache</title> 
     </head> 
      <body> 
       Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer ut tellus libero. 
      </body> 
    </html> 
    <?php 
    ######## Your Website Content Ends here ######### 

    if (!is_dir($cache_folder)) { //create a new folder if we need to 
     mkdir($cache_folder); 
    } 
    if(!$ignore){ 
     $fp = fopen($cache_file, 'w'); //open file for writing 
     fwrite($fp, ob_get_contents()); //write contents of the output buffer in Cache file 
     fclose($fp); //Close file pointer 
    } 
    ob_end_flush(); //Flush and turn off output buffering 

    ?> 
1

Điều quan trọng, thường bị bỏ qua khi có cuộc thảo luận về bộ nhớ đệm, là quá trình đồng bộ hóa để tránh chủ đề chủng tộc (xem: https://en.wikipedia.org/wiki/Race_condition).

Kịch bản bộ đệm điển hình trong PHP mà không đồng bộ hóa trông như sau: nếu bạn không có tài nguyên trong bộ nhớ cache hoặc tài nguyên hết hạn, nó phải được tạo và đưa vào bộ nhớ cache. Đầu tiên thread/process xảy ra để gặp phải tình trạng như vậy là cố gắng để tạo ra tài nguyên, và trong thời gian đó, chủ đề khác cũng sẽ tạo ra các nguồn tài nguyên, dẫn đến thread thread, cache slamming và hiệu suất downspike.

Sự cố được phóng đại theo số lượng chuỗi đồng thời và khối lượng công việc được tạo bởi tác vụ tạo tài nguyên. Trên các hệ thống bận rộn, nó có thể dẫn đến các vấn đề nghiêm trọng.

Có rất ít hệ thống lưu bộ nhớ cache cho PHP đồng bộ hóa nó vào xem xét đồng bộ hóa.

Một trong số đó là php-no-slam-cache: https://github.com/tztztztz/php-no-slam-cache