首页 文章

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

提问于
浏览
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()

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

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

Edit - 正如建议"MongoDB do not have transactions, so when Laravel tries to begin one an exception is throwed"这里https://github.com/jenssegers/laravel-mongodb/pull/871,我在beginTransaction和commit()中注释了代码并返回null,现在错误已经消失但仍然无法正常工作 .

public function commit()
{
    return null;
}

public function beginTransaction()
{
    return null;
}

2 回答

  • 0

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

  • 0

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

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

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

相关问题