windows上使用roadrunner-laravel
一、准备工作
1.安装composer, 并设置镜像
Packagist / Composer 中国全量镜像 (pkg.xyz)
2.搜索 spiral/roadrunner
时发现了laravel的版本
3.决定尝试 spiral/roadrunner-laravel
, 翻阅了已发布版本的依赖要求,
php ^7.3 || ^8.0 支持的最新版: v3.7.0
php ^7.4 || ^8.0 支持的最新版: v5.5.0
需要开启php_socket.dll
扩展,如果 php -m 查看扩展不存在,就手动加入
前提是:这个dll文件在php的可执行目录下/ext
下真实存在
二、开始实践
说明:运行在windows环境,phpstudy搭建的集成环境,web服务器为nginx, php ^7.3
新弄一个项目测试,安装laravel 框架
利用已有的nginx服务器,配置了虚拟域名 test.dy.com,并保证项目可使用。 然后关掉nginx服务。 (这一步可以不做呢。。。)
引入 spiral/roadrunner-laravel 包
composer require spiral/roadrunner-laravel "^3.7.0"
发布配置文件,执行
php artisan vendor:publish
, 选择Spiral\RoadRunnerLaravel\ServiceProvider
对应的编号并输入,会有2个文件的改动,如下复制
.rr.yaml.dist
重命名为.rr.yaml
下载 Roadrunner的可执行文件
.\vendor\bin\rr get-binary
或者手动下载
github.com/spiral/roadrunner-binar...
RoadRunner是Go语言实现,最终编译成二进制文件才可用。官方提供了各个版本已编译好的可执行文件。
这个.\vendor\bin\rr 用编辑器打开 发现是php程序。使用RoadRunner作为web服务器,首先要运行起来,就跟启动apache/nginx服务器一个道理。
5.1 如果下载不成功,提示如下
“无法提取这个文件”,无法下载?无法解压?
根据图中的版本提示,在 vendor/spiral/roadrunner/bin/rr.php中找到了出处 ,
public static function getSignature(): string
{
return 'roadrunner-' . self::getVersion() . '-' . self::getOSType() . '-amd64';
}
public static function getBinaryDownloadUrl(): string
{
$ext = '.zip';
if (self::getOSType() == 'linux') {
$ext = '.tar.gz';
}
return 'https://github.com/spiral/roadrunner/releases/download/v'
. static::getVersion() . '/' . self::getSignature()
. $ext;
}
5.2 于是根据图中提示的版本,在github找到源码的对应版本,然后在下方有已编译好的各版本可下载。点击下载,解压
roadrunner-1.9.1-windows-amd64.zip
解压后得到的
rr.exe
文件, 放到项目根目录
下.修改
.rr.yaml
配置文件,删除一些配置保留必要的.
http:
address: 0.0.0.0:80
workers:
# linux版本
#command: "php ./vendor/bin/rr-worker start --relay-dsn unix:///var/run/rr-relay.sock"
#relay: "unix:///var/run/rr-relay.sock"
# windows版本
command: "php vendor/spiral/roadrunner-laravel/bin/rr-worker start pipes"
# connection method (pipes, tcp://:9000, unix://socket.unix). default "pipes"
relay: "pipes"
user: ""
pool:
numWorkers: 4
maxJobs: 0
allocateTimeout: 60
destroyTimeout: 60
static:
dir: "public"
forbid: [ ".php", ".htaccess" ]
request:
"Example-Request-Header": "Value"
response:
"X-Powered-By": "RoadRunner"
- 项目根目录下,启动服务
rr.exe serve -v -d -c ./.rr.yaml
三、测试
首先用框架安装好后的默认路由测试,
Route::get('/', function () { return view('welcome'); });
修改视图中的内容,在不重启服务的前提下,数据发生更改。
welcome.blade.php 视图中增加一个表单
<body class="antialiased"> <h1>post login 12</h1> <form method="post" action="/login"> @csrf 用户名:<input type="text" name="username" value="lisi"/> 年龄:<input type="text" name="age" value="10"/> <button type="submit">提交</button> </form> </body>
修改路由文件 route/web.php, 浏览器上提交后报错
Route::post('/login', function (\Illuminate\Support\Facades\Request $request) { return $request->all(); });
于是修改了路由内容,使用
php artisan route:clear
清除了路由缓存,发现依旧报错Route::post('/login', function (\Illuminate\Support\Facades\Request $request) { return request()->input(); });
接着命令行 ctrl+c 断开了服务,重新执行 命令
rr.exe serve -v -d -c ./.rr.yaml
, 于是正常了,得到了新的数据多次试验后发现,是服务没有重新加载文件内容
如何保证修改后及时生效呢?
在.rr.yaml文件中追加如下内容,用于自动刷新,注意配置中的注释内容。
reload:
interval: 1s
patterns: [ ".php" ]
services:
http:
# 配置的路由文件重新加载,按需配置,不建议配置为""
dirs: [ "routes" ]
recursive: true
本作品采用《CC 协议》,转载必须注明作者和本文链接