質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.38%

Laravel5.1でqueue処理が実行されない。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,512

score 13

Laravel5.1でqueue処理が実行されない。

(Laravel初心者です。)LaravelのQueue(非同期処理)について質問させてください。

現在Lavel5.1.4を使っており、プッシュメッセージ送信を非同期処理にさせようとしています。
現在プログラムは動いており、.envでのQUEUE_DRIVER=sync状態で動作することは確認しております。

.envをQUEUE_DRIVER=databaseにした際、データベースのテーブルjobsにQUEUEが格納されることまでは確認しています。
ですが、 php artisan queue:work を実行してもQUEUE処理を開始しません。
(上記実行するとコマンドラインに戻ります。⇒これは正常?)

発生している問題・エラーメッセージ

下記に記しましたが、
過去のQUEUEを削除するため
php artisan queue:flushを実行した際にConnection Time outエラーが出ています。

該当のソースコード

プッシュ通信非同期化に先立ち、処理確認用にapp\Jobsに作ったサンプルファイル。

<?php

namespace App\Jobs;

use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
use Log;


class SampleJob extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $queued_at = date('Y-m-d H:i:s');
        sleep(5);
        $dispatched_at = date('Y-m-d H:i:s');
        Log::info("処理開始 - {$queued_at} ... 処理終了 - {$dispatched_at}");
    }
}

.envの内容。syncをdatabaseに書き換え。(syncの時は、正しく動作。databaseに書き換えると、正しくDBのjobsテーブルにqueueが記録された。)

CACHE_DRIVER=file
SESSION_DRIVER=file
#QUEUE_DRIVER=sync
QUEUE_DRIVER=database

config\queue.phpの内容

   */

    /*'default' => env('QUEUE_DRIVER', 'sync'),*/
   'default' => env('QUEUE_DRIVER', 'database'),

    'connections' => [

        'sync' => [
            'driver' => 'sync',
        ],

        'database' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'default',
            'expire' => 60,
        ],

        'beanstalkd' => [
            'driver' => 'beanstalkd',
            'host'   => 'localhost',
            'queue'  => 'default',
            'ttr'    => 60,
        ],

        'sqs' => [
            'driver' => 'sqs',
            'key'    => 'your-public-key',
            'secret' => 'your-secret-key',
            'queue'  => 'your-queue-url',
            'region' => 'us-east-1',
        ],

        'iron' => [
            'driver'  => 'iron',
            'host'    => 'mq-aws-us-east-1.iron.io',
            'token'   => 'your-token',
            'project' => 'your-project-id',
            'queue'   => 'your-queue-name',
            'encrypt' => true,
        ],

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue'  => 'default',
            'expire' => 60,
        ],

    ],

    /*
    |--------------------------------------------------------------------------
    | Failed Queue Jobs
    |--------------------------------------------------------------------------
    |
    | These options configure the behavior of failed queue job logging so you
    | can control which database and table are used to store the jobs that
    | have failed. You may change them to any database / table you wish.
    |
    */


    'failed' => [
        'database' => 'mysql', 'table' => 'failed_jobs',
    ],

];

試したこと

php artisan queue:work を実行 ⇒反応なし。
php artisan queue:restartを実行  

  Broadcasting queue restart signal.


が表示される。

php artisan queue:restartを実行

 [PDOException]
  SQLSTATE[HY000] [2002] Connection timed out

php artisan config:casheを実行すると、システムが停止してしまいました。
Laravelが停止したような状態です。(php artisanが一切起動しない。)
しかし、bootstrap\cashe、framework\cache配下を削除して復旧しました。

補足情報

・データベースはPostgresを使っています。
・上記エラーを見ると、DBとの接続エラーに見えるのですが、そうだとしたらなぜQUEUEはDBテーブルにちゃんと書きこめているのかがわかりません。
⇒DB関連の設定のような気はします。
⇒QUEUEを稼働させるためのDB設定が正しくされていない??なのでQUEUEを見つけられない?だからflushが相手を探せずにタイムアウトする?
だとしたら、このqueueのDB設定はどこなのでしょうか?(queue.phpの何かがおかしいと言うことでしょうか?)

まだまだ初心者で、人の書いたプログラムを修正しているレベルです。
未熟な点が多く、大変申し訳ないのですが、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

今回複合的要因であったと思います。
1)php artisan queue:flush がタイムアウトする件。
こちらは、queue.phpのfailedの処理でmysqlが設定されていたのが原因。
修正して、直りました。

2)根本的なqueueを読みださない問題
jobsテーブルにはqueueを書き込むが、実行しないという問題です。
jobsテーブルに書き込むわけなので、DBの設定としてはOK。
このテーブルには過去の残骸がかなりあったので、一度全部削除し、
さらにIDを初期化しました。
select setval ('jobs_id_seq', 1, false);
(jobsテーブルなので、このようになります。)

ただ、これでも
php artisan queue:work --daemon
ではqueue読取実行はされませんでした。
しかし、
php artisan queue:work --daemon --queue=<キューの名前>
であれば、問題なく動くことを確認できました。
複数のキューがある場合は、すべてをカンマでつないで設定する必要がありますが、
当座はこれで問題ないと思います。

この後、これをSupervisorなどで設定し、運用にのせたいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/19 20:06

    おめでとうございます! tada

    キャンセル

  • 2019/07/19 20:13

    最後は自力ですが、途中かなりヒントいただき、感謝しております。
    ありがとうございました!

    キャンセル

+1

php artisan queue:work 実行時に、キューに何もなければ、コマンドラインに戻る
で正常だった気がしますが
キューになにか入っている時は1件処理してコマンドラインに戻るが正常です

php artisan queue:work --daemon
daemonにして、随時実行するようにすればコマンドラインに戻ってくる事はなくなるのですが・・・。

ただ、雰囲気的にそれとは別に

SQLSTATE[HY000] [2002] Connection timed out

php artisan config:casheを実行すると、システムが停止してしまい

こちらが別途、影響しているような気がするので、いったんキューはおいといて
そちらが正常に動く事を目指したほうがよい気がします。

例えば、herokuやaws eb を使用時に、CLIに環境変数が足りなく(そもそもそんな事まれだと思うのですが)
CLI時のみ、DB設定が飛んでしまっている、などが考えられます
(php artisan tinker して、 config('database') と打てばCLI時の設定がみれる)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/19 17:50

    うーん・・・すみません、こ以上はわからないですね
    お力になれず申し訳ないです

    キャンセル

  • 2019/07/19 17:53

    mikkame様、いえいえ、前進しています。
    いろいろ相談に乗ってくださりありがとうございます!

    キャンセル

  • 2019/07/19 19:39

    まだ完全解決ではないですが、一歩前進しました。
    https://stackoverflow.com/questions/41632559/php-artisan-queuework-not-working-but-job-are-inserted
    に似たケースがあり、そこで書かれていたjobsテーブルの初期化を実行しました。
    具体的には、データをすべて削除し、idを1に初期化したと言うことです。

    この状態で、jobsにqueueを設定、
    php artisan queue:work --daemon --queue=push_test
    (push_testはキューの名前)を強制的に設定すると実行されました。
    (キュー名を設定しないと実行されませんでした。これも上記の記事内に記述されています。)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る