使用Timer定時任務(wù)更新數(shù)據(jù)庫,奇怪的點(diǎn),這個失敗并不是報錯。
示例代碼:
start中全局初始化了數(shù)據(jù)庫
$worker->onWorerStart = fn(){
global $db;
$db = new Medoo(數(shù)據(jù)庫配置)
}
收到消息時執(zhí)行http任務(wù)并更新數(shù)據(jù)庫
$worker->onMessage = fn(){
global $db;
Timer::add(30, fn() use($db){
// 遠(yuǎn)程獲取http返回內(nèi)容
$http = '預(yù)先規(guī)定的返回內(nèi)容';
// 假設(shè) http 返回id,content字段
if($http = '正確'){
// 根據(jù)id 更新本地數(shù)據(jù)庫對應(yīng)content字段, 及 status = 1
// 本地數(shù)據(jù)庫 有個 status = 0 默認(rèn), 需要再更新為 status = 1
$db->update('table', [
// medoo field
'content' => $http['content'],
'status' => 1
],[
// medoo where
'id' => $http['id']
]); // medoo 更新操作
// 打印日志 提示 成功
echo 'http 正確,數(shù)據(jù)庫更新 - 成功'
} else {
// 打印日志 提示 失敗
echo 'http 錯誤,數(shù)據(jù)庫不更新 - 失敗'
}
})
}
出現(xiàn)問題地方在于:
onMessage回調(diào)中 $db->update
這里,
比如:日志提示成功了,數(shù)據(jù)庫 content
字段確實(shí)被更新了,但 status = 0 默認(rèn)
字段依然是默認(rèn)的,期間運(yùn)行中也沒有任何報錯
又或者: 日志也提示成功了, 但數(shù)據(jù)庫中什么也沒更新 content
和status = 0 默認(rèn)
都沒用被更新, 同樣也沒有報錯
但是,還是會有按預(yù)期把數(shù)據(jù)完整更新的,也就是 content
和 status = 1
都更新了
這個問題無從定位是哪里的原因,使用了try catch也沒有異常發(fā)生,想請問是Medoo的原因還是本身業(yè)務(wù)代碼上有什么問題嗎?請大佬幫助分析下
OS:Ubuntu 及 Centos
啟動方式:寶塔 - 進(jìn)程守護(hù)
php worker.php start
試著更新的時候把當(dāng)前時間作為字段也更新一下
'content' => $http['content'],
'status' => 1
有沒有可能這兩個字段數(shù)據(jù)庫里和提交的是一致的?medoo updata如果信息一致會返回更新失敗
不會的,這2個字段的值從http過來的數(shù)據(jù)一定不會一致,status = 0創(chuàng)建時就默認(rèn)的,content也不會一樣。問題就是medoo并沒有報錯,查看了log也是正確語句?,F(xiàn)在測試的,加上了 updateTime 也作為更新字段后一切正常