一个诡异的 Model::save 方法不存在的问题

前提是这样的,队列的某个consumer中的关于一个模型的save,有时候提是方法不存在

伪代码如下:

function handle()
{
    $id = $this->id;
    $model = Model::query()->find($id);
    if (!$model) throw new Exception('not found');
    Queue::push(new OtherJob($model->serial_id));
    $model['attr_1'] = 'processed';
    try {
        $model->save();
    } catch (Throwable $e) {
        $this->log(vsprintf("save_fail message:[%s], serialize:[%s], type:[%s]", [
            $e->getMessage(),
            serialize($order),
            gettype($order),
        ]), 'error');
    }
}

偶发性的能看到日志里有如下内容:

save_fail message:[Call to a member function save() on array], o:[a:1:{s:13:”last_queue_at”;O:25:”Illuminate\Support\Carbon”:3:{s:4:”date”;s:26:”2020-04-08 16:12:58.738117”;s:13:”timezone_type”;i:3;s:8:”timezone”;s:3:”PRC”;}}], type:[array]

但是看数据库中的attr_1确实也变成了processed

有碰到过类似问题的吗?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

我们都是这样子调用 $model->attr_1 = 'processed'; $model->save();,还真没用过你的这种写法。

5年前 评论
cevin (楼主) 5年前
kiti 5年前
cevin (楼主) 5年前
kiti 5年前
cevin (楼主) 5年前

你这错误信息不够全,堆栈都没了,,,

5年前 评论
cevin (楼主) 5年前

mysql 有没有读写分离? 是不是读写分离的问题?

5年前 评论
cevin (楼主) 5年前
JerryBool (作者) 5年前

file

file
id=217 这个数据在我的库里没有 也就是说 你 find 出来的数据是空的 所以会有这个错误

建议你把数据的信息也放到日志里,你也说了这个错误是偶发的,这样方便你去查具体是哪条数据出的错

5年前 评论
cevin (楼主) 5年前
kiti (作者) 5年前
largezhou 5年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!