私は、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接続状態
- 私のハンドル()関数内
何か助けていただければ幸いです。
おかげで、
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));");
は(xdebugのかphpdbgで)デバッグしようとすると、実際に使用して、どのような接続/ドライバに行くものを参照してください。いくつかの設定ミスのようです。 – pinepain