//记录执行时间
$start = microtime(true);
$data = jsonDecode($data, true);
$result = ['status' => 'error', 'info' => '图片上传失败,请重试!'];
if (isset($data['mediaId']) && !empty($data['mediaId'])) {
//创建一个定时器,如果超过10秒还没有上传成功,则返回错误信息
$timerId = Timer::add(self::QINIU_TIMEOUT, function () use ($connection) {
$connection->send(json_encode(['status' => 'error', 'info' => '图片上传失败,请重试!'], JSON_UNESCAPED_UNICODE));
//关闭当前链接
$connection->close();
//关闭当前进程
Worker::stopAll();
}, [], false);
//记录上传七牛时间
$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);
//如果上传成功,则删除定时器
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) {
//推送通知
}
上述代码是开启了自定义进程,用来将图片上传到七牛云。七牛云的上传接口没有超时设置。
由于有些图片上传时间过长,所以设置了一个QINIU_TIMEOUT超时时间,当超过这个时间后就使用Worker::stopAll()结束这个进程以终止此次上传操作。按理说这样设计的话单次上传时间不会超过QINIU_TIMEOUT了,但是实际上仍然有很多超时,好像进程并没有被结束,并且推送通知处的代码也仍然会执行(进程结束后,后续代码不是应该不执行了吗?)。
想问下:类似的这种需求应该怎么设计方案?当前的方案怎么改进?
业务代码是顺序执行的,从七牛云SDK上传直到运行到推送通知,在这个过程中workerman内核无法得到运行权,业务逻辑执行过程中无法执行定时器的逻辑。
一般上传类的SDK都有超时设置,没必要用定时器做。
如果把上传的代码放到定时器的回调函数中执行,workerman内核是否可以拿到运行权
执行业务的过程中workerman都拿不到运行权,包括业务里七牛云SDK上传过程
提过七牛云的工单,回复说这个sdk没有超时设置,只能我这边请求超时的时候结束进程 。老大,有没有办法在业务执行过程中把进程结束了啊
改下七牛sdk吧