2013-05-25 12 views
5

I pomyślnie pobierał stron internetowych zJak uniknąć błędów file_get_contents: „Nie można rozwiązać nazwy hosta”

file_get_contents("http://www.site.com"); 

Jednakże, jeśli adres URL nie istnieje, lub nieosiągalny, jestem coraz

Warning: file_get_contents(http://www.site.com) [function.file-get-contents]: 
failed to open stream: operation failed in /home/track/public_html/site.php 
on line 773 

Czy jest możliwe echo "Site not reachable"; zamiast błędu?

+1

spróbuj '@file_get_contents (...) ':) – migg

+0

Dzięki. Jednak przeczytałem gdzieś, że nie powinienem używać tego @, ponieważ nie jest to dobry sposób. – user198989

+0

Powtórz pytanie: http://stackoverflow.com/questions/272361/how-can-i-handle-the-warning-of-file-get-contents-function-inphp. –

Odpowiedz

7

Można użyć silence operator@ wraz z $php_errormsg:

if(@file_get_contents($url) === FALSE) { 
    die($php_errormsg); 
} 

Jeżeli @ tłumi się komunikat o błędzie, tekst komunikatu będzie dostępna dla wyjścia w $php_errormsg

Należy jednak pamiętać, że $php_errormsg jest wyłączony domyślna. Musisz włączyć track_errors. Więc dodać na początku kodu:

ini_set('track_errors', 1); 

Jednak istnieje sposób, który nie zależy od błędów torowych:

if(@file_get_contents($url) === FALSE) { 
    $error = error_get_last(); 
    if(!$error) { 
     die('An unknown error has occured'); 
    } else { 
     die($error['message']); 
    } 
} 
2

To powinno działać:

@file_get_contents("http://www.site.com"); 

The @ tłumi ostrzeżenia i błędy wyprowadzane przez PHP. Będziesz wtedy musiał sam sobie poradzić z pustą odpowiedzią.

0

Można wyłączyć ostrzeżenia w PHP:

Turn off warnings and errors on php/mysql

Zobacz w dokumentacji:

http://il1.php.net/manual/en/function.file-get-contents.php

Return Values: The function returns the read data or FALSE on failure.

lub zapisu @ przed funkcji, dla unikać zobaczyć komunikat o błędzie:

@file_ge t_contents (...

+0

Hmm, ale błędy są zawsze dobrym sposobem na poradzenie sobie z tym problemem, tylko ten jest dla mnie obrzydliwy. – user198989

+0

Jeśli żądanie może mieć wiele problemów.Lepszy sposób pracy nad rozszerzeniem PHP - CURL, jeśli chcesz wiedzieć dokładnie, co się dzieje, po prośbie. - Błąd żądania DNS - Zła strona 404, 501 - Limit czasu serwera. W każdym razie otrzymasz FALSE, jeśli prośba jest błędna. Nie jestem pewien, czy trzeba zrobić ponad wyjątek. Lepsze w każdym razie na serwerze produkcyjnym, aby wyłączyć ostrzeżenia. – CETb

6

bym perfer wywołać wyjątki zamiast komunikatów o błędach:

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    // see http://php.net/manual/en/class.errorexception.php 
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 
} 

set_error_handler("exception_error_handler"); 

Teraz można złapać błąd tak:

try { 
    $content = file_get_contents($url); 
} catch (ErrorException $ex) { 
    echo 'Site not reachable (' . $ex->getMessage() . ')'; 
} 
+0

Spróbuj złapać jest idealny :) –

+1

Ale dostaniesz się do głębokich kłopotów mieszając się z obsługi błędów w ten sposób – migg

+0

'Praca z @ może rzeczywiście być uważane za niewłaściwe' LOL: D Tak, przedstawiłeś miłą alternatywę, ale uważaj gdy mówiąc takie rzeczy – hek2mgl

Powiązane problemy