2017-07-04 1 views
0

私は、WebアプリケーションにはLaravel 5.4、メッセージキュー層にはRabbitMQ、Laravelキューワーカーは使用しています。私は2つの関連する問題があります。Laravel - スキーマ - MySql - Tempテーブル "既に存在しています"

一時表

をI私のコンストラクタで、次のテーブルを作成するコードがあります。

Schema::create('tmp_products', function (Blueprint $table) { 
      $table->temporary(); 
      $table->integer('id'); 
      $table->string('alias',  255); 
      $table->string('include', 255)->nullable(); 
      $table->string('exclude', 255)->nullable(); 
     }); 

注意を

$table->temporary(); 

すると、複数の利用このプロセスのインスタンスが同時に実行されると、次のエラーが表示されます。

PDOException: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'tmp_products' already exists in /var/www/myproject/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:91

最初はテーブルが一時的ではないかもしれないと思っていましたが、MySQL Workbenchではテーブルが表示されないので、そうは思われません。

複数のプロセスが接続状態を共有しているように見えることがあります(一時表はセッション固有のものです)。 コードはLaravel php artisan queue:workerコマンドで実行され、supervisord(numprocs=3)によって管理されています。また、htopには一意のPIDを持つ3つのプロセスがあるため、どのように接続状態を共有できるのか分かりません。

キュー - 何より興味深いのは、私が旗--tries=0とキューワーカーを実行することである

ジョブズ失敗しました(すなわちないリトライ処理メッセージを行う)上記の例外がjob->handle()メソッド内でスローされた後ので、メッセージはただちにLaravel failed_jobsテーブルに転送されるはずですが、例外が無限ループし、メッセージがキューから離れることはありません。

だから私は、私の質問があると思います。期待通りI明示的throw new Exception();場合、彼らはが失敗しないのに対し、なぜ、障害が発生し、この特定のシナリオの停止メッセージをどのようにすることができますqueue:workerプロセスを共有DB接続状態

    1. 私のハンドル()関数内

    何か助けていただければ幸いです。

    おかげで、

    EDIT:失敗したジョブはfailed_jobsテーブルに入っていなかった理由私は考え出しました。 --tries=0をゼロに設定すると、ジョブは永久に試行されます。 1に設定すると固定されました。

    UPDATE:生PDOを使用しているとき同じエラーが発生します。

    $pdo = DB::connection()->getPdo(); 
    $pdo->exec("CREATE TABLE tmp_products (id INT NOT NULL, alias VARCHAR(255) NOT NULL, include VARCHAR(255) NULL, exclude VARCHAR(255) NULL, PRIMARY KEY (id));"); 
    
  • +0

    は(xdebugのかphpdbgで)デバッグしようとすると、実際に使用して、どのような接続/ドライバに行くものを参照してください。いくつかの設定ミスのようです。 – pinepain

    答えて

    0

    OK、私はそれを考え出しました。私はLaravel労働者がどのように働いているのか全く誤解しました。私の頭の後ろには、バックグラウンドで各仕事のために労働者を産んで、仕事が終わったときに各労働者を破壊するようなapacheのように働くことが前提でした。これはそうではありません。各作業者は待ち行列を待ち受け、待機し、ジョブを連続して処理します。すべてのジョブでDBセッションを再作成しません。

    これは、同じエラーが処理する2番目のジョブで、1人のワーカーに影響する可能性があることを意味します。

    だから、私の前の仕事からの一時テーブルは、まだ次の仕事に存在していました。今、私はちょうど、テーブルが存在しない場合、再確認しないでください。

    おかげ

    関連する問題