自定义进程是否可以用Worker::stopAll()关闭进程?

workers
//记录执行时间
$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了,但是实际上仍然有很多超时,好像进程并没有被结束,并且推送通知处的代码也仍然会执行(进程结束后,后续代码不是应该不执行了吗?)。
想问下:类似的这种需求应该怎么设计方案?当前的方案怎么改进?

478 1 0
1个回答

walkor

业务代码是顺序执行的,从七牛云SDK上传直到运行到推送通知,在这个过程中workerman内核无法得到运行权,业务逻辑执行过程中无法执行定时器的逻辑。
一般上传类的SDK都有超时设置,没必要用定时器做。

  • workers 2023-04-20

    如果把上传的代码放到定时器的回调函数中执行,workerman内核是否可以拿到运行权

  • walkor 2023-04-20

    执行业务的过程中workerman都拿不到运行权,包括业务里七牛云SDK上传过程

  • workers 2023-04-20

    提过七牛云的工单,回复说这个sdk没有超时设置,只能我这边请求超时的时候结束进程 。老大,有没有办法在业务执行过程中把进程结束了啊

  • walkor 2023-04-20

    改下七牛sdk吧

年代过于久远,无法发表回答
🔝