Fecshop 性能问题 ¶
硬件配置 ¶
硬件配置当然是越快越好,内存越大越好,这个没得说哈,内存一定要够用。
内存够大,cpu够多,够快
数据库硬盘尽量用SSD,加快读写
环境配置 ¶
1.php配置,php细节配置参数很多,有很多根据服务器情况的设置和优化
开启Opcache
,参考:php 安装 zend opcache
使用php7,最近新出的php7.2引入的JIT, 比php7.1提升了10%的性能,
php7的优化:让PHP7达到最高性能的几个Tips
等等
2.Mysql配置优化
2.1、mysql
的配置文件参数优化
2.2、有时候,程序员写代码在对象的生成调用,没有写类变量保存中间结果,造成 每次调用方法都是去数据库查询,造成相同的sql执行多次的情况, 对于这类的问题的排查,最好的方式是在本地机,访问某个前端页面,打印mysql执行 的sql语句,查看sql语句是否存在问题,另外对于线上,可以把mysql的慢查询日志打印出来。
打印sql语言的方法 mysql 将执行的所有sql语句,输出到log日志(写入log日志), 以及将慢查询sql输出到日志文件
2.3、对于mysql的操作,增删改查
,对于查询
,我们可以通过慢查询日志
将其打印出来,
但是对于增删改
, 如果执行慢,一般都是锁的问题,也就是尽量的使用到行锁。
因此,对于mysql,尽量用innodb,支持行锁,但是,innode使用行锁还是使用表锁, 是有条件的,是基于索引的。
譬如 update customer set age = 19 where name = 'terry'
如果 customer表的name字段有索引,那么就会使用行锁,锁的行就是name = 'terry', 也就是 name = 'terry'的数据有多少行,就会锁多少行的数据, 如果customer表的所有数据行的name的值都是terry,那么就会锁所有的行, 因此,就相当于表锁了,因此,如果name字段没有加索引,那么就相当于锁住所有的行, 那么就是表锁了,对于update操作,如果where条件存在多个字段的条件查询,不一定所有的所有的列都加 索引,如果where条件是三个字段,而索引只有2个字段,那么就会锁住这两个字段命中的数据行, 因此根据实际情况做好索引,除了可以优化查询,对于update更新同样重要, update 的where条件中的字段索引命中的数据行越少,锁的数据行就越少
其他的关于表锁的,可以参看:http://www.fecshop.com/topic/283
2.4另外,对于自己开发的功能,有的功能可以使用乐观锁:
关于Yii2的乐观锁和悲观锁可以参看:http://www.digpage.com/lock.html
2.5【闲谈】 有一些系统,可以被拆成多个子系统,通过api对接, 各个api的方法要满足幂等性,譬如:http://www.fecshop.com/topic/534 ,通过程序的方式来控制回滚,上面的这个文章有一个大致的介绍,有兴趣的可以读读, 由于这块我了解的也只限于理论层面(和java架构师聊的知识),没有具体操作过, 因此,有兴趣您看看就好。
3.Mongodb配置优化
注:上面的配置参数的优化,首先要了解相应的配置参数的含义, 然后根据具体情况做优化配置,譬如,机器内存36G,那么可以把 php的进程数设置多一些。
Fecshop生产环境配置优化 ¶
1.asset设置
1.1关闭forceCopy
对于需要css的端口 appfront 和apphtml5,打开 @app/config/fecshop_local_services/Page.php
,设置:
'forceCopy' => false,
关闭后,如果更新js和css信息,您需要去@app/web/assets
下面手动清空
``assets文件,清空后,Yii2的下次访问会自动复制最近的js和css文件
当然,如果你的网站访问量不大,开启也是可以的,更新js和css会方便一些,不需要去@app/web/assets
下面手动清空
1.2 更新js和css后,更新版本号
更新版本号的方式参看Fecshop theme js and css
, 这篇文章的 js和css 浏览器缓存和版本
部分
这样js和css更新后,会强制浏览器加载最新的js和css文件, 而不是去使用浏览器缓存。
1.3 使用cdn
2.config优化,开启单文件配置
fecshop的配置最终是由N个配置php文件
合并而成,
在每次初始化 前执行,为了加速,可以先把配置文件合并成单文件,
然后加载这个合并成的单配置文件,就会比较节省资源,加快速度。
设置:在入口文件@app/web/index.php
代码: $use_merge_config_file = false;
处设置。
true
代表打开,false
代表关闭
打开配置加速开关前,您需要先生成单配置文件。 您需要执行 http://www.domain.com/index-merge-config.php 进行生成单文件配置数组。 注意:打开后,当您修改了配置, 都需要重新生成单文件配置数组,否则修改的配置不会生效,。
建议:
1.本地开发环境关闭,开发环境如果访问量不大,关闭也行,
如果访问量大,建议打开
2.http://www.domain.com/index-merge-config.php是访问执行,因此,
我们希望只能由我们自己人执行,因此,
2.1.您可以把这个`index-merge-config.php`文件的名字改一下,改成 `fdad78fds7fds7fds8.php` ,只有自己人
知道的文件路径
2.2在nginx上面对这个文件访问做一下密码控制,详细参看:
[nginx 某个目录访问设置账户密码访问](http://www.fecshop.com/topic/407)
3.开启缓存
fecshop的缓存分为局部缓存和全页缓存,使用的是yii2的机制,
开启缓存可以加速,详细参看: fecshop cache
4.浏览器加载加速
fecshop已经遵循下面的优化方式,如果您开发了新的模块,建议也这样,加快浏览器页面 的渲染。
4.1 js部分
fecshop的css放到html页面的头部,js放到页面的底部,这样可以让浏览器 快速加载
4.2 js和css 链接url用独立的域名
,图片链接url
用独立的域名,使用独立域名的好处,可以参看文章:
网站的图片,css,js 为什么要和网站的域名不一样
5 扩展优化
可以使用elasticSearch
,用于产品,分类,搜索页查询,
目前fecshop不支持用elasticSearch
,可以自己扩展。
6 mysql
mongodb
设置慢查询
日志,把慢查询的语句找出来,定位到功能,
然后进行处理
7 nginx访问日志设置开始和结束时间,把间隔时间
比较长的url找出来
8.services部分也可以开启日志,不过消耗比较大,可以短时间的开启,
查看各个services
的各个方法执行消耗的时间。
具体实现可以参看文件 @fecshop/services/Service.php
9.如果访问量比较大,
9.1 数据库:可以把mongodb
做复制集,mysql
做主从复制
9.2 图片:图片可以放到云库
,如果图片放到自己的服务器,可以通过NFS
,将
图片服务器的磁盘挂载到php服务器
的图片路径下,然后把域名指向图片服务器。
9.3 加几个php机器,nginx
做负载均衡
9.4 缓存
和session
放到redis
服务器里面
这样各个层都是单独的服务器,分布式拆开,性能会提升很多。
最后,如果您开发了新模块,可以参看一下Yii2的性能优化建议
采用fecshop官方插件提速 ¶
10.对于appserver端,是给vue这类使用的,如果您的appserver域名和vue的域名不一样, 使用的是跨域名的方式,就会涉及到跨域问题 就会使用的cros来满足跨域,cros会在首次,以及访问过程中时不时的发送options 请求来获取是否可以访问内容(cros不了解的可以自己查询), 因此,对于options请求,在index.php部分直接返回,会更节省资源
@appserver/web/index.php 将头部注释去掉即可
<?php
/**
* 【Appserver端性能优化】:如果vue和appserver是不一样的域名,对于这种跨域的前端和后端交互,需要cros机制,具体您可以自己查阅
* 原理为:第一次发送options请求,如果请求成功,获取服务端允许的请求类型,然后再发起具体的数据请求
* 对于options请求,不涉及到数据,因此直接返回即可,因此下面加了下面的代码
* 对于下面的设置的允许的值,是fecshop目前允许的,如果您添加了其他的,请在下面自行修改
* 下面的cros的信息要和 @fecshop/app/appserver/modules/AppserverTokenController.php 这个文件里面的设置要一致。
* 默认,下面是注释掉,您可以根据自己的情况,取消掉下面的注释,让options请求在index.php文件执行的时候直接返回,节省资源。
*/
/* !!!将这块代码的注释去掉,去掉前详细读完上面的注释
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
$cors_allow_headers = ['fecshop-uuid','fecshop-lang','fecshop-currency','access-token'];
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, ".implode(', ',$cors_allow_headers));
header('Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS');
exit;
}
*/
其他 ¶
等等,如果你有新的优化建议,可以在fecshop.com发帖,一起成长。
Terry对fecsop,开启opcache和fecshop缓存过程中的速度测试,参看: Fecshop 性能速度测试(测速)