下面由laravel教程栏目给大家介绍如何让你的laravel在15毫秒内返回一个hello world!,希望对需要的朋友有所帮助!
首先,我认为通过返回最基本的hello world!字符串,是所有以laravel为框架的项目中,最基本的一个请求过程。除此以外,项目中的任何http请求,都会带有更多的业务逻辑和数据库查询等耗时操作,且这些逻辑的执行时间都是不可控和不可对比的。也就是说,其他任何请求都不会比返回一个hello world!字符串更短的时间了。所以,通过对比这个最基本的hello world请求响应时间,我们可以看出,不同的优化对于laravel框架从启动到执行结束的影响。
推荐:最新的五个laravel视频教程
测试参数参数版本
服务器 1c处理器,1g内存,1m带宽
php版本 8.0
进程管理 php-fpm
默认配置响应时间
可以看出,在安装php后,默认配置情况下,返回一个hello world!平均需要140ms左右。接下来,我们开始搞事情了!
round 1:laravel 缓存laravel为我们提供了很方便的artisan命令来开启缓存功能,有效的减少了文件读取次数。其中php artisan optimize命令包括了php artisan config:cache和php artisan route:cache命令,但是会多出现一个files缓存。将下面的 5 个命令依次执行:
root@aliyun-ecs / # php artisan optimizeroot@aliyun-ecs / # php artisan config:cacheroot@aliyun-ecs / # php artisan event:cacheroot@aliyun-ecs / # php artisan route:cacheroot@aliyun-ecs / # php artisan view:cache
我们再看下响应时间:
可见laravel的缓存对于最基础的请求,没有明显的影响。
round 2:开启 opcache这次,我决定使用提速效果最明显的手段:开启opcache扩展。由于本人是使用的 remi 源安装的php8,所以我这里安装opcache扩展会比较容易,其他版本的安装请自行 google。
root@aliyun-ecs / # yum install php80-php-opcache
等待安装结束后,我们重启php,然后看下扩展是否已经安装上:
root@aliyun-ecs / # systemctl restart php80-php-fpmroot@aliyun-ecs / # php -i|grep opcache.enableopcache.enable => on => onopcache.enable_cli => on => onopcache.enable_file_override => off => off
ok,已经开启opcache扩展了,我门再来看下hello world!的响应时间:
ohhhhhh!效果太明显了,一下子降到 30ms 以内,提升足足有将近 5 倍 的响应时间。注意一下,在第一次请求时,会比较慢,是因为opcache在写缓存导致的,访问过一次以后,速度就飞起了。到这里你就满足了吗?看看文章标题,我们要进一步加大力度!
round 3:开启 swooleswoole模块大家都懂,就是将应用程序提前加载到内存中,从而在处理请求时,减少文件的读取和加载过程,为php插上了翅膀。下面安装swoole扩展,其他版本的请自行 google。
root@aliyun-ecs / # yum install php80-php-pecl-swoole
老样子,安装完后检查下是否安装成功:
root@aliyun-ecs / # systemctl restart php80-php-fpmroot@aliyun-ecs / # php -i|grep swoole.enableswoole.enable_coroutine => on => onswoole.enable_library => on => onswoole.enable_preemptive_scheduler => off => off
扩展已经启用了,但是还无法进行测试。因为 swoole 是一个 cli 模式下的扩展,php-fpm无法使用。所以我们需要实现一个cli模式下的http应用。但实际上我们无需自己手动编写http应用,社区中有大佬已经写好了。所谓「前人种树,后人乘凉」,我们引入 laravel-swoole 软件包,再启动一个http服务即可,很简单。
// 引入软件包root@aliyun-ecs / # composer require swooletw/laravel-swoole// 发布配置文件root@aliyun-ecs / # php artisan vendor:publish --tag=laravel-swoole
执行以上两步操作后,即可在项目的config目录下找到swoole_http和swoole_websocket两个配置文件。一个基本的hello world!测试,无需修改默认配置,我们只在项目的.env文件中,添加swoole_http_host=0.0.0.0和swoole_http_port=2020即可,意思是在2020端口启动一个http监听程序。0.0.0.0指任何ip都可远程访问。
// .envswoole_http_host=0.0.0.0swoole_http_port=2020
基本配置修改完成,我们启动laravel-swoole的http应用:
root@aliyun-ecs / # php artisan swoole:http startstarting swoole http server...swoole http server started: <http://0.0.0.0:2020>
此时我们访问2020端口,即可测试使用swoole扩展后的应用。再看下请求的响应时间:
好家伙!直接干到15ms以内。这里第一次时间较长,是因为开了opcache的原因,会写入缓存。但这里的opcache写缓存,要比round 2那个只开启opache扩展要快很多,这都是swoole的功劳。
结语我又测试了一下,单独只启用swoole扩展,不启用opcache,发现响应时间和两个扩展都开启的响应时间一样。也就是说,有了swoole后,opcache就没用了?这个还得请各位大佬指点了。这里简单的做个对比:
通过实践对比,发现同时开启opcache和swoole扩展,是响应时间最快的。
其他问题php-fpm进程管理,为什么会创建master进程?不科学呀感谢感谢 @hesunfly 的解答。有时在命令行中用php -i模式查看扩展信息,和在页面中使用phpinfo()查看的扩展信息会有不一致的情况。这里引用下 @hesunfly 原话:
「有的发行版确实是 cli 和 fpm 的配置公用的,例如 mac 使用 brew 安装的 php 就是只有一个 php.ini。 但是我在 centos 和 ubuntu 下安装的一般是区分了cli 和 fpm 的。」
以上就是如何让你的laravel在15毫秒内返回一个"hello world!"的详细内容。