2017-07-04 76 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一样工作 - 在后台为每项工作产生一名工人 - 并在完成后摧毁每个工人。不是这种情况。每个工作人员都会监听队列,等待并连续处理作业。它不会在每个作业上重新创建数据库会话。

顺便说一句,这意味着相同的错误可能会影响单个工人,在它处理的第二个工作上。

所以我以前的工作临时表仍然存在下一份工作。现在我只是检查,如果表存在不要重新创建。

感谢