在工作过程中,有一次用到file_get_contents函数来获取微信用户的openid,如下图所示。
然后同事提醒需要设置超时时间,就网上查了下相关资料,总结如下:
从php5开始,file_get_contents已经支持context了,也就是说,从php5开始,file_get_contents其实也可以用来POST传递数据了。
通常,file_get_contents是用于将文件的内容读入到一个字符串的首选方法,如果操作系统支持,还会使用内存映射技术来增强性能。
file_get_contents支持四个参数filename、include_path、context、start、max_length,我们最常用到的就是filename了,表示要读取的文件,是必需参数,include_path可选参数,如果想在include_path中搜寻文件的话,设置为1,否则,设置为false,context可选,规定文件句柄的环境,context是一套可以修改流的行为的选项,使用null则表示忽略,start可选,用于规定在文件中开始读取的位置,max_length可选,规定读取的字节数。
File_get_contents可安全用于二进制对象。
在跨服务器提交的时候,不可避免的会遇到超时的情况,使用set_time_limt设置php的超时时间是没用的,只有用context中的timeout时间来控制,在这里,我们不是在抑制连接超时,而是要管理。
比如在超时返回错误后,进行一次尝试,就象js中的settimeout那样,对函数进行重新处理。错误超过3次或者5次后,我们认为无法连接服务器而彻底放弃连接。这种思想,不仅仅是file_get_contents,只要支持context的都应该加上,避免超时浪费时间,这样可以被支持的函数在致有fsocketopen(该函数的最后一个参数,该连接时限仅在套接字连接的时候生效。如果要对建立在套接字基础上的读写操作时间设置连接时限,比较推荐在读取stream的时候,使用stream_time_out函数进行控制)、fopen、file、curl(curl有自己的变量CURLOPT_TIMEOUT)等。
改写后的获取:
考虑到有时候连接失败是因为网络待因素造成的,没有比较好的解决办法,但是可以修改程序,失败时重试几次,仍然失败就放弃。
以上是针对get方法的file_get_contents设置超时时间,那么post方法呢?
网上查了下资料,有人给出了山寨版的post传值函数,如下: