2017/03/27

file_get_contents


今天公司一款项目在对接我们的SDK时发现,通知游戏发货返回 failed to open stream: HTTP request failed!,SDK这边使用的是 file_get_contents,于是网上找了下解决方法,都是在说修改 allow_url_fopen 参数,添加 user_agent 参数,或者换成curl方式。使用前面2种解决方案不行,换了curl可以了,但是究竟是为什么,我用了Fiddler抓包工具,发现游戏方那边返回数据时没有带入头文件信息,直接返回了一个字符串"SUCCESS",没有其他内容,抓包工具发出了警告,于是我就开始在本地尝试,发现果然是因为缺少header问题导致file_get_contents报错的。要求游戏方添加多一个HTTP/1.1 200 OK\r\n\r\n返回就OK了。


和 file() 一样,file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE。

file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。


allow_url_fopen

allow_url_fopen用法,在php.ini文件:

; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-fopen
allow_url_fopen = On

是否允许作为文件处理URL,默认是开启的,如果关闭后,file_get_contents 将会失效,返回错误信息,例如下面尝试获取百度首页的内容

PHP Warning:  file_get_contents(http://www.baidu.com): failed to open stream: no suitable wrapper could be found in ...

user_agent

user_agent用法,在php.ini文件:

; Define the User-Agent string. PHP's default setting for this is empty.
; http://php.net/user-agent
;user_agent="PHP"

当我们在服务器端使用PHP访问http时,默认带入的用户代理信息是为空的,如果设置了php.ini里面user_agent值,则将使用此参数作为代理信息。我们 还是使用 file_get_contents 来进行测试,创建一个index.php用于给予file_get_contents远程访问

<?php

// 输出访问者的代理信息
$ua = $_SERVER['HTTP_USER_AGENT'];
echo "I am remote server, you user agent value is:{$ua}\n";

接着使用 file_get_contents 访问输出内容

<?php

$url = "http://127.0.0.1:7002";
$ret = file_get_contents($url);

echo $ret;

输出内容为:I am remote server, you user agent value is:。代理信息为空,现在我们把php.ini的 ;user_agent="PHP" 分号去掉,然后 重启重新执行访问,输出结果为

I am remote server, you user agent value is:PHP

因为有些远程服务器是强制要求我们访问时要带入头文件信息,如果没有带入则会报failed to open stream: HTTP request failed!错误, 所以在遇到这种情况时我们也可以在使用 file_get_contents 之前使用 ini_set 修改代理信息进行处理,而不用直接修改 php.ini 文件

ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)');

自定义头文件参数

// 访问url
$url = "http://127.0.0.1:7801/";

// 自定义头信息
$header = "GET: HTTP/1.1\r\n";
$header .= "Accept-Encoding: gzip, deflate\r\n";
$header .= "Accept-Language: zh-cn\r\n";
$header .= "Host: 192.168.187.128:7801\r\n";
$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n";
$header .= "Connection: Keep-Alive\r\n";
$header .= "Authorization: Basic YWRtaW46MTIz\r\n";

// 组织参数
$opts = array(
    'http'=>array(
        'method'=>"GET", //get方式
        'header'=>$header, //头信息
        'timeout'=>2, //访问超时设置
    )
);
$context = stream_context_create($opts);

$ret = file_get_contents($url, 0, $context);