windows上使用roadrunner-laravel

一、准备工作

1.安装composer, 并设置镜像

Packagist / Composer 中国全量镜像 (pkg.xyz)

2.搜索 spiral/roadrunner 时发现了laravel的版本

RoadRunner源码地址

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 查看扩展不存在,就手动加入

windows上使用roadrunner-laravel

前提是:这个dll文件在php的可执行目录下/ext下真实存在

二、开始实践

说明:运行在windows环境,phpstudy搭建的集成环境,web服务器为nginx, php ^7.3

  1. 新弄一个项目测试,安装laravel 框架

    利用已有的nginx服务器,配置了虚拟域名 test.dy.com,并保证项目可使用。 然后关掉nginx服务。 (这一步可以不做呢。。。)

  2. 引入 spiral/roadrunner-laravel 包

    composer require spiral/roadrunner-laravel "^3.7.0"

  3. 发布配置文件,执行 php artisan vendor:publish, 选择 Spiral\RoadRunnerLaravel\ServiceProvider对应的编号并输入,会有2个文件的改动,如下
    windows上使用roadrunner-laravel

  4. 复制 .rr.yaml.dist 重命名为 .rr.yaml

  5. 下载 Roadrunner的可执行文件

    .\vendor\bin\rr get-binary

或者手动下载
github.com/spiral/roadrunner-binar...

RoadRunner是Go语言实现,最终编译成二进制文件才可用。官方提供了各个版本已编译好的可执行文件

这个.\vendor\bin\rr 用编辑器打开 发现是php程序。使用RoadRunner作为web服务器,首先要运行起来,就跟启动apache/nginx服务器一个道理。

5.1 如果下载不成功,提示如下
下载roadrunner的可执行文件报错

“无法提取这个文件”,无法下载?无法解压?

根据图中的版本提示,在 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

  1. 解压后得到的rr.exe文件, 放到项目根目录下.

  2. 修改.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"
  1. 项目根目录下,启动服务

rr.exe serve -v -d -c ./.rr.yaml

windows上使用roadrunner-laravel

三、测试

  1. 首先用框架安装好后的默认路由测试,

    Route::get('/', function () {
        return view('welcome');
    });

服务器启动了

  1. 修改视图中的内容,在不重启服务的前提下,数据发生更改。

  2. 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>
  3. 修改路由文件 route/web.php, 浏览器上提交后报错

    Route::post('/login', function (\Illuminate\Support\Facades\Request $request) {
        return $request->all();
    });
  4. 于是修改了路由内容,使用 php artisan route:clear清除了路由缓存,发现依旧报错

    Route::post('/login', function (\Illuminate\Support\Facades\Request $request) {
        return request()->input();
    });
  5. 接着命令行 ctrl+c 断开了服务,重新执行 命令 rr.exe serve -v -d -c ./.rr.yaml, 于是正常了,得到了新的数据

  6. 多次试验后发现,是服务没有重新加载文件内容

  7. 如何保证修改后及时生效呢?
    在.rr.yaml文件中追加如下内容,用于自动刷新,注意配置中的注释内容。

reload:
  interval: 1s
  patterns: [ ".php" ]
  services:
    http:
      # 配置的路由文件重新加载,按需配置,不建议配置为""
      dirs: [ "routes" ]
      recursive: true

自动reload

本作品采用《CC 协议》,转载必须注明作者和本文链接
学过的东西能说出来那是最妙的,能复盘写下来那也不错
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!