【黑科技】:Laravel 项目性能提升 20 倍

令人激动的黑科技:Laravel 项目性能提升 20 倍

这个项目能够在无需修改任何代码且无需第三方扩展的前提下,将你的 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 安装:

bash 复制代码
composer require cclilshy/p-ripple-drive

运行

bash 复制代码
php artisan p:run
# -l | --listen     服务监听地址,默认为 http://127.0.0.1:8008
# -t | --threads    服务线程数,默认为4`

Nginx 伪静态配置

bash 复制代码
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。如果你的项目中充斥了

bash 复制代码
header('content-type: application/json'); 
die(json_encode($data));

这样的写法则不适用于该项目

更多

该项目不仅提供了性能提升,还提供了多个协程助手以让开发者能够充分利用协程的特性。当然你也可以忽略这一项。如你可以在控制器中做这些事:

特性 defer

bash 复制代码
public function index(Request $request) : string {
    \P\defer(function(){
        //TODO: 这里的代码将在 return 之后运行, 允许返回请求后做某些事情
    });
    return 'Hello PRipple';
}

特性 await

bash 复制代码
public function index(Request $request) : string {
    // 非堵塞进程模式读取某个文件
    $content = \P\await( 
        \P\IO::File()->getContents(__FILE__) 
    );
    return $content;
}

特性 组件原生化

bash 复制代码
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 生态的发展。如果你想了解它是怎么工作的以及更多的使用方法欢迎查阅文档:

项目驱动: https://github.com/cloudtay/p-ripple-drive/blob/main/README.zh_CN.md

项目核心: https://github.com/cloudtay/p-ripple-core/blob/main/README.zh_CN.md

相关推荐
JaguarJack9 小时前
FrankenPHP 原生支持 Windows 了
后端·php·服务端
BingoGo9 小时前
FrankenPHP 原生支持 Windows 了
后端·php
JaguarJack1 天前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo1 天前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack2 天前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay3 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954483 天前
CTF 伪协议
php
BingoGo5 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack5 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo6 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php