如何在PHP中处理file_get_contents()函数的警告



我写了一个类似的PHP代码

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

但当我从$site中删除"http://"时,我会收到以下警告:

警告:file_get_contents(www.google.com)[function.file-get-contents]:失败开放流:

我试过trycatch,但都不起作用。

步骤1:检查返回代码:if($content === FALSE) { // handle error here... }

步骤2:通过在对file_get_contents()的调用前面放一个错误控制运算符(即@)来抑制警告:$content = @file_get_contents($site);

您还可以将错误处理程序设置为一个匿名函数,该函数调用异常并对该异常使用try/catch。

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

似乎有很多代码可以捕捉一个小错误,但如果你在整个应用程序中使用异常,你只需要在顶部(例如,在包含的配置文件中)执行一次,它就会将所有错误转换为异常。

我最喜欢的方法很简单:

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

我在使用上面@enobrev的try/catch进行实验后发现了这一点,但这允许代码不那么长(而且IMO更可读)。我们简单地使用error_get_last来获得最后一个错误的文本,并且file_get_contents在失败时返回false,所以简单的";如果";可以抓住它。

您可以预先发送一个@:$content = @file_get_contents($site);

这将压制任何警告-使用谨慎 。参见错误控制操作员

编辑:当你删除"http://"时,你不再寻找网页,而是在你的磁盘上寻找一个名为"www.google….."的文件

一种选择是抑制错误,并抛出一个稍后可以捕获的异常。如果代码中有多个对file_get_contents()的调用,这一点尤其有用,因为您不需要手动抑制和处理所有这些调用。相反,可以在一个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
                )
            )
        )
    );
}

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

以下是我的操作方法…不需要try-catch块。。。最好的解决方案总是最简单的。。。享受

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

以下是我如何处理的:

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

最好的办法是设置自己的错误和异常处理程序,它可以做一些有用的事情,比如将其记录在文件中或通过电子邮件发送关键的文件。http://www.php.net/set_error_handler

由于PHP 4使用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;
}

类似这样的东西:

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

您可以使用这个脚本

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

您应该在使用file_get_contents()之前使用file_exists()函数。通过这种方式,您将避免php警告。

$file = "path/to/file";
if(file_exists($file)){
  $content = file_get_contents($file);
}

最简单的方法就是在file_get_contents之前预加一个@,i;e.:

$content = @file_get_contents($site); 

我解决了所有问题,它的工作所有链接

public function getTitle($url)
    {
        try {
            if (strpos($url, 'www.youtube.com/watch') !== false) {
                $apikey = 'AIzaSyCPeA3MlMPeT1CU18NHfJawWAx18VoowOY';
                $videoId = explode('&', explode("=", $url)[1])[0];
                $url = 'https://www.googleapis.com/youtube/v3/videos?id=' . $videoId . '&key=' . $apikey . '&part=snippet';
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                curl_setopt($ch, CURLOPT_VERBOSE, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                $response = curl_exec($ch);
                curl_close($ch);
                $data = json_decode($response);
                $value = json_decode(json_encode($data), true);
                $title = $value['items'][0]['snippet']['title'];
            } else {
                set_error_handler(
                    function () {
                            return false;
                    }
                );
                if (($str = file_get_contents($url)) === false) {
                    $title = $url;
                } else {
                    preg_match("/<title>(.*)</title>/i", $str, $title);
                    $title = $title[1];
                    if (preg_replace('/[x00-x1Fx7F-xFF]/', '', $title))
                        $title = utf8_encode($title);
                    $title = html_entity_decode($title);
                }
                restore_error_handler();
            }
        } catch (Exception $e) {
            $title = $url;
        }
        return $title;
    }

这将尝试获取数据,如果不起作用,它将捕获错误,并允许您在捕获中执行任何需要的操作。

try {
    $content = file_get_contents($site);
} catch(Exception $e) {
    return 'The file was not found';
}
if (!file_get_contents($data)) {
  exit('<h1>ERROR MESSAGE</h1>');
} else {
      return file_get_contents($data);
}

相关内容

  • 没有找到相关文章

最新更新