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é.
É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);
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.
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.
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 .....".
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();
}
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
}
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";
}
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();
}
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
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]);
}
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";
}
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);
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;
}