0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelをphp-fpmからOctaneに移行したらAPCuキャッシュが機能しなくなった

Posted at

概要

LaravelアプリをNginxとphp-fpmで繋げた設定をDocker化して開発していた環境をOctane(OpenSwoole)に移行したときに起きた問題をご紹介します。

移行内容などは、以下の各記事などから前提知識を得てからご覧ください。

問題

LaravelをFROM php:8.2.0-fpm指定したイメージでコンテナを作り、Nginxのコンテナからngx_http_fastcgi_moduleの設定で疎通できるようにDocker環境を作っていました。

そこでOctaneに移行してNginxとはリバースプロキシでの疎通に変わったことにより、APCuを指定したLaravel Cacheで保存も取得もできない問題が起きました。

APCuの設定は、PHPコンテナを作るDockerfileにRUN pecl install apcu && docker-php-ext-enable apcuを記述してLaravel Cacheでapcを指定すれば使用できます。

以下のサンプルでも確認できます。

app/Service/RandomNumberService.php
<?php
namespace App\Service;

class RandomNumberService
{
    protected $number;

    public function __construct()
    {
        $this->number = mt_rand(1, 10000);
    }

    public function getNumber() :int
    {
        return $this->number;
    }    
}

app/Http/Controllers/SampleController.php
<?php

namespace App\Http\Controllers;

use App\Service\RandomNumberService;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Cache;

class SampleController extends Controller
{
    public function __construct(
        private RandomNumberService $service
    ){}

    public function index(): Response
    {
        Cache::store('apc')->forever("getNumber", $this->service->getNumber());
        $num = Cache::store('apc')->get("getNumber", "-1");
        return response('Number:' . $num, Response::HTTP_OK);
    }
}

🔽php-fpm環境
スクリーンショット 2024-10-06 19.21.23.png

🔽Octane環境
スクリーンショット 2024-10-06 19.28.13.png

対策

この設定はほとんどの場合、テストかデバッグに使います。 これを設定すると、CLI版PHPでAPCが有効になります。 通常の状態では、CLI リクエストのたびにAPCキャッシュを生成し、 収集し、破棄するのは望ましくありません。しかし、テストシナリオによっては、 CLI版のPHPでAPCを簡単に有効に出来た方が便利な場合があります。

apc.enable_cli=1をiniファイルにセットするようにDockerfileを調整したところOctane環境でもCache::store('apc')でキャッシュ機能が正常化しました。

では、なぜCLI有効で正常化したのか調査したところ、Octane環境のSwooleやRoadRunnerなどはプロセス化されたワーカー内部からPHPをCLIで動いているようで、Debugbar for Laravelでログを確認するとphp-fpm環境では"interface":"fpm-fcgi"となり、Octane環境は"interface":"cli"と出力されてました。

また採用したOpenSwooleのDockerに関する設定の公式ドキュメントでFROM php:8.2.0-cliを指定されていることからAPCuを利用するにはCLI有効にする必要(RoadRunnerも同じく)がありました。

まとめ

APCuを何となくで使っていたらハマってしまった罠でした笑汗

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?