[更新]laytp性能提升优化

动态 未结 0 314
JunStar
JunStar VIP9 2020-08-06 20:43:18
悬赏:10积分 收藏
为了提升性能优化,最近花了3周时间学习了Go语言。
去学习Go的起因是使用了Jmeter的多线程HTTP请求工具对比了Go的webserver(选用的框架是go-admin)和laytp在nginx+fpm下的请求对比。
发现Go的性能真是太强大了。

比对过程如下:
laytp,在nginx+fpm+mysql下运行时,不优化fpm的配置情况下,使用500个线程,循环请求10次带有数据库查询的页面请求,会有0.6%的请求会返回502错误,吞吐量在300;(后来优化了fpm配置,将fpm进程使用静态方式将服务器资源占据50%,并发较少情况下,吞吐量还是很低。)

go-admin,安装完成后,使用go run main.go运行web服务,使用1W个线程,循环请求10次,没有错误,并且吞吐量在800。使用更少线程,他的吞吐量会更高,最高能达到吞吐量是3000;

以上测试结果仅供参考,我是用我自己的机器测试的,并不是准确的性能指标,但是已经可以粗略比对出结果,Go比fpm的性能高太多。

名称解释,吞吐量就是每秒能处理完成的请求数。于是乎,去学习了go语言。
学完之后发现,go本身的GMP协程模型是他高性能的原因,但是go的框架并不强壮。
如果使用go语言开发一个类似laytp的框架,要花费很长时间。
于是尝试了think-swoole扩展,废弃掉fpm,使用swoole来提供web服务,性能有很大提升。
我们说Go比fpm的性能高20倍,那么使用swoole至少比fpm要高10倍。这样的性能已经足够强了。开发效率也能得到满足。
当然,thinkphp提供的性能优化还有四个生成缓存的命令行工具,这里一并记录他们如何使用,有的在laytp里面不能直接使用。

四个生成缓存的命令行工具
命令描述命令是否可以直接使用作用
生成类库映射文件optimize:autoload可以直接使用thinkphp使用composer管理包工具,会加载很多文件,这里生成类和路径对应的关系classmap减少autoload加载类的时间
生成数据表字段缓存php think optimize:schema可以直接使用生成数据库字段缓存,去掉SHOW COLUMNS FROM tableName的查询,有需要注意的点,下面会详细介绍
生成路由映射缓存php think optimize:route可以直接使用生成路由缓存
生成配置缓存php think optimize:config不可以直接使用这个会直接生成你使用了那些类和配置,在runtime下生成init.php文件。
首次生成后,需要修改下init.php,把重复的use thinkphp\facade\Url;删除。
而且,如果你在后台修改了系统配置,你需要重新生成这个缓存
注意点:php think optimize:schema命令执行完成之后,需要同时把app.debug和database.debug都设置成false。将app.trace设置成true,在基本信息中可以比对查询次数会变少,可以知道这个操作是否生效。之前的tp版本,执行这个查看trace信息中的sql语句时,还会看到除了SHOW COLUMNS FROM tableName的其他sql,现在已经不能看到了。

如何使用think-swoole扩展
第一步,安装php的swoole扩展,请到swoole官方查看文档进行安装。http://www.swoole.com
第二步,使用composer require topthink/think-swoole=2.0.*安装think-swoole扩展库,这里一定要带上版本号,否则会自动安装最新版本,现在的最新版本是3.0,他是thinkphp官方为thinkphp6提供的swoole扩展库包。在thinkphp5.1中是不能使用的。laytp目前是基于thinkphp5.1的,所以也就不能使用。
第三步,关掉你的fpm,在web根目录下使用php think swoole提供web服务。他默认IP是0.0.0.0端口号是9501,启动了swoole后,就可以使用127.0.0.1:9501访问你的webserver了。

注意点:
1.swoole和fpm提供的超全局变量数组$_SERVER不相同。swoole提供得少一些,有些放到了header里面,比如user_agent,swoole的$_SERVER没有。所以laytp本次更新代码的重点就是,把$this->request->server改成$this->request->header。
2.获取参数的方式推荐都使用$this->request->param,尤其是不要使用$this->request->request

使用think-swoole扩展后,部署建议:
推荐你在swoole前面搭建nginx,在nginx里面使用反向代理的方式,代理swoole提供的web服务,来向外提供webserver。
理由:swoole的ip绑定不支持域名,nginx支持,由于不支持域名,只支持变更端口号,所以不能支持多个域名都使用80端口指向到同一个服务器ip提供web服务。加一个nginx做反向代理就可以了。
nginx方向代理的配置示例:
server{
listen 80;
server_name 你的域名;
root 你的laytp下的public目录;
index index.php index.html;

if (!-e $request_filename) {
proxy_pass http://127.0.0.1:9501;
}
}
回帖
  • 消灭零回复
本周热议
没有相关数据