Как обработать 500 внутренних ошибок сервера при использовании file_get_contents с неправильным прокси?

Если я запускаю этот код в 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

Решение

Я предполагаю, что вы имеете в виду две вещи, когда говорите «обрабатывать»:

  1. Если сценарий подключается к «неправильному» прокси-серверу, он будет долго ждать установления соединения, пока не истечет время ожидания. Сценарий должен установить меньшее время ожидания, чтобы пользователи не ждали вечно.
  2. Если во время доступа к внешнему ресурсу возникает ошибка, не умирайте и не показывайте ужасные сообщения. Вместо этого притворись, что все круто.

Что касается 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);

Таким образом, вы можете решить, что вы хотите сделать в случае ошибки.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]