0

我已经安装了 laravel 5.2.0 和https://github.com/jenssegers/laravel-mongodb,并且想通过队列发送电子邮件。我已经成功创建了作业表,但是在运行php artisan queue:work命令时,它会引发以下错误 -

PHP 致命错误:在第 576 行的 /var/www/html/admin/setupl/vendor/laravel/framework/src/Illuminate/Database/Connection.php 中的 null 上调用成员函数 beginTransaction()

我检查了数据库连接,这是我在命令行中的完整日志 -在此处输入图像描述

我花了很多时间来解决它,但仍然没有工作。任何帮助将不胜感激,非常感谢。

编辑-正如建议的“MongoDB没有事务,所以当Laravel尝试开始一个异常时抛出异常”在这里https://github.com/jenssegers/laravel-mongodb/pull/871,我在beginTransaction和commit中评论了代码() 并返回 null,现在错误已经消失但命令仍然不起作用。

public function commit()
{
    return null;
}

public function beginTransaction()
{
    return null;
}
4

2 回答 2

0

我们在 Laravel 5.1 中遇到了同样的问题,尽管使用正确的_idMongo 标识符修补了 laravel-mongodb 队列实现,但我们发现查询构建器语法不允许在数据库级别实现适当的原子性。我们最终编写了自己的队列驱动程序来实现文档级锁定。这样我们可以保证如果有多个工人,每个作业只运行一次。

您可以在此处找到适用于 Laravel 5.1+ 的队列驱动程序版本:https ://github.com/chefsplate/laravel-mongodb-queue

我们对使用 REDIS 作为队列的主要担忧是,除非您可以可靠地刷新到磁盘,因为所有作业都存储在内存中,如果 REDIS 出现故障,您可能会丢失作业。如果您经常将 REDIS 写入磁盘(这有其自身的一系列问题),您最好使用像 MongoDB 这样的持久存储。

于 2017-02-13T21:57:46.423 回答
0

最好只Redis用作Laravel. 它更适合队列并具有本机支持。我使用 Redis 作为工作队列,使用 Mongo 作为数据库

于 2016-09-28T10:08:58.700 回答