php artisan队列:工作不使用mongodb和laravel 5.2

时间:2016-09-22 08:08:04

标签: php mongodb laravel-5.2 laravel-queue

我已经安装了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()

我已检查过数据库连接,这是我在命令行中的完整日志 - enter image description here

我花了很多时间来解决它,但仍然没有工作。非常感谢,非常感谢,非常感谢。

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

public function commit()
{
    return null;
}

并且

public function beginTransaction()
{
    return null;
}

2 个答案:

答案 0 :(得分:0)

如果您只使用Redis作为Laravel的缓存,那就更好了。它更适合队列并具有本机支持。我使用Redis作为工作队列,Mongo作为db

答案 1 :(得分:0)

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

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

我们将REDIS用作队列的主要问题是,除非您可以可靠地刷新到磁盘,因为所有作业都存储在内存中,否则您可能会在REDIS发生故障时丢失作业。如果你经常将REDIS写入磁盘(它有自己的一组关注点),你可能最好使用像MongoDB这样的持久存储。