Pergunta

Eu escrevi um código PHP como este

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

Mas quando eu remover "http: //" de $site eu recebo o seguinte aviso:

Atenção: file_get_contents (www.google.com) [Function.file-get-contents]: failed de fluxo aberto:

Eu tentei try e catch mas não funcionou.

Foi útil?

Solução

Passo 1: Verifique o código de retorno: if($content === FALSE) { // handle error here... }

Passo 2: suprimir o aviso, colocando um controle de erro do operador (ie @) na frente da chamada para file_get_contents () : $content = @file_get_contents($site);

Outras dicas

Você também pode definir o manipulador de erro como função anônima que chama um exceção e usar um try / catch em que exceção.

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();

Parece que um monte de código para pegar um pequeno erro, mas se você estiver usando exceções em todo o seu aplicativo, você só precisa fazer isso uma vez, como no topo (em um arquivo de configuração incluídos, por exemplo), e ele vai converter todos os seus erros para exceções todo.

A minha maneira favorita de fazer isso é bastante simples:

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";
}

Eu encontrei este depois de experimentar com o try/catch de @enobrev acima, mas isso permite menos demorado código (e IMO, mais legível). Nós simplesmente usar error_get_last para obter o texto do último erro, e file_get_contents retornos falsos em caso de falha, assim que um simples "se" pode pegar isso.

Você pode preceder um @: $content = @file_get_contents($site);

Isto irá suprimir qualquer aviso! - Use com moderação . Consulte erro Operadores de Controle

Edit: Quando você remove o 'http: //' você não está procurando uma página web, mas um arquivo no seu disco chamado "www.google ....."

Uma alternativa é para suprimir o erro e também lançar uma exceção que você pode pegar mais tarde. Isto é especialmente útil se houver várias chamadas para file_get_contents () em seu código, desde que você não precisa para reprimir e lidar com todos eles manualmente. Em vez disso, várias chamadas podem ser feitas para essa função em um único bloco 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();
}

Aqui está como eu fiz isso ... Não há necessidade de bloco try-catch ... A melhor solução é sempre o mais simples ... Divirta-se!

$content = @file_get_contents("http://www.google.com");
if (strpos($http_response_header[0], "200")) { 
   echo "SUCCESS";
} else { 
   echo "FAILED";
} 
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
}

Aqui está como eu lidar com isso:

$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();
}

A melhor coisa seria para definir seus próprios manipuladores de erro e de exceção que vai fazer alguma coisa útil como registrá-lo em um arquivo ou e-mail os críticos. http://www.php.net/set_error_handler

Você pode usar esse 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";
}

Desde PHP 4 uso 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;
}

Mais simples maneira de fazer isso é apenas prefixar uma @ antes file_get_contents, Eu. e:.

$content = @file_get_contents($site); 

algo como isto:

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]);
}

Isto irá tentar obter os dados, se ele não funcionar, ele vai pegar o erro e permitir que você faça qualquer coisa que você precisa dentro da captura.

try {
    $content = file_get_contents($site);
} catch(\Exception $e) {
    return 'The file was not found';
}

Você deve usar file_exists () função antes de file_get_contents de uso (). Com esta forma, você vai evitar o aviso php.

$file = "path/to/file";

if(file_exists($file)){
  $content = file_get_contents($file);
}

Alterar o arquivo php.ini

allow_url_fopen = On

allow_url_include = On
try {
   $site="http://www.google.com";
   $content = file_get_content($site);
   echo $content;
} catch (ErrorException $e) {
    // fix the url

}

set_error_handler(function ($errorNumber, $errorText, $errorFile,$errorLine ) 
{
    throw new ErrorException($errorText, 0, $errorNumber, $errorFile, $errorLine);
});

Você também deve definir o

allow_url_use = On 

no seu php.ini para parar de receber avisos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top