web-dev-qa-db-fra.com

Comment puis-je gérer l'avertissement de la fonction file_get_contents () en PHP?

J'ai écrit un code PHP comme celui-ci

$site="http://www.google.com";
$content = file_get_content($site);
echo $content;

Mais lorsque je supprime "http: //" de $site, l'avertissement suivant s'affiche:

Avertissement: file_get_contents (www.google.com) [function.file-get-contents]: échec de l'ouverture du flux:

J'ai essayé try et catch mais cela n'a pas fonctionné.

286
Waseem

Étape 1: vérifiez le code de retour: if($content === FALSE) { // handle error here... }

Étape 2: supprimez l'avertissement en plaçant un opérateur de contrôle d'erreur (c'est-à-dire @) devant l'appel de file_get_contents () : $content = @file_get_contents($site);

468
Roel

Vous pouvez aussi définir votre gestionnaire d'erreurs en tant que fonction anonyme qui appelle un Exception et utiliser un try/catch pour cette exception.

set_error_handler(
    function ($severity, $message, $file, $line) {
        throw new ErrorException($message, $severity, $severity, $file, $line);
    }
);

try {
    file_get_contents('www.google.com');
}
catch (Exception $e) {
    echo $e->getMessage();
}

restore_error_handler();

Il semble que beaucoup de code attrape une petite erreur, mais si vous utilisez des exceptions dans votre application, vous n’auriez à le faire qu’une seule fois, en haut (dans un fichier de configuration inclus, par exemple), et convertissez toutes vos erreurs en exceptions.

131
enobrev

Ma façon préférée de le faire est assez simple:

if (!$data = file_get_contents("http://www.google.com")) {
      $error = error_get_last();
      echo "HTTP request failed. Error was: " . $error['message'];
} else {
      echo "Everything went better than expected";
}

J'ai trouvé ceci après avoir expérimenté le try/catch de @enobrev ci-dessus, mais cela permet un code moins long (et plus facile à lire). Nous utilisons simplement error_get_last pour obtenir le texte de la dernière erreur et file_get_contents renvoie false en cas d'échec, ainsi un simple "if" peut intercepter cela.

64
Laurie

Vous pouvez ajouter un @: $content = @file_get_contents($site);

Cela supprimera tout avertissement - utiliser avec parcimonie!. Voir Opérateurs de contrôle d'erreur

Modifier: lorsque vous supprimez le 'http: //', vous ne recherchez plus une page Web, mais un fichier sur votre disque appelé "www.google .....".

33
Greg

Une solution consiste à supprimer l'erreur et à générer une exception que vous pourrez détecter plus tard. Ceci est particulièrement utile s'il y a plusieurs appels à file_get_contents () dans votre code, car vous n'avez pas besoin de les supprimer et de les gérer tous manuellement. Au lieu de cela, plusieurs appels peuvent être effectués vers cette fonction dans un seul bloc try/catch.

// Returns the contents of a file
function file_contents($path) {
    $str = @file_get_contents($path);
    if ($str === FALSE) {
        throw new Exception("Cannot access '$path' to read contents.");
    } else {
        return $str;
    }
}

// Example
try {
    file_contents("a");
    file_contents("b");
    file_contents("c");
} catch (Exception $e) {
    // Deal with it.
    echo "Error: " , $e->getMessage();
}
20
Aram Kocharyan
function custom_file_get_contents($url) {
    return file_get_contents(
        $url,
        false,
        stream_context_create(
            array(
                'http' => array(
                    'ignore_errors' => true
                )
            )
        )
    );
}

$content=FALSE;

if($content=custom_file_get_contents($url)) {
    //play with the result
} else {
    //handle the error
}
13
RafaSashi

Voici comment je l'ai fait ... Pas besoin de bloc try-catch ... La meilleure solution est toujours la plus simple ... Profitez-en!

$content = @file_get_contents("http://www.google.com");
if (strpos($http_response_header[0], "200")) { 
   echo "SUCCESS";
} else { 
   echo "FAILED";
} 
13
MORFEMAN

Voici comment je gère cela:

$this->response_body = @file_get_contents($this->url, false, $context);
if ($this->response_body === false) {
    $error = error_get_last();
    $error = explode(': ', $error['message']);
    $error = trim($error[2]) . PHP_EOL;
    fprintf(STDERR, 'Error: '. $error);
    die();
}
6
Jrm

La meilleure chose à faire serait de définir vos propres gestionnaires d’erreurs et d’exceptions qui feront quelque chose d’utile, comme la consignation dans un fichier ou l’envoi de messages critiques. http://www.php.net/set_error_handler

4
Arkh

quelque chose comme ça:

public function get($curl,$options){
    $context = stream_context_create($options);
    $file = @file_get_contents($curl, false, $context);
    $str1=$str2=$status=null;
    sscanf($http_response_header[0] ,'%s %d %s', $str1,$status, $str2);
    if($status==200)
        return $file        
    else 
        throw new \Exception($http_response_header[0]);
}
1
Michael de Oz

Vous pouvez utiliser ce script

$url = @file_get_contents("http://www.itreb.info");
if ($url) {
    // if url is true execute this 
    echo $url;
} else {
    // if not exceute this 
    echo "connection error";
}
1
ogie

Le moyen le plus simple de faire cela est juste de faire précéder un @ avant file_get_contents, i. e .:

$content = @file_get_contents($site); 
1

Depuis PHP 4, utilisez error_reporting () :

$site="http://www.google.com";
$old_error_reporting = error_reporting(E_ALL ^ E_WARNING);
$content = file_get_content($site);
error_reporting($old_error_reporting);
if ($content === FALSE) {
    echo "Error getting '$site'";
} else {
    echo $content;
}
1
Bob Stein