无需修改任何代码和扩展将你的laravel项目性能提高20倍 | laravel作品分享 -江南app体育官方入口
2024-08-02日补充
- 最新文档地址:
- 兼容性更新已支持php8.1
- 特性更新已支持自我守护模式运行
正文
我要分享一个令人激动的黑科技:这个项目能够在无需修改任何代码且无需第三方扩展的前提下,将你的 laravel 项目性能提高 20倍。它仅依赖于 php 原生的 pcntl
、posix
、fiber
和 sockets
。
项目灵感
起因是看到官方发布的 php 8.1 更新中引入了 fiber 特性,看到这则消息时我非常激动,我仿佛看到了 php 的更多可能性。再结合我对swoole 和 workerman 的工作流程了解得出结论:它能够完美应用到 laravel 和 thinkphp 等这些规范的面向对象标准框架中。
思路
我的思路是通过利用 fiber 特性,将 laravel 项目中的 i/o 操作异步化,从而减少阻塞时间,提高整体性能。具体方法包括以下几个方面:
- 利用 fiber 实现协程:将传统的同步 i/o 操作改为异步 i/o 操作,使得 php 代码能够在等待 i/o 操作时执行其他任务。
- 集成到现有框架:在不修改现有业务逻辑代码的前提下,通过中间件或扩展包的形式,将新的异步 i/o 操作集成到 laravel 项目中。
- 优化资源利用率:通过减少阻塞时间,提高服务器的并发处理能力,从而提升整体性能。
- 提供更多协程助手:提供更多的协程助手函数,方便开发者使用协程特性。
- 借鉴了async/await特性:借鉴了javascript中的async/await特性,提供了类似的函数,方便开发者编写异步代码。
结果
经过一系列的测试和优化,这个项目最终成型,到目前为止我已经在生产环境中部署且能够在 unix/linux 服务器上正常工作,以下为性能对比结果:
同时该项目的安装流程也非常简单
安装方法
通过 composer 安装
composer require cclilshy/p-ripple-drive
运行
php artisan p:run
# -l | --listen 服务监听地址,默认为 http://127.0.0.1:8008
# -t | --threads 服务线程数,默认为4`
nginx 伪静态配置
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://127.0.0.1:8008;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header x-forwarded-proto $scheme;
}
不出意外应该是这样的运行结果:
至此,你的工作已经完毕,无需进行额外配置,但仍然需要有一定了解 cli运行模式的机制,并知悉下列函数在运行过程中会发生什么以决定如何使用它们,如 dd
、var_dump
、echo
、exit
、die
。如果你的项目中充斥了
header('content-type: application/json');
die(json_encode($data));
这样的写法则不适用于该项目
更多
该项目不仅提供了性能提升,还提供了多个协程助手以让开发者能够充分利用协程的特性。当然你也可以忽略这一项。如你可以在控制器中做这些事:
特性 defer
public function index(request $request) : string {
\p\defer(function(){
//todo: 这里的代码将在 return 之后运行, 允许返回请求后做某些事情
});
return 'hello pripple';
}
特性 await
public function index(request $request) : string {
// 非堵塞进程模式读取某个文件
$content = \p\await(
\p\io::file()->getcontents(__file__)
);
return $content;
}
特性 组件原生化
pripple 不会干涉组件的规范,你可以使用任何你喜欢的组件,并得到预期的结果。如以下例子将得到 guzzlehttp
的标准 response 对象:
public function index(request $request) : string {
// 非堵塞进程模式请求某个 url
$response = \p\await(
\p\net::http()->guzzle()->getasync('http://www.baidu.com')
);
return $response;
}
附言
目前,该项目已经支持 thinkphp 和 laravel。未来我计划将它扩展到更多的 php
框架中。尽管该项目在我的服务器上完全正常工作,我甚至觉得它很完美,但依然可能有意料之外的bug需要发现。期待大家在使用过程中反馈问题,共同完善这个项目。也欢迎大家参与到项目的开发和优化中,共同推动
php 生态的发展。如果你想了解它是怎么工作的以及更多的使用方法欢迎查阅文档:
项目驱动:
项目核心:
项目交流
群聊直通车 | 作者微信(邀请入群) |
---|---|
我特地建了个交流群以供各位交流,欢迎通过添加我本人微信 jingnigg 进入交流群
推荐文章: