好久没来博客除草了,这几天接了一个帝国仿站的单子,小插曲很多,客户也是介绍的,我以前一个群里面的,刚开始是要做优化的,网站速度优化,于是给他贴出了优化方案。

图片优化,缓存优化,CDN,等等,刚开始拿到这个站的时候,是用phpcms开发的,首页20M左右,空间是3M的共享带宽,打开速度在15S左右(偶滴个神啊),很伤脑筋,先从他的服务器入手,再三劝说下,网站搬到阿里云,1核1G2M的已经可以承受庞大的首页了,打开速度大概在7秒左右(好戏开场了)。

接着,看了一下代码,整个人都不好了,有种想骂人的冲动(NMP……),以前他服务器是win系统的,后来搬到阿里云之后我给他用的是linux系统,代码里面各种大小写,各种CSS错乱,各种乱码,各种JS效果,一个百度商桥的代码,每个页面都有,很是蛋疼。这不是重点……,重点是,他们老板买了阿里云之后,又买了阿里的CDN,每次改完,找他们老板要阿里的账号密码,他们BOOS(简称BS了)就直接让扫码,很坑~,有的时候压根不理人的,本来一个几天能搞完的站点,偏偏拖了一个月(累觉不爱)。

好了,话就这么多吧,来谈谈我是怎么给他的站加速的吧,拿到代码之后,第一步,先看下各个文件里面有没有代码沉淀,代码垃圾,那种注释掉的代码,最好就是删了(我有洁癖……),这样可以使代码更整洁,可观,看了下他的首页加载,大部分都是图片,一个首页图片占了15M左右,果断找到BS,图片一个个的缩小体积,几千张图片,嗯,是个体力活。做好后发现,体积只有原来的三分之一,上传了图片包之后,速度提升了不少。

接下来考虑到首页缓存,由于以前没有接触过phpcms系统,对file缓存的不友好,就安装了一个APC缓存,出于以后学习用到,这边把安装方法贴出来吧。

一、WINDOWS下安装APC

第一步:下载php_apc.dll 在http://pecl.php.net/package/apc 要与php版本对应 将php_apc.dll放入你的ext目录
第二步:让php.ini支持apc扩展模块。 然后打开php.ini 加入:

1
2
3
4
5
6
extension=php_apc.dll
apc.rfc1867 = on
apc.max_file_size = 100M
upload_max_filesize = 100M
post_max_size = 100M
//以上参数可自己定义

第三步:检查是否支持PHP APC apc_store apc_fetch 查看phpinfo中是否有apc相关项

二、LIUNX下安装APC

第一步:下载和安装

1
2
3
4
5
6
wget http://pecl.php.net/get/APC-3.1.8.tgz
tar -zxvf APC-3.1.8.tgz cd APC-3.1.8
/usr/local/php/bin/phpize
./configure --enable-apc --enable-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex --with-php-config=/usr/local/php/bin/php-config
make
sudo make install

第二步:配置APC
在/usr/local/php/etc/php.ini 加入以下配置项:

1
2
3
4
5
6
7
8
9
10
extension = "apc.so" ;
;APC setting
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 64M
apc.optimization = 1
apc.num_files_hint = 0
apc.ttl = 0
apc.gc_ttl = 3600
apc.cache_by_default = on

第三步:检查安装是否成功
重启apache 或者 /usr/local/php/sbin/php-fpm restart
查看phpinfo中是否有apc相关项。

三、配置参数详细请Baidu,Google

Name Default Changeable Changelog
apc.enabled 1 PHP_INI_ALL
apc.shm_segments 1 PHP_INI_SYSTEM
apc.shm_size 30 PHP_INI_SYSTEM
apc.optimization 0 PHP_INI_ALL
apc.num_files_hint 1000 PHP_INI_SYSTEM
apc.ttl 0 PHP_INI_SYSTEM
apc.gc_ttl 3600 PHP_INI_SYSTEM
apc.cache_by_default On PHP_INI_SYSTEM
apc.filters “” PHP_INI_SYSTEM
apc.mmap_file_mask “” PHP_INI_SYSTEM
apc.slam_defense 0 PHP_INI_SYSTEM
apc.file_update_protection 2 PHP_INI_SYSTEM
apc.enable_cli 0 PHP_INI_SYSTEM > APC 3.0.6

 

四、写个总结吧

个人觉得,使用Spinlocks机制,能够达到最佳性能,apc.php,用于监控管理APC缓存(这是很棒的),APC默认通过了mmap匿名映射创建共享内存,缓存对象都存放在这块内存空间内,由APC自行管理共享内存,最后,谈一谈使用的感受吧,用APC缓存在企业站上面无非是很好的选择,但是效果并不是很理想,找了很多资料,最后得出的结论是,大型数据还是建议使用memcache(哭笑不得)。

回归到正题吧,搜了下百度,phpcms使用memcache缓存,在他们官方论坛发现了一个帖子,以下引用,版权归phpcms论坛所有~

 

关于V9使用 memcache缓存 论坛没搜索到帖子. 自己看了下代码 发现挺容易.
Step 1
修改 caches/configs/cache.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php return array (         'file1' => array (
                'type' => 'file',
                'debug' => true,
                'pconnect' => 0,
                'autoconnect' => 0
                ),
        'memcache1' => array (
                'hostname' => '127.0.0.1',
                'port' => 11211,
                'timeout' => 0,
                'type' => 'memcache',
                'debug' => true,
                'pconnect' => 0,
                'autoconnect' => 0
        )
);
?>

Step 2
打开 phpcms/libs/functions/global.func.php
修改下面四个方法的默认参数. 别问为啥要改默认参数。
因为其他调用方法均没有填充 $config 参数. 默认也没有切换缓存方式的开关。改这四个方法的默认参数就是最小改动。

1
function setcache($name, $data, $filepath='', $type='memcache', $config='memcache1', $timeout=0)

修改上面方法setcache() 以后 马上在后台更新缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php function getcache($name, $filepath='', $type='memcache', $config='memcache1') function delcache($name, $filepath='', $type='memcache', $config='memcache1') //对照替换 添加了一行代码 return $cache->get($name, '', '', $filepath);
function getcacheinfo($name, $filepath='', $type='memcache', $config='memcache1') {
        pc_base::load_sys_class('cache_factory');
        if($config) {
                $cacheconfig = pc_base::load_config('cache');
                $cache = cache_factory::get_instance($cacheconfig)->get_cache($config);
                return $cache->get($name, '', '', $filepath);
        } else {
                $cache = cache_factory::get_instance()->get_cache($type);
        }
        return $cache->cacheinfo($name, '', '', $filepath);
}
?>

到底性能有多少提升还没感觉。。因为我站数据不多。更新缓存的速度确实快了很多  暂时也没功夫去出测试数据了。

关于系统memcache的配置 不在本帖范畴。我使用的是centos系统。 另外使用memadmin可以监控.

不建议新手接触 因为在使用中发现这么配置 还是会遇到些问题. V9默认使用file缓存的地方还是有很多的 所以配置memcache并不是很必要。

注意: 如果你自认为水平很一般的话 ,代码完全不懂得。修改前请用本地测试环境走一遍流程 免得搞出问题。

按照上述的来了一遍,发现速度确实可观,从原来的5S,到现在的1S左右,对此也得到了他们BS的认可。到这边你会觉得已经结束了,你错了,并没有结束!!!

BS说,这个站要      重!新!做!   你没听错,我花了几天去搞缓存,最后换来重做,瞬间对这个BS产生厌恶心里,不过还好,前面的账没拖我的,原本打算用thinkPHP框架的,感觉他们BS出的钱不是很多,想想用帝国算了,于是,开启了我的仿站之旅~

不过,仿站进行的还是很顺利,相比前面做的优化,时间,进度,速度都快很多,毕竟是大帝国CMS,哈哈~

好了,文章到这边总算快结束了,如果有不懂的代码问题,可以留言给小站,小站能解决的,都会解决的~

--END--