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