Skip to content

Instantly share code, notes, and snippets.

@y2468101216
Last active April 21, 2021 10:42
Show Gist options
  • Save y2468101216/737d4fcdd0bafc3d7ccd2ca67a1ee80b to your computer and use it in GitHub Desktop.
Save y2468101216/737d4fcdd0bafc3d7ccd2ca67a1ee80b to your computer and use it in GitHub Desktop.
laravel-octane 試用心得

laravel/octane 試用心得

前言

laravel 無疑是 php 世界裡最主流的框架,但有使用 laravel 的人都知道,每一條 request 進來要 import 許多的 class 一直是 laravel 的痛,這也導致他在高併發底下表現不甚理想。

而 laravel 作者為了解決這個問題,開發使用 swooleroadrunner 做基底的套件,解決每個 request 都要重新 import 的問題。

不過這套件目前還在 BETA ,所以如果要用在生產環境請自負風險。

swoole or roadrunner?

沒差,硬要說的話 swoole 是用 c++ 寫的擴展,roadrunner 是用 golang 寫的擴展,不過本質上做的事情不會差太多。 如果你兩者都沒有安裝的話套件會預設裝 roadrunner ,而 roadrunner 安裝起來也更簡單,推薦大家使用 roadrunner

requirement

PHP 8.0 以上,docker 佳,我自己是用 WSL2 with ubuntu 20.04 採了不少坑

install

詳細可參考 github 頁面,簡單步驟如下

  1. composer require laravel/octane
  2. php artisan octane:install
  3. php artisan octane:start

就這樣,中間如果有要安裝就選擇 yes

test - octane with roadrunner

ab -k -c 10 -n 20000 http://127.0.0.1:8000/

  • Requests per second: 788.03 [#/sec] (mean)
  • Time per request: 12.690 [ms] (mean)
  • Time per request: 1.269 [ms] (mean, across all concurrent requests)

test - php-fpm

ab -k -c 10 -n 20000 http://127.0.0.1:8000/

  • Requests per second: 310.84 [#/sec] (mean)
  • Time per request: 32.171 [ms] (mean)
  • Time per request: 3.217 [ms] (mean, across all concurrent requests)

測試結論

可以看的出來,速度至少提升了2倍左右。

使用須知

其實套件底下都有講了,需要特別注意就幾點:

  1. 盡量避免在 boot 的時候注入 XXX

這是因為 octane 只會注入一次,比較簡單的例子如下

use App\Service;

/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    $this->app->singleton(Service::class, function ($app) {
    $time = time();
        return new Service($app, $time);
    });
}

那個 $time 在每次 request 進來時都會是固定你啟動 octane 時當下的 timestamp,而不是每個 request 進來當下的時間值 request 跟其他都同理。

  1. memory leak
use App\Service;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return void
 */
public function index(Request $request)
{
    Service::$data[] = Str::random(10);

    // ...
}

static 參數使用時要特別小心,因為不會在 request 結束時把這些變數釋放掉了。 建議用完的 static 變數都用 unset 觸發 gc 比較好

結論

我自己使用 swoft 一年多了,看到 laravel 也跟上了感到十分興奮,而且使用起來相較簡單很多。 希望這可以刺激其他框架跟上 laravel 腳步,讓開發者在面對中高併發流量的時候可以用自己習慣的框架去處理。

也可以讓開發者知道有除了 php-fpm 以外的選擇

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment