PHP:“file_get_contents()”从经过内容验证的URL返回NULL

时间:2012-12-27 19:10:39

标签: php codeigniter httpresponse file-get-contents

我打赌它最终会变得简单......但是我可以用它来发现它。

问题:
当我尝试通过file_get_contents()获取特定本地URL的内容时,它会以空字符串''(长度= 0)返回。

我尝试了什么:

    $url = 'http://localhost/bbq/index.php/company/get/id/2131/return/json';
    $results = file_get_contents($url);
    echo'<pre>Results:<br />',var_export($results),'</pre>';

直接访问http://localhost/bbq/index.php/company/get/id/2131/return/json时,所有内容都很精彩:{"id":"2131","value":"Acme Anvil Corp."}

要检查自己,我尝试使用$url = 'http://www.google.com'按预期工作,然后我尝试了一个单独的本地uri,http://localhost/?phpinfo=1,而且也工作就好了。

问题:
我错过了什么?


[其他信息]
allow_url_fopen已开启

可能刚刚找到了的东西 作为CODEIGNITER项目中的安全措施,控制器脚本的第一行包含:

    if ( !defined('BASEPATH')) exit('No direct script access allowed');

评论它没有提供任何改进,但我认为值得一提。

此外,这是HTTP响应标头的转储。也许有人可以看到那里的东西。这对我来说似乎很直接,但我真的不知道我应该寻找什么。

array (size=13)
  0 => string 'HTTP/1.1 200 OK' (length=15)
  1 => string 'Date: Thu, 27 Dec 2012 19:58:47 GMT' (length=35)
  2 => string 'Server: Apache/2.4.2 (Win64) PHP/5.4.3' (length=38)
  3 => string 'X-Powered-By: PHP/5.4.3' (length=23)
  4 => string 'Set-Cookie: csrf_cookie_name=4ae46f9a7e612ae22a080a4e88bd349c; expires=Thu, 27-Dec-2012 21:58:47 GMT; path=/' (length=108)
  5 => string 'Set-Cookie: PHPSESSID=ah70p0ldl5qptcauei1t8ihud3; path=/' (length=56)
  6 => string 'Expires: Thu, 19 Nov 1981 08:52:00 GMT' (length=38)
  7 => string 'Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0' (length=77)
  8 => string 'Pragma: no-cache' (length=16)
  9 => string 'Refresh: 0;url=http://localhost/bbq/index.php/index.php/user/login' (length=66)
  10 => string 'Content-Length: 0' (length=17)
  11 => string 'Connection: close' (length=17)
  12 => string 'Content-Type: text/html' (length=23) 

[/ ADDITIONAL INFO]

BTW,我在跑:

  • Win7 64上的WAMPSERVER
  • Apache 2.4.2
  • PHP 5.4.3
  • CodeIgniter 2.1.2

3 个答案:

答案 0 :(得分:5)

立即开始调试:

# we want text output for debugging. Either this works or you need to look into
# source in your browser (or even better, debug with the `curl` commandline client.)
header('Content-Type: text/plain');

# For quick and dirty debugging - start to tell about if something is worth
# to warn or notice about. (do logging in production)
error_reporting(~0); ini_set('display_errors', 1);

$url = 'http://localhost/bbq/company/get/id/2131/return/json';
$results = file_get_contents($url);
var_dump($http_response_header, $results);

# hard exit, flush all (potential) buffers.
die();

由于var_dump,对文件的请求现在必须至少返回一些文本输出。您还可以在标题调用下方的开头添加一些标记输出,因此很明显该脚本已被调用并且确实已开始运行。

然而,更好的变体是使用步调试器并使用断点创建调试会话。我推荐Xdebug。

答案 1 :(得分:2)

我可以看到这是一篇旧文章,但今天我遇到了类似的问题,使用相对文件路径的file_get_contents(),返回一个空字符串。

我在所有文件上使用UTF-8编码,我发现忘记更改一个文件的编码(我无法通过file_get_contents()进行检索)。当我改变编码时,它“神奇地”起作用。

问题由ANSI编码文件中的非ANSI字符决定(例如:á,é,ű,ő)。

希望这有助于某人!

答案 2 :(得分:1)

检查是否已在php.ini中启用

ini_get('allow_url_fopen')