起因是看到官方发布的 PHP 8.1 更新中引入了 fiber 特性,看到这则消息时我非常激动,我仿佛看到了 PHP 的更多可能性。再结合我对 Swoole 和 Workerman 的工作流程了解得出结论:它能够完美应用到 Laravel 和 ThinkPHP 等这些规范的面向对象标准框架中。
我的思路是通过利用 fiber 特性,将 Laravel 项目中的 I/O 操作异步化,从而减少阻塞时间,提高整体性能。具体方法包括以下几个方面:
经过一系列的测试和优化,这个项目最终成型,到目前为止我已经在生产环境中部署且能够在 Unix/Linux 服务器上正常工作。
通过 Composer 安装:
composer require cclilshy/p-ripple-drive
php artisan p:run # -l | --listen 服务监听地址,默认为 http://127.0.0.1:8008 # -t | --threads 服务线程数,默认为4`
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));
这样的写法则不适用于该项目
该项目不仅提供了性能提升,还提供了多个协程助手以让开发者能够充分利用协程的特性。当然你也可以忽略这一项。如你可以在控制器中做这些事:
public function index(Request $request) : string { \P\defer(function(){ //TODO: 这里的代码将在 return 之后运行, 允许返回请求后做某些事情 }); return 'Hello PRipple'; }
public function index(Request $request) : string { // 非堵塞进程模式读取某个文件 $content = \P\await( \P\IO::File()->getContents(__FILE__) ); return $content; }
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
上一篇:三星gtp7500系统升级
下一篇:百度优盘网址在哪里