【问题标题】:file_get_contents() returns literal 'Not Found' instead of booleanfile_get_contents() 返回文字“未找到”而不是布尔值
【发布时间】:2015-12-25 13:16:26
【问题描述】:

这是我正在使用的代码:

<?php 
$changelog="https://raw.github.com/neurobin/oraji/release/ChangeLog";
$filec1=@file_get_contents($changelog);

if($filec1===false) {$filec1="something";}

echo $filec1
?>

它打印 Not Found 而不是 something。但是当我像这样在 if 语句中添加另一个条件时:

if($filec1===false||$filec1=="Not Found") {$filec1="something";}

然后它按预期工作。

这里出了什么问题?

PHP 版本是 5.4。 php -v 输出:

PHP 5.4.45 (cli) (built: Oct 29 2015 09:16:10) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
    with the ionCube PHP Loader v4.7.5, Copyright (c) 2002-2014, by ionCube Ltd., and
    with Zend Guard Loader v3.3, Copyright (c) 1998-2013, by Zend Technologies
    with Suhosin v0.9.36, Copyright (c) 2007-2014, by SektionEins GmbH

注意:我在远程服务器上执行此操作。


编辑:

无论如何,我注意到(在浏览器中访问该 URL)Github 正在发送文字“未找到”作为该不存在 URL 的内容(我不知道为什么)。但是我该如何解决它(不使用文字字符串作为条件)?

这就是我最终做的:

根据 this answer,我正在检查 HTTP 标头响应并将 200 定位为成功代码,否则将失败(以及真/假检查)。

<?php 
function fileGetContents($file){
    $filec1=@file_get_contents($file);
    if($filec1===false || !strpos($http_response_header[0], "200")) 
        {$filec1="something";}
    return $filec1;
}

$changelog="https://raw.github.com/neurobin/oraji/release/ChangeLog";
$filec1=fileGetContents($changelog);

echo $filec1;
?>

注意:

如果使用 301/302 重定向,那么这将不起作用。例如,如果上面的链接确实存在,它将不起作用,即它将返回“某物”而不是重定向页面中的实际内容。因为raw.github.com被重定向到raw.githubusercontent.com

此解决方案仅在我使用没有重定向的实际 URL 时才有效。 所以这仍然不是一个好的解决方案。

【问题讨论】:

  • 给自己的 url 返回字符串 not found,这就是它起作用的原因。
  • 字符串“未找到”看起来像页面的主体。您确定 $changelog 是正确的 URL 并且可以从远程访问吗?
  • 以上两位评论员都说对了。
  • 如果 github 没有返回“200 OK”状态,你可以使用它。为此,请使用 CURL 或 Guzzle 等 HTTP 客户端库。

标签: php php-5.4


【解决方案1】:

使用$http_response_header:

$changelog="https://raw.github.com/neurobin/oraji/release/ChangeLog";
$filec1=@file_get_contents($changelog);

if($filec1===false || $http_response_header[0] == 'HTTP/1.1 404 Not Found') {$filec1="something";}

【讨论】:

  • 我想,寻找标题响应是要走的路。但不知何故,你的方法没有让我得到结果。只看200 似乎是要走的路。复制自stackoverflow.com/a/617721/3744681
  • 我已经将脚本上传到我的远程主机,github 给了我 301 代码。所以,是的,对于 github 的这种行为,它更有可能只在响应代码中搜索 200。
  • 请看我的编辑。我的解决方案有一个重大缺陷。
  • 在这种情况下似乎最好使用CURL。获取请求的 URL 并解析 curl 的结果。
  • 我已编辑并取消删除我的答案。它似乎工作。如果您发现其中有任何缺陷,请告诉我。
【解决方案2】:

file_get_contents 放入条件句中。

$changelog="https://raw.github.com/neurobin/oraji/release/ChangeLog";
if($filec1 = @file_get_contents($changelog)) {
    echo 'Got it';
} else {
    echo 'NOOOOOoooo!';
}

还请注意,如果您取消@,则会收到错误消息。

【讨论】:

  • 怎么回事,你没有得到Noooo! 或者你想要一些其他的行为?
  • 它让我找不到。
  • 我已经在本地测试了 PHP 5.2,它按预期工作。在此处测试 4.3-7,并按预期工作,3v4l.org/bZkHB。这是实际的网址吗?
  • 在本地主机上,我的原始代码也可以工作。但不是在远程......我不知道 Github 在内部做了什么来产生这种行为。
  • @chris85,我想我明白了。 Github 将重定向(301)重定向到未找到页面(404)。我的遥控器不遵循重定向。
【解决方案3】:

好吧,如果您访问该链接,您会看到您收到该错误。返回 json 的链接看起来像一个数组,即使它们在 web.xml 中。

【讨论】:

    【解决方案4】:

    这是按预期工作的:

    逻辑很简单:

    无论是否重定向,如果 URL 有效,$http_response_header 数组中的某处将有一个 200 OK

    所以,我只检查数组的所有元素是否有 200 OK 消息。

    <?php 
    function is200OK($arr){
        foreach($arr as $str){
            if(strpos($str, " 200 OK")) {return true;}
        }
        return false;
    }
    
    function fileGetContents($file){
        $filec1=@file_get_contents($file);
        if($filec1===false || !is200OK($http_response_header)) {$filec1="something";}
        //print_r($http_response_header);
        return $filec1;
    }
    
    $changelog="https://raw.github.com/neurobin/oraji/release/ChangeLog";
    $filec1=fileGetContents($changelog);
    
    echo $filec1;
    ?>
    

    【讨论】:

    • 这有点难 :) 无论如何,我仍然找不到更好的方法来使用 file_get_contents...
    猜你喜欢
    • 2017-04-22
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多