我使用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