windows上使用roadrunner-laravel

xuanziDy發表於2021-12-13

一、準備工作

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環境,phpstudy搭建的整合環境,web伺服器為nginx, php ^7.3

  1. 新弄一個專案測試,安裝laravel 框架

    利用已有的nginx伺服器,配置了虛擬域名 test.dy.com,並保證專案可使用

  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

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

【如圖】

三、測試

  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 協議》,轉載必須註明作者和本文連結
學過的東西能說出來那是最妙的,能覆盤寫下來那也不錯

相關文章