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 шт):
try {
// ваш код внутри цикла, либо только send()
} catch (Exception $e) {
continue;
}
Вместо if ($response->isOk) я бы создал класс, в который прокинуть $response и внутри класса уже проверять валидность и складывать хорошие в один массив, плохие в другой. И уже после цикла записать в файл только хорошие прокси. Одна запись != много записей.