如何处理PHP中file_get_contents()函数的警告?[复制]

How can I handle the warning of file_get_contents() function in PHP? [duplicate]

提问人:Waseem 提问时间:11/7/2008 最后编辑:Paulo BoaventuraWaseem 更新时间:6/24/2023 访问量:419306

问:

我写了一个这样的PHP代码

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

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

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

我试过了,但没有用。trycatch

PHP 函数 异常 警告 file-get-contents

评论

2赞 Hugo Stieglitz 6/19/2012
还有一个有趣的方法:stackoverflow.com/questions/6718598/......
0赞 Fr0zenFyr 7/1/2015
相关新闻: stackoverflow.com/q/2002610
0赞 MingalevME 2/9/2017
将 try-catch 与 set_error_handler-function 一起使用,如此处所述 stackoverflow.com/a/3406181/1046909
3赞 Rauli Rajande 12/14/2017
如果从 url 中删除 http://,则是在本地磁盘上查找“www.google.com”文件。
1赞 Daniel W. 3/13/2018
这怎么能得到如此多的关注和点赞。为什么要删除协议信息。即使在 2008 年,您也有 FTP 和 HTTPS。

答:

42赞 Greg 11/7/2008 #1

您可以在前面添加 @:$content = @file_get_contents($site);

这将抑制任何警告 - 谨慎使用!请参阅错误控制运算符

编辑:当您删除“http://”时,您不再在寻找网页,而是在磁盘上寻找一个名为“www.google.....”

评论

0赞 Olaf 9/25/2017
这是唯一真正有效的方法 - 我无法以任何其他方式抑制“无法打开流”消息。
592赞 Roel 11/7/2008 #2

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

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

评论

103赞 Aram Kocharyan 6/24/2011
记住使用严格的比较: if ($content === FALSE) 。如果文件包含“0”,则将触发漏报。
8赞 Sagi Mann 11/22/2012
嗨,这对我不起作用,添加 @ 仍然会导致E_WARNING被一些全局(不是我的)错误处理程序捕获,并且我的脚本在我有机会处理返回值之前就死了。有什么想法吗?TNX的。
2赞 Dax 12/23/2012
检测到副作用:如果文件不存在,脚本将在@file_get_contents行停止。
5赞 Fr0zenFyr 7/1/2015
虽然答案很旧,但我仍然建议在你的答案中添加一个注释,即使用可能会对性能产生负面影响。在一篇解释得相当好的相关帖子上看到这个答案@
5赞 helle 7/15/2019
别这样。您只需按下错误警告即可。这不是错误处理!这会在调试中出现问题。
5赞 Arkh 11/8/2008 #3

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

16赞 MORFEMAN 3/6/2009 #4

这是我是如何做到的......不需要try-catch块...最好的解决方案总是最简单的......享受!

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

评论

5赞 Nathan Reed 3/24/2013
-1:如果您遇到 404 错误或其他错误,这将起作用,但如果您根本无法连接到服务器(例如错误的域名),则不起作用。我认为在这种情况下没有更新,因为没有收到HTTP响应。$http_response_header
1赞 Seb 1/20/2014
正如@NathanReed所说,您应该检查$content不是假的(使用 ===),因为如果请求根本无法连接,则返回此结果
179赞 enobrev 8/4/2010 #5

还可以将错误处理程序设置为调用 Exception匿名函数,并对该异常使用 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();

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

评论

0赞 Pacerier 7/17/2013
@enobrev,为什么错误号和严重性都值相同?
0赞 enobrev 7/17/2013
除了在 $exception->getCode() 中提供有用的东西之外,没有具体的原因,因为 set_error_handler 没有提供错误号变量(不幸的是)。
2赞 enobrev 10/2/2015
@lolka_bolka,因为file_get_contents不会抛出异常,而是抛出 php 错误。因此,这个例子所做的是设置一个“错误处理程序”,该处理程序捕获大多数 php 错误实例,并将这些错误转换为异常。这是文档中一个更现代的例子:php.net/manual/en/...
2赞 Josef Sábl 10/23/2017
@enobrev 在抛出异常之前,不要忘记在匿名函数中恢复错误处理程序。可以处理异常,在这种情况下,处理程序仍设置为引发此特定异常,当异常处理中出现另一个错误时,该异常可能会出乎意料,并引入奇怪的、难以调试的行为。
2赞 peschanko 4/7/2019
我建议在finally块中包含restore_error_handler()调用
26赞 Aram Kocharyan 6/24/2011 #6

一种替代方法是禁止显示错误,并抛出稍后可以捕获的异常。如果代码中有多个对 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();
}
-2赞 ogie 2/27/2012 #7

您可以使用此脚本

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

评论

0赞 Daniel W. 3/13/2018
这需要严格的比较:因为如果你得到一个响应或空,它就会引发连接错误。if ($url === true)...0
115赞 Laurie 11/14/2012 #8

我最喜欢的方法相当简单:

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

我在尝试了上面的 from @enobrev 后发现了这一点,但这允许更少的冗长(和 IMO,更具可读性)代码。我们只是用来获取最后一个错误的文本,并在失败时返回 false,因此一个简单的“if”可以捕获它。try/catcherror_get_lastfile_get_contents

评论

2赞 EDP 12/30/2015
这是解决这个问题的最简单和最好的解决方案!也许可以抑制向浏览器报告的错误。@file_get_contents
1赞 kostix 2/10/2016
我承认,在所有答案中,这是唯一明智的答案——如果我们将其扩充为用于抑制警告并使用 .@file_get_contents=== FALSE
13赞 GordonM 6/6/2016
对于未返回正文或返回计算结果为 false 的正文的成功请求,这将触发错误。应该是if (false !== ($data = file_get_contents ()))
0赞 Glenn Schmidt 1/30/2017
文档没有说清楚,但根据我的经验,使用 @ 可能会导致任何返回error_get_last
3赞 Robert 1/24/2021
第一个条件是向后。如果 false 不等于 file_get_contents 调用的结果,那么它得到了一些内容,我们不应该寻找错误。当我看到上一个测试中的错误或看到一个错误时,我感到很困惑,$error真正找到谷歌时,该错误是空的!
6赞 Jrm 2/24/2014 #9

以下是我的处理方式:

$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();
}
19赞 RafaSashi 2/24/2014 #10
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
}

评论

0赞 Raptor 5/16/2014
这是行不通的。如果未找到 404,仍会出现警告。$url
0赞 RafaSashi 5/16/2014
对了猛禽,我用 stream_context_create() 改进了答案;没有比这更好的了......不推荐使用“@”
1赞 sun 7/2/2014
ignore_errors仅指示 HTTP 上下文不将 HTTP 响应状态代码 >= 400 解释为错误。虽然略有相关,但这并不能回答PHP错误处理的问题。
1赞 Modder 2/17/2020
感谢您的选择!这就是我需要的!ignore_errors
0赞 Bob Stein 7/19/2014 #11

从 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;
}
-4赞 Brad 7/29/2016 #12

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

try {
    $content = file_get_contents($site);
} catch(\Exception $e) {
    return 'The file was not found';
}
-2赞 Jesús Díaz 10/4/2016 #13

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

$file = "path/to/file";

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

评论

2赞 rubo77 1/30/2018
仅当您调用本地文件并且您具有检查本地文件(如果存在)的适当权限时,这才有效
-2赞 Muhammad Adeel Malik 2/8/2019 #14

最简单的方法是在file_get_contents之前预加一个 @, 即:

$content = @file_get_contents($site); 
-1赞 Michael de Oz 4/24/2019 #15

像这样的东西:

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]);
}
-4赞 Frank Rich 2/17/2020 #16
if (!file_get_contents($data)) {
  exit('<h1>ERROR MESSAGE</h1>');
} else {
      return file_get_contents($data);
}

评论

1赞 Alp Altunel 11/7/2020
不。你应该 === 进行条件检查。不是 ==
3赞 Juakali92 1/31/2021
不建议运行file_get_contents两次。一次就够了。
-2赞 Công Thịnh 10/9/2021 #17

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

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-\x1F\x7F-\xFF]/', '', $title))
                        $title = utf8_encode($title);
                    $title = html_entity_decode($title);
                }
                restore_error_handler();
            }
        } catch (Exception $e) {
            $title = $url;
        }
        return $title;
    }

评论

1赞 Community 10/9/2021
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。