今天公司一款项目在对接我们的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);