想做个 网站 ,求一段PHP编程代码,PHP的MYSQL缓存怎么实现? 最好举个例子。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想做个 网站 ,求一段PHP编程代码,PHP的MYSQL缓存怎么实现? 最好举个例子。相关的知识,希望对你有一定的参考价值。
数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级。所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO。本文先从 mysql 数据库IO相关参数(缓存参数)的角度来看看可以通过哪些参数进行IO优化:•query_cache_size/query_cache_type (global)
Query cache 作用于整个 MySQL Instance,主要用来缓存 MySQL 中的 ResultSet,也就是一条SQL语句执行的结果集,所以仅仅只能针对select语句。当我们打开了 Query Cache 功能,MySQL在接受到一条select语句的请求后,如果该语句满足Query Cache的要求(未显式说明不允许使用Query Cache,或者已经显式申明需要使用Query Cache),MySQL 会直接根据预先设定好的HASH算法将接受到的select语句以字符串方式进行hash,然后到Query Cache 中直接查找是否已经缓存。也就是说,如果已经在缓存中,该select请求就会直接将数据返回,从而省略了后面所有的步骤(如 SQL语句的解析,优化器优化以及向存储引擎请求数据等),极大的提高性能。
当然,Query Cache 也有一个致命的缺陷,那就是当某个表的数据有任何任何变化,都会导致所有引用了该表的select语句在Query Cache 中的缓存数据失效。所以,当我们的数据变化非常频繁的情况下,使用Query Cache 可能会得不偿失。
Query Cache的使用需要多个参数配合,其中最为关键的是 query_cache_size 和 query_cache_type ,前者设置用于缓存 ResultSet 的内存大小,后者设置在何场景下使用 Query Cache。在以往的经验来看,如果不是用来缓存基本不变的数据的MySQL数据库,query_cache_size 一般 256MB 是一个比较合适的大小。当然,这可以通过计算Query Cache的命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))来进行调整。query_cache_type可以设置为0(OFF),1(ON)或者2(DEMOND),分别表示完全不使用query cache,除显式要求不使用query cache(使用sql_no_cache)之外的所有的select都使用query cache,只有显示要求才使用query cache(使用sql_cache)。
•binlog_cache_size (global)
Binlog Cache 用于在打开了二进制日志(binlog)记录功能的环境,是 MySQL 用来提高binlog的记录效率而设计的一个用于短时间内临时缓存binlog数据的内存区域。
一般来说,如果我们的数据库中没有什么大事务,写入也不是特别频繁,2MB~4MB是一个合适的选择。但是如果我们的数据库大事务较多,写入量比较大,可与适当调高binlog_cache_size。同时,我们可以通过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache由于内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了。
•key_buffer_size (global)
Key Buffer 可能是大家最为熟悉的一个 MySQL 缓存参数了,尤其是在 MySQL 没有更换默认存储引擎的时候,很多朋友可能会发现,默认的 MySQL 配置文件中设置最大的一个内存参数就是这个参数了。key_buffer_size 参数用来设置用于缓存 MyISAM存储引擎中索引文件的内存区域大小。如果我们有足够的内存,这个缓存区域最好是能够存放下我们所有的 MyISAM 引擎表的所有索引,以尽可能提高性能。
此外,当我们在使用MyISAM 存储的时候有一个及其重要的点需要注意,由于 MyISAM 引擎的特性限制了他仅仅只会缓存索引块到内存中,而不会缓存表数据库块。所以,我们的 SQL 一定要尽可能让过滤条件都在索引中,以便让缓存帮助我们提高查询效率。
•bulk_insert_buffer_size (thread)
和key_buffer_size一样,这个参数同样也仅作用于使用 MyISAM存储引擎,用来缓存批量插入数据的时候临时缓存写入数据。当我们使用如下几种数据写入语句的时候,会使用这个内存区域来缓存批量结构的数据以帮助批量写入数据文件:
insert … select …
insert … values (…) ,(…),(…)…
load data infile… into… (非空表)
•innodb_buffer_pool_size(global)
当我们使用InnoDB存储引擎的时候,innodb_buffer_pool_size 参数可能是影响我们性能的最为关键的一个参数了,他用来设置用于缓存 InnoDB 索引及数据块的内存区域大小,类似于 MyISAM 存储引擎的 key_buffer_size 参数,当然,可能更像是 Oracle 的 db_cache_size。简单来说,当我们操作一个 InnoDB 表的时候,返回的所有数据或者去数据过程中用到的任何一个索引块,都会在这个内存区域中走一遭。
和key_buffer_size 对于 MyISAM 引擎一样,innodb_buffer_pool_size 设置了 InnoDB 存储引擎需求最大的一块内存区域的大小,直接关系到 InnoDB存储引擎的性能,所以如果我们有足够的内存,尽可将该参数设置到足够打,将尽可能多的 InnoDB 的索引及数据都放入到该缓存区域中,直至全部。
我们可以通过 (Innodb_buffer_pool_read_requests – Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 计算缓存命中率,并根据命中率来调整 innodb_buffer_pool_size 参数大小进行优化。
•innodb_additional_mem_pool_size(global)
这个参数我们平时调整的可能不是太多,很多人都使用了默认值,可能很多人都不是太熟悉这个参数的作用。innodb_additional_mem_pool_size 设置了InnoDB存储引擎用来存放数据字典信息以及一些内部数据结构的内存空间大小,所以当我们一个MySQL Instance中的数据库对象非常多的时候,是需要适当调整该参数的大小以确保所有数据都能存放在内存中提高访问效率的。
这个参数大小是否足够还是比较容易知道的,因为当过小的时候,MySQL 会记录 Warning 信息到数据库的 error log 中,这时候你就知道该调整这个参数大小了。
•innodb_log_buffer_size (global)
这是 InnoDB 存储引擎的事务日志所使用的缓冲区。类似于 Binlog Buffer,InnoDB 在写事务日志的时候,为了提高性能,也是先将信息写入 Innofb Log Buffer 中,当满足 innodb_flush_log_trx_commit 参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件(或者同步到磁盘)中。可以通过 innodb_log_buffer_size 参数设置其可以使用的最大内存空间。
注:innodb_flush_log_trx_commit 参数对 InnoDB Log 的写入性能有非常关键的影响。该参数可以设置为0,1,2,解释如下:
0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作;
1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;
2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。
此外,MySQL文档中还提到,这几种设置中的每秒同步一次的机制,可能并不会完全确保非常准确的每秒就一定会发生同步,还取决于进程调度的问题。实际上,InnoDB 能否真正满足此参数所设置值代表的意义正常 Recovery 还是受到了不同 OS 下文件系统以及磁盘本身的限制,可能有些时候在并没有真正完成磁盘同步的情况下也会告诉 mysqld 已经完成了磁盘同步。
•innodb_max_dirty_pages_pct (global)
这个参数和上面的各个参数不同,他不是用来设置用于缓存某种数据的内存大小的一个参数,而是用来控制在 InnoDB Buffer Pool 中可以不用写入数据文件中的Dirty Page 的比例(已经被修但还没有从内存中写入到数据文件的脏数据)。这个比例值越大,从内存到磁盘的写入操作就会相对减少,所以能够一定程度下减少写入操作的磁盘IO。
但是,如果这个比例值过大,当数据库 Crash 之后重启的时间可能就会很长,因为会有大量的事务数据需要从日志文件恢复出来写入数据文件中。同时,过大的比例值同时可能也会造成在达到比例设定上限后的 flush 操作“过猛”而导致性能波动很大。
上面这几个参数是 MySQL 中为了减少磁盘物理IO而设计的主要参数,对 MySQL 的性能起到了至关重要的作用。 参考技术A //以下是缓存类:
<?php
class cache
//缓存目录
var $cacheRoot = "./cache/";
//缓存更新时间秒数,0为不缓存
var $cacheLimitTime = 0;
//缓存文件名
var $cacheFileName = "";
//缓存扩展名
var $cacheFileExt = "html";
/*
* 构造函数
* int $cacheLimitTime 缓存更新时间
*/
function cache( $cacheLimitTime )
if( intval( $cacheLimitTime ) )
$this->cacheLimitTime = $cacheLimitTime;
$this->cacheFileName = $this->getCacheFileName();
//echo $this->cacheFileName;
ob_start();
/*
* 检查缓存文件是否在设置更新时间之内
* 返回:如果在更新时间之内则返回文件内容,反之则返回失败
*/
function cacheCheck()
if( file_exists( $this->cacheFileName ) )
$cTime = $this->getFileCreateTime( $this->cacheFileName );
if( $cTime + $this->cacheLimitTime > time() )
echo file_get_contents( $this->cacheFileName );
ob_end_flush();
exit;
return false;
/*
* 缓存文件或者输出静态
* string $staticFileName 静态文件名(含相对路径)
*/
function caching( $staticFileName = "" )
if( $this->cacheFileName )
$cacheContent = ob_get_contents();
//echo $cacheContent;
ob_end_flush();
if( $staticFileName )
$this->saveFile( $staticFileName, $cacheContent );
if( $this->cacheLimitTime )
$this->saveFile( $this->cacheFileName, $cacheContent );
/*
* 清除缓存文件
* string $fileName 指定文件名(含函数)或者all(全部)
* 返回:清除成功返回true,反之返回false
*/
function clearCache( $fileName = "all" )
if( $fileName != "all" )
$fileName = $this->cacheRoot . strtoupper(md5($fileName)).".".$this->cacheFileExt;
if( file_exists( $fileName ) )
//echo $fileName;
//die();
return @unlink( $fileName );
else return false;
if ( is_dir( $this->cacheRoot ) )
if ( $dir = @opendir( $this->cacheRoot ) )
while ( $file = @readdir( $dir ) )
$check = is_dir( $file );
if ( !$check )
@unlink( $this->cacheRoot . $file );
@closedir( $dir );
return true;
else
return false;
else
return false;
/*
* 根据当前动态文件生成缓存文件名
*/
function getCacheFileName()
return $this->cacheRoot . strtoupper(md5($_SERVER["REQUEST_URI"])).".".$this->cacheFileExt;
/*
* 缓存文件建立时间
* string $fileName 缓存文件名(含相对路径)
* 返回:文件生成时间秒数,文件不存在返回0
*/
function getFileCreateTime( $fileName )
if( ! trim($fileName) ) return 0;
if( file_exists( $fileName ) )
return intval(filemtime( $fileName ));
else return 0;
/*
* 保存文件
* string $fileName 文件名(含相对路径)
* string $text文件内容
* 返回:成功返回ture,失败返回false
*/
function saveFile($fileName, $text)
if( ! $fileName || ! $text ) return false;
if( $this->makeDir( dirname( $fileName ) ) )
if( $fp = fopen( $fileName, "w" ) )
if( @fwrite( $fp, $text ) )
fclose($fp);
return true;
else
fclose($fp);
return false;
return false;
/*
* 连续建目录
* string $dir 目录字符串
* int $mode 权限数字
* 返回:顺利创建或者全部已建返回true,其它方式返回false
*/
function makeDir( $dir, $mode = "0777" )
if( ! $dir ) return 0;
$dir = str_replace( "\\", "/", $dir );
$mdir = "";
foreach( explode( "/", $dir ) as $val )
$mdir .= $val."/";
if( $val == ".." || $val == "." || trim( $val ) == "" ) continue;
if( ! file_exists( $mdir ) )
if(!@mkdir( $mdir, $mode ))
return false;
return true;
?>
//以下是调用方法:
$cache = new cache(3600);
$cache->cacheCheck();
//你的网页内容
$cache->caching(); 参考技术B 一般不是非常大的网站不需要设计到缓存。
高分求一段 PHP 实时显示倒计时 代码
求一段 PHP 实时显示倒计时 代码
问题如下:
2013年8月1日00时00分00秒 到 2013年8月2日00时00分00秒 为一个倒计时周期,
这个倒计时周期结束后自动重新进入 一个新的倒计时周期,
新的倒计时同期为 2013年8月2日00时00分00秒 到 2013年8月3日00时00分00秒,
这个倒计时周期结束后 重新进入 2013年8月4日00时00分00秒 到 2013年8月5日00时00分00秒,
.............
如此反复循环下去.
上面的 x年x月x日x时x分x秒 开始 到 x年x月x日x时x分x秒 结束 为自动获取服务器时间作为判断条件
然后前台显示效果 如下
当前时间为 13年8月1日 时 ,
就显示 距 13年8月2日 还有 x小时x分x秒 结束.
当前时间如果为 13年8月2日 时,
就显示 距 13年8月3日 还有 x小时x分x秒 结束.
...............
如此反复 依次类推
请各位走过路过的PHP大神们不吝赐教, 定当高分感谢!!!!!
<script type="text/javascript" >
function YaoShuai_time()
var Digital=new Date();
var hours=Digital.getHours();
var minutes=Digital.getMinutes();
var seconds=Digital.getSeconds();
var year=Digital.getFullYear();
var month=Digital.getMonth()+1;
var day=Digital.getDate();
var modhour=23-hours;
var modminute=59-minutes;
var modsecond=60-seconds;
if(month<=9) month="0"+month;
if(day<=9) day="0"+day;
if(minutes<=9) minutes="0"+minutes;
if(seconds<=9) seconds="0"+seconds ;
myclock="当前时间: "+year+"-"+month+"-"+day+" "+hours+":"+minutes+":"+seconds+"剩余时间"+modhour+":"+modminute+":"+modsecond;
if(document.layers)
document.layers.liveclock.document.write(myclock);
document.layers.liveclock.document.close();
else
document.getElementById('liveclock').innerHTML=myclock;
setTimeout("YaoShuai_time()",1000)
YaoShuai_time();
</script>
</div>追问
谢谢您的回答
你提供的JS代码虽然是我需要的效果 但可惜不是PHP的
我需要的是PHP 实现此效果的代码
因为JS 可以通过改变本地时间而改变最终需要的效果
所以 需要使用PHP来获取服务器时间来作为最终显示
那估计要用ajax 请求php来做这件事情
html
function gett()
$(function()
$.ajax(
url:'gettime.php',
type:"POST",
data:action:"guesslike",
dataType:"html",
timeout:3000,
cache:false,
success:function(re)
$('#hh').html(re);
)
);
setTimeout("gett()",1000)
gett();
gettime.php
以上是关于想做个 网站 ,求一段PHP编程代码,PHP的MYSQL缓存怎么实现? 最好举个例子。的主要内容,如果未能解决你的问题,请参考以下文章
想做个WinForm程序,在点击一下按钮就实现打开另外一个已有的应用程序,以及检测主机的IP和MAC