LaravelはRabbitMQを使用


ガイド人
RabbitMQはきっとみんな知っていると思います.あまり紹介しません.ここではRedisの代わりにRabbitMQをLarvelキューの駆動として実現する.次に、Laradockでのインストール例を示します.
インストール
  • は、laradockのディレクトリに切り替える、.envINSTALL_AMQPおよびINSTALL_BCMATHに関する値をtrue
  • に変更する.
  • docker-compose stop workspace php-fpm php-worker
  • docker-compose build workspace php-fpm php-worker rabbitmq
  • docker-compose up -d workspace php-fpm php-worker rabbitmq

  • 拡張パッケージのインストールと構成
  • workspaceコンテナに入り、プロジェクトディレクトリに拡張パッケージcomposer require vladimir-yuldashev/laravel-queue-rabbitmq
  • を取り付ける.
  • 次にconfig/queue.phpファイルにconnections rabbitmqの構成を追加し、状況に応じて
  • を自分で修正する.
    'rabbitmq' => [
    
        'driver' => 'rabbitmq',
    
        /*
         * Set to "horizon" if you wish to use Laravel Horizon.
         */
        'worker' => env('RABBITMQ_WORKER', 'default'),
    
        'dsn' => env('RABBITMQ_DSN', null),
    
        /*
         * Could be one a class that implements \Interop\Amqp\AmqpConnectionFactory for example:
         *  - \EnqueueAmqpExt\AmqpConnectionFactory if you install enqueue/amqp-ext
         *  - \EnqueueAmqpLib\AmqpConnectionFactory if you install enqueue/amqp-lib
         *  - \EnqueueAmqpBunny\AmqpConnectionFactory if you install enqueue/amqp-bunny
         */
    
        'factory_class' => Enqueue\AmqpLib\AmqpConnectionFactory::class,
    
        'host' => env('RABBITMQ_HOST', '127.0.0.1'),
        'port' => env('RABBITMQ_PORT', 5672),
    
        'vhost' => env('RABBITMQ_VHOST', '/'),
        'login' => env('RABBITMQ_LOGIN', 'guest'),
        'password' => env('RABBITMQ_PASSWORD', 'guest'),
    
        'queue' => env('RABBITMQ_QUEUE', 'default'),
    
        'options' => [
    
            'exchange' => [
    
                'name' => env('RABBITMQ_EXCHANGE_NAME'),
    
                /*
                 * Determine if exchange should be created if it does not exist.
                 */
    
                'declare' => env('RABBITMQ_EXCHANGE_DECLARE', true),
    
                /*
                 * Read more about possible values at https://www.rabbitmq.com/tutorials/amqp-concepts.html
                 */
    
                'type' => env('RABBITMQ_EXCHANGE_TYPE', \Interop\Amqp\AmqpTopic::TYPE_DIRECT),
                'passive' => env('RABBITMQ_EXCHANGE_PASSIVE', false),
                'durable' => env('RABBITMQ_EXCHANGE_DURABLE', true),
                'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', false),
                'arguments' => env('RABBITMQ_EXCHANGE_ARGUMENTS'),
            ],
    
            'queue' => [
    
                /*
                 * Determine if queue should be created if it does not exist.
                 */
    
                'declare' => env('RABBITMQ_QUEUE_DECLARE', true),
    
                /*
                 * Determine if queue should be binded to the exchange created.
                 */
    
                'bind' => env('RABBITMQ_QUEUE_DECLARE_BIND', true),
    
                /*
                 * Read more about possible values at https://www.rabbitmq.com/tutorials/amqp-concepts.html
                 */
    
                'passive' => env('RABBITMQ_QUEUE_PASSIVE', false),
                'durable' => env('RABBITMQ_QUEUE_DURABLE', true),
                'exclusive' => env('RABBITMQ_QUEUE_EXCLUSIVE', false),
                'auto_delete' => env('RABBITMQ_QUEUE_AUTODELETE', false),
                'arguments' => env('RABBITMQ_QUEUE_ARGUMENTS'),
            ],
        ],
    
        /*
         * Determine the number of seconds to sleep if there's an error communicating with rabbitmq
         * If set to false, it'll throw an exception rather than doing the sleep for X seconds.
         */
    
        'sleep_on_error' => env('RABBITMQ_ERROR_SLEEP', 5),
    
        /*
         * Optional SSL params if an SSL connection is used
         * Using an SSL connection will also require to configure your RabbitMQ to enable SSL. More details can be founds here: https://www.rabbitmq.com/ssl.html
         */
    
        'ssl_params' => [
            'ssl_on' => env('RABBITMQ_SSL', false),
            'cafile' => env('RABBITMQ_SSL_CAFILE', null),
            'local_cert' => env('RABBITMQ_SSL_LOCALCERT', null),
            'local_key' => env('RABBITMQ_SSL_LOCALKEY', null),
            'verify_peer' => env('RABBITMQ_SSL_VERIFY_PEER', true),
            'passphrase' => env('RABBITMQ_SSL_PASSPHRASE', null),
        ],
    
    ],
  • .envQUEUE_CONNECTIONrabbitmqに変更し、以下の値
  • を追加する.
    RABBITMQ_WORKER=horizon
    RABBITMQ_HOST=rabbitmq
    RABBITMQ_PORT=5672
    RABBITMQ_LOGIN=guest
    RABBITMQ_PASSWORD=guest
    RABBITMQ_QUEUE=default

    2つの値が説明されていますが、Laradockであるため、RABBITMQ_HOSTrabbitmqに設定されています.拡張パッケージはLaravel Horizonをサポートし、以前にLaravel Horizonが使用されていた場合、RABBITMQ_WORKERの設定はhorizonになり、config/horizon.phpenvironments関連connectionを変更します.
  • 関連ポートを開き、容器
  • を再起動する.
    補足
    良いことが多くて、配置する時に少し問題が発生して、幸いにも最終的に解決しました.まず、php-worker構成supervisorを使用してphp artisan horizonを守り、ログはCall to undefined function PhpAmqpLib\Wire\bcadd()とエラーが発生しています.エラーメッセージからbcmathモジュールがインストールされていないことを確認し、php-fpmphp-worker容器にbcmathモジュールがインストールされていることを確認しました.このとき、laravel-horizonの単独の容器があるのを見て、Dockerfileを見てもsupervisorでプロセスを守っていました.では、laravel-horizon容器でプロセスを守ります.コンフィギュレーションの面では何も言うことはありませんが、サンプルファイルもあげて、修正すればいいです.このとき、bcmathのエラーは報告されていませんが、もう一つのエラーUse of undefined constant SOCKET_EWOULDBLOCK - assumed 'SOCKET_EWOULDBLOCK'があり、socketsモジュールについて見られます.いくつかの資料を調べて、解決方法はlaravel-horizon容器の中でdocker-php-ext-install socketsで、それから再起動すればいいです.後続:PRが提案されています.
    参考資料:laravel-queue-rabbitmq.