一、PHP中 file_get_contents 也可以post、也可以进行超时设置
PHP中 file_get_contents 也可以post、也可以进行超时设置。file_get_contents如果只是简单用来取过本地某个文件或者远程网页、文件的话,给人的印象就是一个只能读取固定网页、文件内容的函数,但实际它的功能远不止这么点。看手册上的介绍:
string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset [, int $maxlen ]]]] )
和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE。 借助第三个参数我们可以使用如下的方法:
$context = stream_context_create(array(
'http' => array(
'method' =>'GET',
'ignore_errors' => true,
),
));
$response=file_get_contents($url, TRUE, $context);
return $response;
上面这段代码是使用GET方式获取一个url,看到method的值可以指定,我们能想到file_get_contents也能进行post提交。下面就示例一个使用file_get_contents进行post提交的示例。
$context = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' =>
"Content-type: application/x-www-form-urlencoded\r\n" .
"Content-length: $content_length\r\n",
'content' => $content
),
));
$response=file_get_contents($url, TRUE, $context);
return $response;
我在给国外一个平台做接口开发时,使用的就是file_get_contents方法,在远程获取的过程中肯定会碰到接口执行时间过长的问题,所以对于这样的应用我们非常有必要进行超时判断,以免进入死循环,在file_get_contents中我们也一样可以设置超时,对获取这个超时状态:
$context = stream_context_create(array(
'http' => array(
'method' => $post?'POST':'GET',
'ignore_errors' => true,
'timeout' => 15
),
));
$response=@file_get_contents($url, TRUE, $context);
if($response===FALSE)
{
exit("接口执行超时:{$url}");
}
return $response;
上面的示例中,我们添加了timeout参数,表示15秒后即直接返回失败false,通过对file_get_contents抑制报错,我们可以让file_get_contents在处理超过15秒以失败处理,即此时返回false,然后对结果进行判断,以确定是否执行超时。
除此之外,file_get_contents的第四五个参数还能直接对所获取的字符串进行截取处理,就省得获取数据之后还需要再进行字符串截取操作了。
二、php进行post数据传输超过1000个被截取及windows下doc命令窗口全屏
今天在进行一个表单提交的时候,因为涉及到范围选择,全选之后总出现选择的项目出现丢失,真是诡异,进行BUG排查的时候发现向服务端post数据时出现了丢失,一个post了几千的变量的请求到服务端之后只有1000个。原来此和php.ini配置中的max_input_vars参数有关。此项默认值是1000,表单字段数量超过1000时就是这种情况。我这里用的是php7.1版本,max_input_vars配置是在php 5.3.9之后才有的参数,在这之前的PHP版本是不存在这个问题的。解决的办法如下:
非docker部署时修改php.ini
max_input_vars 1000
docker部署的话进入php-fpm.d,修改www.conf配置添加
php_admin_value[max_input_vars] = 10000
在windows下面,使用doc命令窗口时好无语,因为窗口太小,而且最大化之后仍然不能全屏,只能占半屏,不知道是怎么想的。但这个并不是不能全屏的,这么多年今天才知道doc命令窗口能全屏。。,方法就是在打开的cmd窗口中执行wmic命令,此时就可以点击全屏放大窗口了,不过这还没有完,在窗口放大之后,还需要输入quit命令退出wmic,然后就可以正常执行dos命令了。