【问题标题】:php artisan queue:work not working with mongodb and laravel 5.2php artisan queue:工作不适用于 mongodb 和 laravel 5.2
【发布时间】:2017-01-30 17:00:45
【问题描述】:

我已经安装了 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;
}

【问题讨论】:

    标签: php mongodb laravel-5.2 laravel-queue


    【解决方案1】:

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

    【讨论】:

    • 是的,我现在正在使用Redis,感谢您的回复@Pian0_M4n
    【解决方案2】:

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

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

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

    【讨论】:

    • 没错。不要将 Redis 用于队列。
    猜你喜欢
    • 2016-09-07
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2014-11-27
    • 2019-08-01
    • 2016-02-07
    • 2015-11-11
    相关资源
    最近更新 更多