如何缓存动态PHP页面
如何缓存包含mysql查询的PHP页面。任何示例都将非常有用。将html缓存出来,然后执行以下操作:如何缓存动态PHP页面,php,caching,Php,Caching,如何缓存包含mysql查询的PHP页面。任何示例都将非常有用。将html缓存出来,然后执行以下操作: $memcache = memcache_connect('localhost', 11211); $page = $memcache->get('homepage'); if($page == ""){ $mtime = microtime(); $page = get_home(); $mtime = explode(" ",$mtime); $mt
$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<!-- served from memcache ($totaltime) -->";
}
die($page);
$memcache=memcache\u connect('localhost',11211);
$page=$memcache->get('homepage');
如果($page==“”){
$mtime=microtime();
$page=get_home();
$mtime=分解(“,$mtime”);
$mtime=$mtime[1]+$mtime[0];
$endtime=$mtime;
$totaltime=($endtime-$starttime);
memcache_set($memcache,'homepage',$page,0,30);
$page.=“\n”;
}
否则{
$mtime=microtime();
$mtime=分解(“,$mtime”);
$mtime=$mtime[1]+$mtime[0];
$endtime=$mtime;
$totaltime=($endtime-$starttime);
$page.=“\n!--从memcache($totaltime)-->”提供;
}
模具(页);
我的首选是使用缓存反向代理,如
就纯PHP解决方案而言,您可以在脚本末尾编写一些代码来缓存最终输出,在脚本开头编写一些代码来检查页面是否被缓存。如果在缓存中找到该页,则发送该页并退出,而不是再次运行查询
<?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;
}
我正在使用(对于共享主机,如果您不想触摸php.ini和root来设置memcached)。查看示例菜单。他们有详细的例子,非常简单
首先使用phpFastCache::set设置,然后使用phpFastCache::get-DONE
示例:减少数据库调用
您的网站有10000名在线访问者,在每次加载页面时,您的动态页面必须向数据库发送10000个相同的查询。使用phpFastCache,您的页面只向DB发送1个查询,并使用缓存服务9999个其他访问者
<?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
?>
在讨论缓存时,最重要的是进程同步,以避免线程竞争(请参阅:)
PHP中没有同步的典型缓存场景如下所示:如果缓存中没有资源,或者资源已过期,则必须创建资源并将其放入缓存中。遇到这种情况的第一个线程/进程正在尝试创建资源,在此期间,其他线程也将创建资源,这将导致线程争用、缓存阻塞和性能下降
资源创建任务创建的并发线程数和工作负载会放大这个问题。在繁忙的系统上,它可能会导致严重的问题
很少有PHP缓存系统考虑同步
其中一个是php无slam缓存:是否要集成HTTP缓存?+1是一个用于共享主机的示例。干杯你如何使用这个类?你能回答我的问题吗?您在哪里调用缓存\u输出
?@AakilFernandes输出缓冲区在请求结束时有一个隐式刷新ob_start()
指定cache_output()
作为其回调。因此,末尾的隐式刷新调用cache\u output()
。
<?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
?>