PHP知道服务完成转换何时



我正在使用Symfony应用中的视频转换服务。我的问题是我需要知道何时完成视频转换。流量是:我触发视频转换服务,当视频成功转换为视频服务时,视频状态将视频状态转换为"转换"。如果失败,则状态为"失败"。在设置视频发布之前,我需要继续检查视频状态。

   public function setVideo(Post $post, Video $video){
    if($video->getStatus() != 'ready_for_conversion'){
        throw new ApiException('video cannot be processed');
    }else{
        $videoService = $this->container->get('app.video_service');
        $videoService->submitJob($video);
        $converting = true;
        while ($converting) {
            $status = $video->getStatus();
            if($status == Video::STATUS_CONVERTED) {
                break;
            }elseif ($status == Video::STATUS_FAILED){
                throw new ApiException('video failed');
            }
        }
        $post->setVideo($video);
    }
}

当我运行此代码时,我会得到

php.CRITICAL: Fatal Error: Maximum execution time of 30 seconds exceeded

即使视频服务在一段时间后成功更新了状态。

在没有更多有关应用程序架构的情况下,您的问题很难回答。我将假设您的上传的视频将花费一些时间来完成处理。似乎是一个安全的选择,因为众所周知,视频在计算上很昂贵。这就是打破代码的原因(从该错误中可以看到(。基本上,处理视频需要超过30秒的时间,这并不奇怪。

要解决此问题,您需要重新考虑解决方案。做到这一点的最佳方法是回到思考您的目标。如果您的代码中的Post对象是某种类型的文章或博客文章,并且您正在尝试防止视频在实际准备好之前被显示或使用,那么我建议您让帖子将视频关联并移动检查逻辑进入模型。在这种情况下,您可以执行以下操作:

class Post
{
    ...
    public function isVideoAvailable()
    {
        return isset($this->video) && Video::STATUS_CONVERTED === $this->getVideo()->getStatus();
    }
}

然后将其包裹在显示或在API响应中时查看模板。这是一个小树枝示例:

{% if post.isVideoAvailable() %}
<div class="video">
    <!-- put video embed code here -->
</div>
{% endif %}

如果您有充分的理由阻止视频与Post关联。然后,您可能需要将其分解为多个控制器操作。一个接受视频并启动处理,另一个要进行民意调查以查看何时完成,最后一个将视频关联(您可以结合最后两个,因为它不是SRP,所以我似乎很混乱,但是您可能有也是如此的充分理由(。

还有其他选项,例如使用Web插座或HTTP流媒体,但是在这里解释很复杂。

简短的答案是,对于长期运行的过程,使用任何Web服务端点都是不好的。这样做还有很多其他的性能问题,这些问题会在某个时候浮出水面,所以不要那样做。

最新更新