web-dev-qa-db-ja.com

Laravelキューが機能しない

私はlaravelキューをfacebookの投稿にコメントするために使用しています。facebookwebhookからデータを受信するたびに、受信した詳細に基づいて投稿にコメントします。 webhook私はlaravelキューを使用しているので、1つずつ実行できます。 https://scotch.io/tutorials/ why-laravel-queues-are-awesome

public function webhooks(Request $request)
{
    $data = file_get_contents('php://input');
        Log::info("Request Cycle with Queues Begins");
        $job = (new webhookQueue($data)->delay(10);
        $this->dispatch($job);
        Log::info("Request Cycle with Queues Ends");
}

これは私の仕事のクラス構造です

class webhookQueue extends Job implements ShouldQueue

{

interactsWithQueue、SerializesModelsを使用します。

private $data;

public function __construct($data)
{
    $this->data = $data;
}

public function handle()
{
   //handling the data here 
}

}

私はwebhooks()関数を連続して打っています、すべてのジョブは同時に動作していますがキューにはありません、ジョブのいずれもジョブテーブルに保存されていません、遅延を与えていますが、動作していません、誰か助けてください、私はされています昨日から試してみましたが、結果はありません。

そして、これはlaravel.logの私のログです

[2017-02-08 14:18:42] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:44] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:55] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:18:55] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:18:55] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:18:59] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:00] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:00] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:00] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends
15

キューを使用するには、いくつかの作業が必要です:

.envファイルで、queue_driverを同期からデータベースに変更する必要があります。そのため、.envを開いて以下を実行します。

queue_driver=database

その後、artisanコマンドを使用してデータベースにキューテーブルを作成する必要があります。

php artisan queue:table
php artisan migrate

最後に、php artisan queue:listenまたはphp artisan queue:workを使用してキューを実行する必要があります

18

laravel 5.7を使用している場合、これを.envファイルで使用すると、同じ問題が発生しました

QUEUE_CONNECTION=database

後、このような設定キャッシュをクリアします

php artisan config:cache
7
Haydar ŞAHİN

Laravel 5.7の更新:

.env、設定QUEUE_CONNECTION=databaseこれにより、ディスパッチされたジョブがデータベースドライバーに送られます。

次に:

 # Creates a migration for the database table holding the jobs
php artisan queue:table

 # Executes the migration
php artisan migrate

 # Kicks off the process that executes jobs when they are dispatched
php artisan queue:work
5
Jon McClung

受け入れられた答えは私にとっては問題でしたが、私が解決した他の2つの同様の問題についてもこの質問に答えました。

その他の問題1:ジョブ作成(コンストラクター)は機能しますが、ジョブハンドラーは起動しません-ever

  • ここでeverが重要です。これは、通常、それらのどれも起動しない場合、ジョブコードが変更されてキューを再起動する必要があるためです。

その他の問題2:ジョブ作成(コンストラクター)は機能しますが、ジョブハンドラーは起動しません-時々

  • 場合によってが真である場合、起動していないジョブは、DB::beginTransactionなどのトランザクション中に発生しているためである可能性があります。

Iwantトランザクション中にジョブを起動したい場合、これを行うことができます:

/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($errorInfo)
{
    $this->errorInfo = $errorInfo;

    // Queues won't run the handlers during transactions
    // so, detect the level, and if it is not 0, rollback to force job handling
    if (\DB::transactionLevel() != 0) {
        \DB::rollBack();
    }
}

ただし、これをしないでくださいジョブを解雇して強制的にロールバックするwantを望まない限り私の状況は、致命的なエラーでジョブが電子メールを送信するという点で独特です。とにかくプロセスを中断するエラーがあるため、それを起動したいです(ロールバックが発生し、エラーがキャッチされないために計画されていません)。

これをしたくない状況は次のとおりです。

  • 支払いが成功すると、ジョブはユーザーにメールを送信します
  • お支払いは成功する可能性がありますが、できませんでした
  • 支払いの成功に応じて、ロールバックまたはコミットします

ロールバックまたはコミット後に発生するようにディスパッチを構成する必要があります。私は予測できないときに起こるので、私の仕事にそんな贅沢はありませんでした(致命的なエラー)。ただし、支払いが成功したことを確認したり、コミットした後に発送したり、すべてのレベルのトランザクションを終了したりするなど、それを制御できる場合は!

トランザクション中にジョブをトリガーする動作、およびthenロールバックまたはコミットの動作がわかりません。遅延を追加することで適切に動作しなかった場合は回避できますが、大幅な遅延でない限り、それは信頼できないようです(待機時間を推測します)。

2
amurrell

その質問の将来の読者のために、キューが以前は機能していたがもう機能しなかった場合は、データベース内のジョブテーブルからすべてを削除してみてください。

1
ADEL NAMANI

既にキューテーブルがあることがわかります。

php artisan queue:listen --tries=3またはphp artisan queue:workなどを実行してみてください。

キュー作業は、コマンドごとに1つのジョブのみを実行するためのものです。したがって、テーブルに20個のジョブがある場合、キュー作業を20回実行する必要があります。だからqueue:listenコマンドを実行できます。しかし、それは多くのCPUを消費します。

サーバーでは、バックグラウンドで最大3回の試行でキューリスンを実行できます。ターミナル/コマンドプロンプトでサーバーにSSHで接続します。次に、CDを、職人のファイルがあるプロジェクトディレクトリに移動します。次のコマンドを実行します:

Nohup php artisan queue:listen --tries=3 > /dev/null 2>&1 &

この場合、ジョブはバックグラウンドで自動的に処理されます。あなただけの仕事を派遣する必要があります。また、failed-jobsテーブルの使用をお勧めします。バックグラウンドキューリスナを使用している場合。

お役に立てれば。

1
TipuZaynSultan