【发布时间】:2017-07-04 04:47:22
【问题描述】:
我将 Laravel 5.4 用于 Web 应用程序,将 RabbitMQ 用于消息队列层,并使用 Laravel 队列工作者。我有两个相关的问题:
临时表
我的构造函数中有以下表格创建代码:
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]:基表或视图已存在:1050 表 'tmp_products' 已存在于 /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 的进程,所以我不明白它们如何共享连接状态.
队列 - 失败的作业
更有趣的是,我使用--tries=0 标志运行队列工作程序(即不重试 处理消息),因此在job->handle() 方法中引发上述异常后,消息应该立即转移到 Laravel failed_jobs 表,但我看到的是一个无限循环的异常,并且消息永远不会离开队列。
所以我想我的问题是:
-
queue:worker进程如何共享数据库连接状态 - 为什么这种特殊情况会阻止消息失败,而如果我在我的 handle() 函数中显式
throw new Exception();,它们确实会按预期失败
感谢任何帮助。
谢谢,
编辑:我知道为什么失败的作业没有进入failed_jobs 表。将--tries=0 设置为零似乎会使工作永远尝试。将其设置为 1 即可解决此问题。
更新:使用原始 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),看看实际发生了什么,使用什么连接/驱动程序。看起来有些配置错误。
标签: mysql laravel rabbitmq message-queue temp-tables