为啥 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>
如果所有这些都失败了,可能是由于使用了短的开放标签<?
。因此,此答案中的示例代码已更改为使用 <?php
以正常工作,因为无论设置了什么配置选项,这都保证在所有版本的 PHP 中都可以正常工作。要为您自己的脚本执行此操作,只需替换 <?
或 <?php
。
【讨论】:
@Shamim 但禁用短打开标签时对整个脚本很重要 @Shamim Hafiz:这确实很重要,因为这可以决定是否执行。如果服务器禁用了short_open_tag
,则不会执行。
这一切都取决于。尝试提供一个涵盖所有可用配置选项的答案。我认为这属于我自己的括号,因为<?php
将始终有效,而<?
可能不会。所以我认为这是一个不错的答案。
这是一个很好的答案。它似乎涵盖了所有 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 在本地主机上不起作用