当前位置: 首页 > 后端技术 > PHP

了解swoole运行方式,加速laravel应用

时间:2023-03-29 19:36:42 PHP

1.SwooleSwoole号称重新定义PHP。它是一个PHP扩展,使PHP能够以异步方式执行,就像node一样,也可以使用sockets,为PHP提供了一系列异步IO、事件驱动、并行数据结构的功能。Swoole4支持完整的协程编程模式,可以使用完全同步的代码来实现异步程序。PHP代码无需额外添加任何关键字,底层自动进行协程调度,实现异步IO。nodejs能实现的swoole几乎都可以实现,性能比nodejs高。毕竟nodejs是单线程的,不能充分发挥CPU的性能,而swoole是多线程的,可以充分发挥CPU的性能。Swoole的高效与传统web开发有什么区别?除了传统的LAMP/LNMP同步开发模式,swoole的异步开发模式是什么,如何保持效率?2、传统的web开发模式PHPweb开发采用LAMP/LNMP架构,即Linux、Nginx、Mysql和PHP。这里我们以nginx为例。大体结构是:当一个请求进来时,web服务器将请求转发给PHP-FPM。PHP-FPM是一个具有进程池架构和内置PHP解释器的FastCGI服务。FPM负责解释执行PHP文件生成响应,最终返回给web服务器显示给前端。PHP文件中实现了很多业务逻辑,包括访问Mysql和Nosql,调用第三方应用等。php-fpm和nginx在这种结构下的配合已经足够好了,但是由于php-fpm本身是一个同步阻塞的进程模型,所有的资源(包括框架初始化创建的一系列对象)都是在请求结束后释放的,导致PHP进程“Idling”(create<-->destroy<-->create)大量消耗CPU资源,导致单机吞吐量受限。处理每个请求的过程意味着不必要的耗时操作,例如PHP文件解析和环境设置。PHP进程处理完后会被销毁。在PHP程序中不可能使用连接池等技术来实现性能优化。3、Swoole运行方式针对传统架构存在的问题,swoole从PHP的扩展入手,解决了上述问题。我们已经了解了swoole的进程模型。与传统架构相比,Swoole进程模型最大的特点是其多线程Reactor模式处理网络请求,可以轻松处理大量连接。此外,优点还包括:完全异步非阻塞,资源消耗低,程序执行效率高,程序运行只解析和加载PHP文件一次,避免了每次请求重复加载过程,并使与连接池和请求。实现信息传输等成为可能。4.为什么要在Swoole上运行Laravel?Laravel框架在启动时,需要加载很多文件。再加上它以良好的生态环境着称,所以我们在发展过程中会发现很多问题。造的轮子很多,导致Laravel一次性启动的磁盘IO非常高(也就是需要加载很多文件)。每次发出请求时都需要执行laravel生命周期。因为单个请求创建的环境会在请求执行结束后立即销毁。换句话说,在传统的PHP生命周期中,大量时间浪费在创建和销毁用于脚本执行的资源上。想象一下像Laravel这样的框架,每次请求需要加载多少个文件?也浪费了大量的I/O操作。那么如果我们使用Swoole搭建一个应用级的Server,所有的脚本文件加载一次就可以保存在内存中呢?这就是为什么我们需要尝试在Swoole上运行Laravel。Swoole可以提供强大的性能,而Laravel可以提供优雅的代码结构。这两个真的是绝配!5.使用Swoole提升Laravel的性能。现有的轮子中,我觉得下面两个还是很不错的。可以选择swooletw/laravel-swoolegarveen/laravoole。我选择了第一个来测试Installwithcomposer:composerrequireswooletw/laravel-swoole如果你使用的是laravel,那么将SwooleTW\Http\LaravelServiceProvider::class添加到config/app.php的providers数组中,如果你使用的是lumen,然后在bootstrap中添加如下代码到/app.php$app->register(SwooleTW\Http\LumenServiceProvider::class);将配置文件导出到config目录下phpartisanvendor:publish--provider="SwooleTW\Http\HttpServiceProvider"然后就可以到config/swoole_http.php配置信息'server'=>['host'=>env('SWOOLE_HTTP_HOST','0.0.0.0'),//监听任意ip'port'=>env('SWOOLE_HTTP_PORT','1215'),'options'=>['pid_file'=>env('SWOOLE_HTTP_PID_FILE',base_path('storage/logs/swoole_http.pid')),'log_file'=>env('SWOOLE_HTTP_LOG_FILE',base_path('storage/logs/swoole_http.log')),'daemonize'=>env('SWOOLE_HTTP_DAEMONIZE',1),//1-程序会转入后台,作为守护进程运行],swoole_http.php也有提到对于providers数组的配置,'providers'=>[//App\Providers\AuthServiceProvider::class,]因为使用swoole作为http后,这些providers会存储在内存中,所以这里的配置是每次请求都要重新注册并重启提供者现在,您可以执行以下命令来启动SwooleHTTP服务。$phpartisanswoole:httpstart然后可以看到如下信息:Startingswoolehttpserver...Swoolehttpserverstarted:现在可以访问http://127.0.0.1:1215进入Laravel应用。注意:本扩展不支持热重启,所以每次有代码更新,都要重启服务phpartisanswoole:httprestart6.性能测试使用Apache的ab测试工具ab-n1000-c10http://127.0。0.1:1215/参数说明:-n1000个请求-c10个并发数图1是使用swoole作为应用服务器,图2是虚拟机中的apache服务器测试环境,电脑配置也差,性能一般没有充分利用,可见apache只完成了197个请求就承受不住压力了。swooleHTTP服务已经完成压测,性能全面碾压apache服务器。7、使用Nginx代理swoole官网上也提到:swoole_http_server不完全支持Http协议,建议只作为应用服务器使用。并在前端添加Nginx作为代理。然后,我们需要在nginx.conf中添加服务器:server{listen80;server_nameyour.domain.com;根/path/to/laravel/public;索引index.php;location=/index.php{#确保在你的“public”目录中没有名为“not_exists”的文件。try_files/not_exists@swoole;}location/{try_files$uri$uri/@swoole;}location@swoole{set$suffix"";if($uri=/index.php){设置$suffix"/";}proxy_set_header主机$host;proxy_set_headerSERVER_PORT$server_port;proxy_set_headerREMOTE_ADDR$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;#IFhttps#proxy_set_headerHTTPS"on;proxy_passhttp://127.0.0.1:1215$suffix;}}配置请参考swoole文档的Nginx/Apache官方配置,至此,大功告成,八、使用swoole和传统php开发的缺点本文主要介绍了使用swoole作为laravel的响应服务器,最后说说使用swoole和传统php开发的缺点1.它上手难度更大。这就需要开发者对多进程运行方式2有更清晰的认识,更容易泄漏内存。处理全局变量和静态变量时要小心。这种不会被GC清理掉的变量,会存在于整个生命周期中。如果处理不当,很容易耗尽所有内存。在php-fpm下,php代码执行完后内存会被完全释放。参考链接:在Laravel中使用swoole替代nginx作为http服务器,使用swoole为你的laravel应用提速