У меня есть скрипт php вроде этого:

    <?php
$likes = 'https://graph.facebook.com/google';
$fb = file_get_contents($likes);
$fb_array=json_decode($fb,true);
$all_likes = $fb_array['likes'];
$english_format = number_format($all_likes);
?>

Иногда случается, что URL-адрес не работает, и я получаю что-то вроде этого:

Warning: file_get_contents(https://graph.facebook.com/google) [function.file-get-contents]: failed to open stream: HTTP request failed! in /var/www/html/google/index.php on line 774

Мне было интересно, есть ли способ изящной деградации кода, потому что это приводит к остановке всего моего веб-сайта.

Я думал, есть ли альтернатива php или curl для обработки этой ошибки.

Любые идеи?

Благодарность

Изменить: я мог бы так:

    <?php
$likes = 'https://graph.facebook.com/google';
if(!@file_get_contents($likes)){
    $english_format = 123;
} else {
$fb = file_get_contents($likes);
$fb_array=json_decode($fb,true);
$all_likes = $fb_array['likes'];
$english_format = number_format($all_likes);
    } 
?>

Но это все равно тормозит мой сайт

0
Patrioticcow 27 Авг 2011 в 00:55

3 ответа

Лучший ответ

Ошибки HTTP можно обрабатывать с помощью file_get_contents, используя контекст потока:

$context = stream_context_create(array(
    'http' => array(
         'ignore_errors' => true,
    ),
));

$fb = file_get_contents('http://www.google.com');
$code = substr($http_response_header[0], strpos($http_response_header[0], ' ')+1);

if ($code != 200) {
    // there might be a problem
}

Кроме того, display_errors должен быть Off в производственной среде.

1
netcoder 26 Авг 2011 в 21:06

Мне не нравится @, потому что он замедляет выполнение кода. Но вы можете использовать приведенный ниже код, потому что, если все в порядке, вы создаете два file_get_contents, и он медленный

$likes = 'https://graph.facebook.com/google';
$result = @file_get_contents($likes);
if(empty($result)){
    $english_format = 123;
} else {
    $fb_array=json_decode($result,true);
    $all_likes = $fb_array['likes'];
    $english_format = number_format($all_likes);
} 
1
Andrej Ludinovskov 26 Авг 2011 в 20:59

Вы можете настроить обработчик ошибок, чтобы ловить (и вежливо управлять) Ошибка.

В качестве альтернативы вы можете @ подавить ошибку, а затем просто проверить, чтобы перед продолжением убедитесь, что $fb допустимо.

-1
Brad Christie 26 Авг 2011 в 20:59