使用Timer定时任务更新数据库,奇怪的点,这个失败并不是报错。
示例代码:
start中全局初始化了数据库
$worker->onWorerStart = fn(){
global $db;
$db = new Medoo(数据库配置)
}
收到消息时执行http任务并更新数据库
$worker->onMessage = fn(){
global $db;
Timer::add(30, fn() use($db){
// 远程获取http返回内容
$http = '预先规定的返回内容';
// 假设 http 返回id,content字段
if($http = '正确'){
// 根据id 更新本地数据库对应content字段, 及 status = 1
// 本地数据库 有个 status = 0 默认, 需要再更新为 status = 1
$db->update('table', [
// medoo field
'content' => $http['content'],
'status' => 1
],[
// medoo where
'id' => $http['id']
]); // medoo 更新操作
// 打印日志 提示 成功
echo 'http 正确,数据库更新 - 成功'
} else {
// 打印日志 提示 失败
echo 'http 错误,数据库不更新 - 失败'
}
})
}
出现问题地方在于:
onMessage回调中 $db->update
这里,
比如:日志提示成功了,数据库 content
字段确实被更新了,但 status = 0 默认
字段依然是默认的,期间运行中也没有任何报错
又或者: 日志也提示成功了, 但数据库中什么也没更新 content
和status = 0 默认
都没用被更新, 同样也没有报错
但是,还是会有按预期把数据完整更新的,也就是 content
和 status = 1
都更新了
这个问题无从定位是哪里的原因,使用了try catch也没有异常发生,想请问是Medoo的原因还是本身业务代码上有什么问题吗?请大佬帮助分析下
OS:Ubuntu 及 Centos
启动方式:宝塔 - 进程守护
php worker.php start
试着更新的时候把当前时间作为字段也更新一下
'content' => $http['content'],
'status' => 1
有没有可能这两个字段数据库里和提交的是一致的?medoo updata如果信息一致会返回更新失败
不会的,这2个字段的值从http过来的数据一定不会一致,status = 0创建时就默认的,content也不会一样。问题就是medoo并没有报错,查看了log也是正确语句。现在测试的,加上了 updateTime 也作为更新字段后一切正常