//記錄執(zhí)行時(shí)間
$start = microtime(true);
$data = jsonDecode($data, true);
$result = ['status' => 'error', 'info' => '圖片上傳失敗,請重試!'];
if (isset($data['mediaId']) && !empty($data['mediaId'])) {
//創(chuàng)建一個(gè)定時(shí)器,如果超過10秒還沒有上傳成功,則返回錯(cuò)誤信息
$timerId = Timer::add(self::QINIU_TIMEOUT, function () use ($connection) {
$connection->send(json_encode(['status' => 'error', 'info' => '圖片上傳失敗,請重試!'], JSON_UNESCAPED_UNICODE));
//關(guān)閉當(dāng)前鏈接
$connection->close();
//關(guān)閉當(dāng)前進(jìn)程
Worker::stopAll();
}, [], false);
//記錄上傳七牛時(shí)間
$start2 = microtime(true);
$qiniu = new Qiniu();
$res = $qiniu->uploadMedia($data['mediaId'], $data['path'], $data['fileType']);
if ($res['status'] == 'success') {
$result = ['status' => 'success', 'info' => $res['info']];
} else {
$result = ['status' => 'error', 'info' => '圖片上傳失敗,請重試!'];
}
$end2 = microtime(true);
//如果上傳成功,則刪除定時(shí)器
if ($result['status'] == 'success') {
Timer::del($timerId);
}
}
$connection->send(json_encode($result, JSON_UNESCAPED_UNICODE));
$end = microtime(true);
$time = $end - $start;
if ($time >= self::QINIU_TIMEOUT) {
//推送通知
}
上述代碼是開啟了自定義進(jìn)程,用來將圖片上傳到七牛云。七牛云的上傳接口沒有超時(shí)設(shè)置。
由于有些圖片上傳時(shí)間過長,所以設(shè)置了一個(gè)QINIU_TIMEOUT超時(shí)時(shí)間,當(dāng)超過這個(gè)時(shí)間后就使用Worker::stopAll()結(jié)束這個(gè)進(jìn)程以終止此次上傳操作。按理說這樣設(shè)計(jì)的話單次上傳時(shí)間不會(huì)超過QINIU_TIMEOUT了,但是實(shí)際上仍然有很多超時(shí),好像進(jìn)程并沒有被結(jié)束,并且推送通知處的代碼也仍然會(huì)執(zhí)行(進(jìn)程結(jié)束后,后續(xù)代碼不是應(yīng)該不執(zhí)行了嗎?)。
想問下:類似的這種需求應(yīng)該怎么設(shè)計(jì)方案?當(dāng)前的方案怎么改進(jìn)?
業(yè)務(wù)代碼是順序執(zhí)行的,從七牛云SDK上傳直到運(yùn)行到推送通知,在這個(gè)過程中workerman內(nèi)核無法得到運(yùn)行權(quán),業(yè)務(wù)邏輯執(zhí)行過程中無法執(zhí)行定時(shí)器的邏輯。
一般上傳類的SDK都有超時(shí)設(shè)置,沒必要用定時(shí)器做。
提過七牛云的工單,回復(fù)說這個(gè)sdk沒有超時(shí)設(shè)置,只能我這邊請求超時(shí)的時(shí)候結(jié)束進(jìn)程 。老大,有沒有辦法在業(yè)務(wù)執(zhí)行過程中把進(jìn)程結(jié)束了啊