我使用Laravel 5.4的web應用程序,爲的RabbitMQ消息隊列層和Laravel隊列工作。我有兩個相關的問題:Laravel - 架構 - MySQL的 - 臨時表「已存在」
臨時表
我在構造函數如下表創建代碼:
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中看到表,所以不太可能。
也許多個進程可能在共享的連接狀態(如臨時表是會話特定的)。 該代碼作爲由supervisord(與numprocs=3
)管理的Laravel php artisan queue:worker
命令運行,並且我可以在htop中看到有三個具有唯一PID的進程,所以我不明白它們如何共享連接狀態。
隊列 - 失敗的作業
更有趣的是,我跑旗--tries=0
的隊列工作(即不重試處理消息),打完上面的例外是job->handle()
方法中拋出的該消息應立即轉移到Laravel failed_jobs
表,但我看到的是異常的無限循環和消息從未離開隊列。
所以我想我的問題是:
- 如何
queue:worker
過程分散數據連接狀態無法按照預期 - 爲什麼這種特殊情況停止消息的失敗,而他們做如果我明確
throw new Exception();
在我的手柄()函數
任何幫助表示讚賞。
感謝,
編輯:我想通了,爲什麼失敗的作業未被進入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