Если я запускаю этот код в PHP с неверным прокси Я получаю 500 внутренних ошибок сервера.
Как справиться с этим и продолжить исполнение?
$opts = array(
'http'=>array(
'method'=>"GET",
'proxy' => 'tcp://100.100.100.100:80' //a wrong proxy
)
);
$context = stream_context_create($opts);
$file = file_get_contents('http://ifconfig.me/ip', false, $context);
Я предполагаю, что вы имеете в виду две вещи, когда говорите «обрабатывать»:
Что касается 1) Тайм-аут удаленного соединения определяется в PHP default_socket_timeout
настройка по умолчанию составляет 60 секунд. Вы можете / должны установить намного меньшее время ожидания для ваших собственных вызовов:
$opts = array(
'http'=>array(
'timeout'=> 2, // timeout of 2 seconds
'proxy' => 'tcp://100.100.100.100:80' //a wrong proxy
)
);
Что касается 2), вы обычно используете try
/catch
блок. К несчастью, file_get_contents()
это одна из тех старых функций PHP, которые не генерируют исключений, которые можно перехватить.
Вы можете подавить возможное сообщение об ошибке, добавив префикс функции к @
знак:
$file = @file_get_contents('http://ifconfig.me/ip', false, $context);
Но тогда вы не можете обрабатывать ошибки вообще.
Если вы хотите иметь хотя бы немного обработка ошибок, вы должны использовать завивать. К сожалению, это также не вызывает исключений. Однако, если происходит ошибка cURL, вы можете прочитать ее с помощью curl_errno()
/curl_error()
,
Вот ваш код, реализованный с помощью cURL:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://ifconfig.me/ip");
curl_setopt($ch, CURLOPT_PROXY, 'tcp://100.100.100.100:80');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
curl_setopt($ch, CURLOPT_HEADER, 1);
$data = curl_exec($ch);
$error = curl_errno($ch) ? curl_error($ch) : '';
curl_close($ch);
print_r($error ? $error : $data);
Таким образом, вы можете решить, что вы хотите сделать в случае ошибки.
Других решений пока нет …