2017-07-04 83 views
0

我使用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表,但我看到的是異常的無限循環和消息從未離開隊列。

所以我想我的問題是:

  1. 如何queue:worker過程分散數據連接狀態無法按照預期
  2. 爲什麼這種特殊情況停止消息的失敗,而他們如果我明確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));"); 
+0

嘗試調試(與Xdebug的或phpdbg),看看什麼是真正的推移,使用什麼樣的連接/驅動器。它看起來像一些錯誤配置。 – pinepain

回答

0

確定我想通了。我完全誤解了Laravel工人的運作方式。在我的腦海中,我假設他們像apache一樣工作 - 在後臺爲每項工作產生一名工人 - 並在完成後摧毀每個工人。不是這種情況。每個工作人員都會監聽隊列,等待並連續處理作業。它不會在每個作業上重新創建數據庫會話。

順便說一句,這意味着相同的錯誤可能會影響單個工人,在它處理的第二個工作上。

所以我以前的工作臨時表仍然存在下一份工作。現在我只是檢查,如果表存在不要重新創建。

感謝