Http 请求无法捕获所有错误

时间:2021-07-28 06:52:17

标签: php symfony get httprequest

我目前正在 symfony 中开展一个项目,我的数据库中存储了很多链接。按下一个按钮,我想用 http 请求验证所有链接。

到目前为止,我在大多数情况下都可以正常工作:

我有一个发送请求并返回状态码的服务

    public function validateUrl($query) 
    {
        $response = $this->client->request(
            'GET',
            $query
        );

        $statusCode = $response->getStatusCode();

        return $statusCode;
    }

在调用服务的验证函数中,我有这个

public function validateAll(UrlValidatorService $urlValidatorService)
    {
        $request = Request::createFromGlobals();
        $referrer = $request->query->get('referrer');

        $repository = $this->getDoctrine()->getRepository(Url::class);
        $longUrls = $repository->findBy([], ['id' => 'ASC']);
        
        foreach($longUrls as $urlEntity)
        {
            $url = $urlEntity->getLongUrl();
            $statusCode = $urlValidatorService->validateUrl($url);
            $datestring = date('Y-m-d H:i:s');

            if($statusCode == 200) 
            {
                $urlEntity->setValidStatus('valid');
                $urlEntity->setValidDate(new \DateTime($datestring));
            }

            if($statusCode >= 300)
            {
                $urlEntity->setValidStatus('invalid');
                $urlEntity->setValidDate(new \DateTime($datestring));
            }

            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($urlEntity);
            $entityManager->flush(); 
        }

        return $this->redirect($referrer);
    }

正如我所说,这在大多数情况下都有效,但由于某些原因,这会出现一些错误,我不知道如何解决。任何帮助表示赞赏

无法捕获的错误示例: Example Error

1 个答案:

答案 0 :(得分:0)

好的,所以我想通了。尽管 https://github.com/symfony/symfony/issues/34281 指出捕获错误不起作用,因为响应是懒惰的,但我能够像这样捕获它们:

    public function validateUrl($query) 
    {
        try{
            $response = $this->client->request('GET', $query, ['timeout' => 5]);

            $response->getContent(false);
            $statusCode = $response->getStatusCode();
        }
        catch (HttpExceptionInterface $e) {    
            $statusCode = '404';
        }
        // Exceptions like Timeout
        catch (TransportExceptionInterface $e) {
            $statusCode = '404';
        }
        
        return $statusCode;
    }