为啥 file_get_contents 不起作用?

Posted

技术标签:

【中文标题】为啥 file_get_contents 不起作用?【英文标题】:Why doesn't file_get_contents work?为什么 file_get_contents 不起作用? 【发布时间】:2011-10-07 03:46:30 【问题描述】:

为什么file_get_contents 对我有用?在下面的测试文件代码中,似乎我搜索过的每个人的示例都列出了这个函数,但它从未被执行。这是网络托管服务的问题吗?有人可以在他们的服务器上测试这段代码,看看地理编码数组输出是否真的被打印为字符串吗?当然,我正在尝试将输出分配给一个变量,但是这个测试文件中没有输出....

<html>
<head>        
<title>Test File</title>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"> 
</script>
</head>
<body>
<?    
$adr = 'Sydney+NSW';
echo $adr;
$url = "http://maps.googleapis.com/maps/api/geocode/json?address=$adr&sensor=false";
echo '<p>'.$url.'</p>';
echo file_get_contents($url);
print '<p>'.file_get_contents($url).'</p>';
$jsonData   = file_get_contents($url);
echo $jsonData;
?>
</body>
</html>

【问题讨论】:

您收到的错误信息是什么?您是否收到一条错误消息?整个页面都返回了,只是未能产生您想要的输出? ini_get('allow_url_open') 的输出是什么? ***.com/questions/4761404/… maps.googleapis.com/maps/api/geocode/… 是 JSON 为什么不尝试上面链接中建议的方法,使用 cURL? 对于这些 cmets 的未来读者,我认为@Gordon 的意思是问ini_get('allow_url_fopen') 的输出是什么。值得检查它是否设置。 【参考方案1】:

检查file_get_contents PHP Manual 返回值。如果值为FALSE,则它无法读取文件。如果值为NULL,则该函数本身被禁用。

要详细了解file_get_contents 操作可能出现的问题,您必须启用错误报告和错误显示才能实际读取它们。

# Enable Error Reporting and Display:
error_reporting(~0);
ini_set('display_errors', 1);

您可以通过检查服务器上的 INI 值来获取有关调用失败原因的更多详细信息。直接影响file_get_contents 函数的一个值是allow_url_fopen。您可以通过运行以下代码来执行此操作。您应该注意,如果它报告不允许使用 fopen,那么您必须要求您的提供商更改您服务器上的此设置,以便任何需要此功能的代码与 URL 一起使用。

<html>
    <head>        
        <title>Test File</title>
        <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">
        </script>
    </head>
    <body>
<?php

# Enable Error Reporting and Display:
error_reporting(~0);
ini_set('display_errors', 1);

$adr = 'Sydney+NSW';
echo $adr;
$url = "http://maps.googleapis.com/maps/api/geocode/json?address=$adr&sensor=false";
echo '<p>', $url, '</p>';

$jsonData = file_get_contents($url);

echo '<pre>', htmlspecialchars(substr($jsonData, 128)), sprintf(' ... (%d)', strlen((string)$jsonData)), '</pre>';

# Output information about allow_url_fopen:
if (ini_get('allow_url_fopen') == 1) 
    echo '<p style="color: #0A0;">fopen is allowed on this host.</p>';
 else 
    echo '<p style="color: #A00;">fopen is not allowed on this host.</p>';



# Decide what to do based on return value:
if ($jsonData === FALSE) 
    echo "Failed to open the URL ", htmlspecialchars($url);
 elseif ($jsonData === NULL) 
   echo "Function is disabled.";
 else 
   echo '<pre>', htmlspecialchars($jsonData), '</pre>';


?>
    </body>
</html>

如果所有这些都失败了,可能是由于使用了短的开放标签&lt;?。因此,此答案中的示例代码已更改为使用 &lt;?php 以正常工作,因为无论设置了什么配置选项,这都保证在所有版本的 PHP 中都可以正常工作。要为您自己的脚本执行此操作,只需替换 &lt;?&lt;?php

【讨论】:

@Shamim 但禁用短打开标签时对整个脚本很重要 @Shamim Hafiz:这确实很重要,因为这可以决定是否执行。如果服务器禁用了short_open_tag,则不会执行。 这一切都取决于。尝试提供一个涵盖所有可用配置选项的答案。我认为这属于我自己的括号,因为&lt;?php 将始终有效,而&lt;? 可能不会。所以我认为这是一个不错的答案。 这是一个很好的答案。它似乎涵盖了所有 OP 代码可能失败的原因,并告诉他/她如何调试函数调用。如果函数调用最终返回NULL,那么他/她可能会离开并弄清楚为什么这可能是......在马克汤姆林的回答的帮助下,我敢肯定。 好的,非常感谢。作为新手,并且根据您的提示进行了更多研究,我使用的是雅虎帐户! Web 托管,他们表示将 allow_url_fopen 设置为“On”或更改 php.ini 文件中的任何其他项目都违反了他们的安全风险。所以...离开雅虎!并前往 Joomla 网络托管...感谢您的所有帮助。【参考方案2】:

如果 PHP 的 allow_url_fopen ini 指令设置为 true,并且如果 curl 也不起作用(有关如何使用它而不是 file_get_contents 的示例,请参阅 this answer),那么问题可能是你的服务器有防火墙阻止脚本获取任意 url 的内容(这可能允许恶意代码获取内容)。

我遇到了这个问题,发现我的解决方案是编辑防火墙设置以明确允许对相关域(或 IP 地址)的请求。

【讨论】:

【参考方案3】:

如果它是一个本地文件,你必须像这样将它包装在 htmlspecialchars 中:

    $myfile = htmlspecialchars(file_get_contents($file_name));

然后就可以了

【讨论】:

【参考方案4】:

将您的$adr 包裹在urlencode() 中。 我遇到了这个问题,这为我解决了。

【讨论】:

您可能需要谨慎使用这种方法,因为urlencode() 会使您的最终地址更长,并且可能超过file_get_contents() 允许的最大长度 @Hussam 我刚刚阅读了文档,这不是file_get_contents() 的限制。 php.net/manual/en/function.file-get-contents.php 只有当你在地址栏中输入浏览器时,但即使那样你也必须将 2kb 写入 4kb 才能打破这个最大值。【参考方案5】:
//JUST ADD urlencode();
$url = urlencode("http://maps.googleapis.com/maps/api/geocode/json?address=$adr&sensor=false");
<html>
<head>        
<title>Test File</title>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"> 
</script>
</head>
<body>
<?php    
$adr = 'Sydney+NSW';
echo $adr;
$url = "http://maps.googleapis.com/maps/api/geocode/json?address=$adr&sensor=false";
echo '<p>'.$url.'</p>';
echo file_get_contents($url);
print '<p>'.file_get_contents($url).'</p>';
$jsonData   = file_get_contents($url);
echo $jsonData;
?>
</body>
</html>

【讨论】:

多么可怕的代码! PHP 与 HTML 混合并打开 PHP 短标签。这将打破和混淆新人。是的,我知道这是从 2012 年开始的。【参考方案6】:

错误可能是您需要更改要访问的文件夹和文件的权限。如果喜欢 GoDaddy 服务,您可以访问该文件并更改权限或通过 ssh 使用如下命令:

sudo chmod 775 file.jpeg

如果上述问题不是你的情况,你可以访问。

【讨论】:

这很危险,你应该在大多数情况下只使用 775。 我已经改变了,我的意思是权限可能是问题

以上是关于为啥 file_get_contents 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ajax 时使用 php file_get_contents() 不起作用

PHP file_get_contents 在本地主机上不起作用

使用 readfile() 或 file_get_contents() 从相关文件夹中检索图像文件不起作用

为啥 preventDefault 不起作用?

为啥 innerHtml 不起作用

laravel 7工匠密钥:生成不起作用