有个PHP的系统,没用什么框架,只用了点smarty,
现系统图片多,内容多,上面的老大想让我从缓存入手,
把系统变快点,现系统中有用到$_SESSION['user'] = $username;
其它大都是取数据库方面 的东西,(可弄个单独的文件cache文件,让其它文件调用)
大家帮我想想怎么弄,最好是贴个可用的代码,谢谢
现系统图片多,内容多,上面的老大想让我从缓存入手,
把系统变快点,现系统中有用到$_SESSION['user'] = $username;
其它大都是取数据库方面 的东西,(可弄个单独的文件cache文件,让其它文件调用)
大家帮我想想怎么弄,最好是贴个可用的代码,谢谢
解决方案 »
- discuz语法问题
- PHP中formValidator验证用户名跨域问题求解??IE内核的浏览器都返回错误,用w3sc浏览器如FF就没问题。
- 关于用户相片显示比例的问题,欢迎讨论!~
- php中时间处理的问题
- php +mysql
- 请教在向数据库中插入一条记录时,如何同时取得这条记录的id值
- 数据库是utf8,为什么取出来的数据是GBK
- 兄弟们,救救我吧,一百年一次,谁能将其linux版的php下de extension文件传给我,我好郁闷,我的系统中默认装的php下竟然没有mysql.so,我
- 怎样把网页上的表格内容导入到excel中,表格title有两层甚至三层,有例子请参考
- php视频直播系统
- 处理数组的问题,急
- 请问empty,!,==''的区别
静态内容流量比较多,可以考虑Apache mod_cache
数据方面,只能是从数据库优化方面下手。
//缓存文件的生命期,单位秒,86400秒是一天
define('CACHE_LIFE', 300);
//缓存文件的扩展名,千万别用 .php .asp .jsp .pl 等等
define('CACHE_SUFFIX','.cache');
//清除全部缓存文件所需的密码md5值
define('CLEAN_ALL_PASSWORD','60645f9c8e8862725798d9dccf07c885');
//缓存文件名
$file_name = md5($_SERVER['REQUEST_URI']).CACHE_SUFFIX;
//缓存目录,根据md5的前两位把缓存文件分散开。避免文件过多。如果有必要,可以用第三四位为名,再加一层目录。
//256个目录每个目录1000个文件的话,就是25万个页面。两层目录的话就是65536*1000=六千五百万。
//不要让单个目录多于1000,以免影响性能。
$cache_dir = CACHE_ROOT.'/'.substr($file_name,0,2);
//缓存文件
$cache_file = $cache_dir.'/'.$file_name;
//回调函数,当程序结束时自动调用此函数
function auto_cache($contents)
{
global $cache_file;
//加一个清空缓存的选择
$fp = fopen($cache_file,'wb');
flock($fp,LOCK_EX);
fwrite($fp, $contents);
flock($fp,LOCK_UN);
fclose($fp);
chmod($cache_file,0777);
//生成新缓存的同时,自动删除所有的老缓存。以节约空间。
clean_cache();
return $contents;
}
function clean_cache($clean_all=false)
{
if($clean_all)
{
if(!isset($_SERVER['PHP_AUTH_USER']) || md5($_SERVER['PHP_AUTH_PW'])!=CLEAN_ALL_PASSWORD)
{
header('WWW-Authenticate: Basic realm="需要身份验证"');
header('HTTP/1.0 401 Unauthorized');
sleep(3);
die('清空全部缓存需要密码');
}
else
{
sleep(1);
}
}
chdir(CACHE_ROOT);
foreach (glob("*/*".CACHE_SUFFIX) as $file)
{
if($clean_all || time()-filemtime($file)>CACHE_LIFE)
{
unlink($file);
}
}
}
//GET方式请求才缓存,POST之后一般都希望看到最新的结果
if($_SERVER['REQUEST_METHOD']=='GET')
{
//如果缓存文件存在,并且没有过期,就把它读出来。
if(file_exists($cache_file) && time()-filemtime($cache_file)<CACHE_LIFE)
{
$fp = fopen($cache_file,'rb');
flock($fp,LOCK_SH);
fpassthru($fp);
flock($fp,LOCK_UN);
fclose($fp);
die;
}
elseif(!file_exists($cache_dir))
{
if(!file_exists(CACHE_ROOT))
{
mkdir(CACHE_ROOT,0777);
chmod(CACHE_ROOT,0777);
}
mkdir($cache_dir,0777);
chmod($cache_dir,0777);
}
//缓存不能只建立一半,需要无视用户的取消。
ignore_user_abort();
//回调函数 auto_cache
ob_start('auto_cache');
}
else
{
//不是GET的请求就删除缓存文件。
if(file_exists($cache_file))unlink($cache_file);
//如果post了clean_all就清空全部缓存
if(isset($_POST['clean_all']))clean_cache(true);
}
下面是我在我要加快速度的页面中调用
require_once('cache.php');
这样会页面会快些,可系统中的session就全没了,
所以这种方法有点问题,大家帮我修改修改或,想想其它的方法,
图片也用url形式放在数据库中,
页面内容也是放在数据库中,
慢的原因就是取数据库中的东西,再显示到页面上慢,
smarty 已经提供了缓存功能,为什么不用?
不上memcache的话,添加cache,没有实时更新的页面,整个页面cache掉,其他的可以cache变量
不知道smarty的cache怎么样,一定可以设置的吧页面慢的话,图片太多太大,用户带宽限制 也是没办法的
设置设置apache Expires和Etag
压缩js css,合并ui图片应该还是很容易做的。。
2.图片数据到底保存在什么地方?数据库中还是服务器的文件系统?
3.具体到页面的什么内容保存在数据库中?整个HTML还是局部的动态内容。
如果瓶颈在这里,可以考虑两个方面:
1.PHP和数据库连接层的优化
2.数据库操作SQL的优化
如果明白我所说意思的话,具体介绍一下。
你看下我的那cache.php页面,他会把以前的缓存文件先清掉,
再生成一个新缓存,并会存在一个记事本中,并有时间控制的,
每多少时间生成一回,所以session就会清掉呀,