Swoole可以说是PHP的一把利剑。它扩展了PHP的边界,让很多PHPer看到了高并发的曙光。使用Swoole来提升Laravel的性能是一项非常值得的投资,这样既可以获得Swoole的高性能,又可以兼顾Laravel的高效,两全其美。Shadowfax就是这样一种扩展包,它简单易用,可以帮助开发者快速将Laravel应用迁移到Swoole上运行。首先我们看一下运行Shadowfax的Laravel应用的性能:我这次使用wrk作为基准测试工具,基于最新版本的Laravel7,但是去掉了session相关的中间件。因为Laravel默认开启了session,而session的驱动是file,如果在这种情况下运行测试,每次请求都会创建一个session文件,结果没有意义。(追求性能的应用不要使用file作为sessiondriver)环境一:Hardware:1CPU,4Cores,16GBMemoryMacOS10.15.3PHP7.3.12(enableopcache)Swoole4.4.13Shadowfax2(20workerprocesses)这个环境是我个人的MacbookPro,性能更好。我用wrk启动4个线程,并发200个做压测:wrk-t4-c200http://127.0.0.1:1215/结果是12430rps:Running10stest@http://127.0.0.1:1215/4个线程和200个连接线程统计平均Stdev最大+/-Stdev延迟26.44ms31.44ms212.73ms84.28%Req/Sec3.13k839.996.07k65.75%124418请求在10.01s,312.06MB0,超时0Request:0Request/SecTransfer/sec:31.18MBEnvironment2:Hardware:2CPUs,2Cores,4GBMemoryCentOS7.5.1804PHP7.3.16(opcacheenabled)Swoole4.4.17Shadowfax2(10workerprocesses)这个环境是一个虚拟云服务器实例具有一般配置的某些云。我用wrk启动2个线程,100个并发线程进行压力测试:wrk-c100http://127.0.0.1:1215/结果是4001rps:Running10stest@http://127.0.0.1:1215/2线程和100个连接线程统计平均Stdev最大+/-Stdev延迟25.06ms12.11ms85.92ms60.94%Req/Sec4.02k41.464.08k79.79%10.08s中有40321个请求,101.13MBreadRequestsperformance/sec.Trans01sec0itsnot:4不好,对吧?与传统的PHP-FPM相比,有了巨大的提升。安装和使用Shadowfax安装非常简单,只需要两步:第一步,使用Composer将Shadowfax安装到你的Laravel项目中:composerrequirehuang-yi/shadowfax第二步,使用Laravel的Artisan命令shadowfax:publish发布配置文件:phpartisanshadowfax:publish执行后会在你的项目根目录下创建一个名为shadowfax.yml的配置文件,你需要根据环境进行调整。当然这个文件会自动添加到.gitignore中,就像.env文件一样,不同的环境配置可能不一样。现在你可以通过Shadowfax命令启动你的服务了:phpshadowfaxstart如果是默认配置,你可以通过http://127.0.0.1:1215访问你的应用程序。当然,这只是一个简单的使用,更多信息可以在Shadowfax项目主页上找到。为什么选择Shadowfax当然有朋友会问,Github上已经有类似的开源项目了,为什么还要重复一个轮子。其实我早在2016年就开始尝试整合Swoole和Laravel,同时也开源了两个相关的项目。目前star数最高的swooletw/laravel-swoole是我之前发布的huang-yi/的一个fork。laravel-swoole-http。但是我并没有推广我的项目,因为我很清楚,之前的项目都或多或少存在一些问题,都不能很好的支持协程,而协程又恰好是Swoole的最强兵器,所以都放弃了。现在Shadowfax已经可以很好的支持协程了,大家可以放心的开启Swoole的协程特性了。而且Shadowfax还解决了协程环境下的数据库连接问题。当您启用Swoole的一键式协程时,Shadowfax会自动为您的数据库连接创建一个连接池。最重要的是,所有这些在您的应用程序代码级别都是不敏感的。您仍然可以像往常一样编写业务代码,完全没有任何精神负担,因为Shadowfax不需要您对编写代码的方式进行任何更改。最后要说明一下,Shadowfax并没有刻意赋予Laravel使用Swoole的能力。它的主要目的是在不破坏Laravel开发体验的情况下,以最小的成本提升Laravel应用程序的性能。我也不建议开发者在Laravel中使用Swoole的任何接口,因为Laravel本身就是一个运行在传统PHP模式下的框架,对Swoole并不友好。如果你不是资深的Swoole开发者,使用过程中很容易报错。如果你的Laravel应用程序中没有使用任何Swoole接口,这意味着你的程序也可以运行在PHP-FPM模式下。一旦在Swoole上运行的程序出现问题,我们可以立即切换回PHP-FPM模式,从而保证程序的可用性。如果你对Shadowfax感兴趣,请到Github上点个星来表示你的支持。我是黄奕,欢迎关注我的Github和博客。
