使用swoole改造laravel应用标签(空格分隔):php1。概述1.1swoole介绍Swoole是为PHP开发的生产级异步编程框架。他是一个用纯C开发的扩展,可以让PHP开发者不用过多的非阻塞I/O编程和底层Linux,就可以在PHP中编写高性能、可扩展的并发TCP、UDP、Unixsocket、HTTP、WebSocket服务内核知识。你可以把Swoole看成是Go,但是它对于PHP会有更高的性能。1.2为什么要在Swoole上运行Laravel?在PHP的生命周期中,每次运行一个PHP脚本,PHP都需要初始化模块,为你的运行环境启动zend引擎。并将PHP脚本编译成OpCodes供ZendEngine执行。但是每次请求都需要执行这样的生命周期,因为单次请求创建的环境会在请求结束后立即销毁。也就是说,在传统的PHP生命周期中,浪费了为脚本执行创建和销毁资源所花费的大量时间。想象一下像laravel这样的框架,每次请求需要加载多少个文件?也浪费了大量的I/O操作。swoole是应用层的内置服务器,所有的Script文件加载一次就可以保存在内存中。这就是为什么我们需要尝试在swoole上运行laravel。Swoole可以提供强大的性能,而Laravel可以提供优雅的代码结构。完美的!2.准备appphplaravelswooleyyour.domain.com7.1.165.4.364.1.22.1wrkbenchmarktool:wrk//wrk命令参数-c,--connections:每个线程处理保持打开的HTTP连接总数N=connections/threads-d,--duration:测试持续时间,例如2s,2m,2h-t,--threads:要使用的线程总数-s,--script:LuaJIT脚本,见SCRIPTING-H,--header:添加到请求的HTTP标头,例如"User-Agent:wrk"--latency:打印详细的延迟统计信息--timeout:如果没有收到响应则记录超时这段时间。2.2php-swoole安装peclinstallswooleRUNsed-i's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g'/etc/apk/repositories\&&sed-i's/nl.alpinelinux.org/mirrors.aliyun.com/g'/etc/apk/repositoriesRUNapkadd--no-cache--virtual.build-deps\$PHPIZE_DEPS\&&docker-php-sourceextract\&&cd/usr/src\&&wgethttp://pecl.php.net/get/swoole-4.1.2.tgz\&&tar-xzvfswoole-4.1.2.tgz\&&mv/usr/src/swoole-4.1.2/usr/src/php/ext/swoole\&&docker-php-ext-configureswoole--enable-openssl\&&docker-php-ext-installswoole\&&runDeps="$(\scanelf--needed--nobanner--format'%n#p'--recursive/usr/local\|tr',''\n'\|sort-u\|awk'system("[-e/usr/local/lib/"$1"]")==0{next}{print"so:"$1}'\)"\&&apkadd--no-cache--virtual.php-rundeps$runDeps\&&docker-php-sourcedelete\&&apkdel.build-deps\&&rm-rf/usr/src/swoole-4.1.2.tgz2.3laravel-swoole扩展安装以下是swooletw/的主要功能laravel-swoole特性:在Swoole上运行Laravel/Lumen应用程序卓越的性能高达30x沙盒模式隔离应用程序容器支持在Laravel应用程序中运行WebSocket服务器支持Socket.io协议支持Swoole表跨进程共享使用Composer安装:$composerrequireswooletw/laravel-swoole2.4laravel/lumen配置这个包支持自动包发现。如果你运行的是Laravel5.5+,你可以跳过这一步。Laravel配置:在config/app.php服务提供者数组中添加服务提供者['providers'=>[SwooleTW\Http\LaravelServiceProvider::class,],]lumen配置:请在bootstrap/app.php中添加如下代码$app->register(SwooleTW\Http\LumenServiceProvider::class);3.基准测试数据3.1建立并运行现在,您可以执行以下命令来启动SwooleHTTP服务。phpartisanswoole:httpstart然后可以看到如下信息:Startingswoolehttpserver...Swoolehttpserverstarted:http://127.0.0.1:1215现在可以访问http://127.0.0.1:1215进入应用程序。如果需要修改端口号或者服务地址,可以配置相应的环境变量//vendor/swooletw/laravel-swoole/config/swoole_http.phpSWOOLE_HTTP_HOST:'127.0.0.1'SWOOLE_HTTP_PORT:'1215'详细文档参考:https://wiki.swoole.com/wiki/page/14.html3.2测试结果基于FPM+Nginxwrk-t4-c100http://your.domain.com/version运行10s测试@http://your.domain.com/version4个线程和100个连接线程统计平均标准偏差最大+/-标准偏差延迟341.64ms108.70ms801.47ms69.08%Req/Sec71.7227.35171.0065.57%10.03秒内2864个请求,2.84MBreadRequests328.6:2864请求/秒/sec:289.79KBwrk-t12-c400-d30shttp://your.domain.com/versionRunning30stest@http://your.domain.com/version12个线程和400个连接ThreadStatsAvgStdevMax+/-Stdev延迟801.35ms349.89ms2.00s68.56%Req/Sec40.6119.83126.0065.80%30.10s内14390个请求,14.24MB读取套接字错误:连接0,读0,写0,超时132Requests/sec:478.09Transfer/sec:484.34KB3.3SwooleHTTP服务测试结果wrk-t4-c100http://your.domain.com/versionRunning10stest@http://your.domain.com/version4线程和100connectionsThreadStatsAvgStdevMax+/-StdevLatency198.64ms324.54ms1.96s88.59%Req/Sec225.6291.30430.0062.72%10.09读取中的9021个请求,7.90MB读取连接0超时套接字错误,w:25Requests3.7:传输/秒:801.26KBwrk-t12-c400-d30shttp://your.domain.com/versionRunning30stest@http://your.domain.com/version12个线程和400个连接ThreadStatsAvgStdevMax+/-Stdev延迟319.84ms398.59ms2.00s85.59%Req/Sec66.9435.58240.0066.09%23862requestsin30.09s,20.89MBreadSocketerrors:connect0,read0,write0,timeout619Requests/sec:793.05Transfer:793.04KB4。问题&注意事项PHP7只能使用swoole4.0+version4.1静态文件使用swoole是否影响性能?影响?使用Nginx代理运行在Swoole上的Laravelserver{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"";如果($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“开启”;http代理://127.0.0.1:1215$后缀;}}5。参考使用Swoole为你的Laravel应用加速swoole入门指南laravel-swoole
