yii2 в связке с httpclient и использованием proxy, исключения

Используется фреймворк yii2. Задача проверить список прокси из файла на валидность, путем простой попытки открыть страницу с поочередным использованием каждого proxy-адреса из файла. Функция взята из рабочего вариант без yii2 и использованием голого curl. Данный вариант переделывается под yii2, но проблема в том, что когда попадается нерабочий прокси, то yii2 выдаёт: "HTTP Client Exception - An internal server error occurred."

Если смотреть в дебагере, то вполне ожидаемые:

  • Proxy CONNECT aborted due to timeout
  • Connection timed out after 5000
  • milliseconds Failed to connect to 45.77.69.137 port 8080: Connection refused

Собственно это логично, что такие ошибки должны быть, именно для этого мы этот список и проверяем, чтобы оставить только рабочие варианты. Но, как я уже написа, yii2 после первой же проблемы с прокси - отказывается работать дальше и не позволяет что-либо предпринять. Как можно заставить yii2 продолжать работу с циклом? В теории понимаю, что есть исключения и т.д. Но вся информация которую я нашел сводилась к тому, что мы можем просто красиво вывести эту ошибку или правильно перенаправить пользователя.

for ($i = 0; $i<count($proxies); $i++)
{   
    $proxy = trim($proxies[$i]);

    $response = $client->createRequest()
    ->setMethod('GET')
    ->setUrl('https://google.com')
    ->setOptions([
        CURLOPT_PROXY => $proxy, 
        CURLOPT_HEADER => 0,
        CURLOPT_PROXYTYPE => 0,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_CONNECTTIMEOUT => 5,
        CURLOPT_TIMEOUT => 5, 
    ])
    ->send();
    //Тут yii2 прекращает работу из-за проблем с прокси
    if ($response->isOk) 
    {
        fwrite($fp, $proxy."\r\n");
        fwrite($log_fp, $proxy."\r\n");
        $count++;
    }
} 

Ответы (1 шт):

Автор решения: fedornabilkin
try {
    // ваш код внутри цикла, либо только send()
} catch (Exception $e) {
    continue;
}

Вместо if ($response->isOk) я бы создал класс, в который прокинуть $response и внутри класса уже проверять валидность и складывать хорошие в один массив, плохие в другой. И уже после цикла записать в файл только хорошие прокси. Одна запись != много записей.

→ Ссылка