PHP模拟发送POST请求之四、加强file_get_contents()发送POST请求

使用了笨重fsockopen()方法后,我们开始在PHP函数库里寻找更简单的方式来进行POST请求,这时,我们发现了PHP的文件函数也具有与远程URL交互的功能。

最简单的是fopen()和fread()函数。

$fp=fopen('http://localhost?query=query','r');

$content=fread($fp,1024);

echo $content;//输出HTML文档信息

fclose($fp);

然后是file_get_contents()函数:

$content=file_get_contents('http://localhost?query=query');

echo $content;//输出HTML文档信息

但是,我们会发现,通这两种方式我们只能通过GET方式发送信息并读取网页信息,而且,这两种方式还面临着超时,无法处理头信息等问题。

不过,我们仔细查看file_get_contents()的函数原型:

string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset [, int $maxlen ]]]] )

我们发现它还有其他可选参数,我们可以通过这些参数的设置,在发送网页请求的同时,POST出我们的数据,下面来解释各个参数的意义。

  • $filename:不用多说,填写我们要访问的URL字符串就行。
  • $use_include_path:是否使用文件之前include_path()设置的路径,如果使用,在文件地址找不到时,会自动去include_path()设置的路径去寻找,网页地址中我们设置为false。
  • $context:环境上下文,resource类型,由函数 stream_context_create() 返回的 context来设置,也是我们进行file_get_contents()函数扩展的重点,接下来再说。
  • $offset:读取的内容相对文件开始内容的偏移字节,我们读取网页内容,要保证HTML文档的完整性,所以可以设置为0或者不设置,默认为0。
  • $maxlen:顾名思义,是读取文件的最大字节数,同offset我们不设置,读取网页的全部内容。

通过file_get_contents发送POST请求的重点就在$context参数上面,我们用stream_context_create()函数设置上下文。

stream_context_create()创建的上下文选项即可用于流(stream),也可用于文件系统(file system)。对于像 file_get_contents()、file_put_contents()、readfile()直接使用文件名操作而没有文件句柄的函数来说更有用。stream_context_create()增加header头只是一部份功能,还可以定义代理、超时等。

我们来看stream_context_create()函数的原型:

resource stream_context_create ([ array $options [, array $params ]] )

我们看到,通过传入设置数组用此函数来获取一个资源类型的上下文选项。

$context = stream_context_create(array(                     //传入数组类型的$option参数

    'http' => array(                              //以HTTP请求为键的设置数组

        'method'  => 'POST',                         //设置请求方法为POST

        'header'  => "Content-type: application/x-www-form-urlencoded",//通过设置头文件来设置POST数据格式

        'content' => http_build_query($query_info),           //用http_build_query()方法将数组拼合成数据字符串

        'timeout' => 20                              //设置请求的超时时间。

    ) 

)); 

设置好上下文,我们通过file_get_contents()函数进行POST数据提交。

$results = file_get_contents('http://localhost', false, $context); 

下面是POST请求的完整示例: 

$info=['eat'=>'2kg','run'=>'10km'] ;

$url='http://localhost';

$context = stream_context_create(array(  

    'http' => array(  

        'method' => 'POST',  

        'header' => 'Content-type:application/x-www-form-urlencoded',
  
        'content' => html_build_query($info),  

        'timeout' => 20  

    )  

));  

$result = file_get_contents($url, false, $context);

如果您觉得本文对您有帮助,您可以推荐或关注我,另外,如果有什么问题,可以在下方留言讨论,谢谢。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java3y

看完这篇Linux基本的操作就会了

3076
来自专栏PPV课数据科学社区

大熊学python3爬虫–scrapy浅探(一)

? 在介绍scrapy之前,我觉得简单介绍下python的class很有必要。 class cainiao: def __init__(self,co...

31010
来自专栏运维小白

9.1 正则介绍_grep(上)

正则介绍 正则就是一串有规律的字符串 掌握好正则对编写shell脚本帮助交大 各种编程语言中都有正则,原理是一样的 grep/egrep、sed、awk gre...

1948
来自专栏xcywt

《程序员的自我修养》第二章学习笔记

第二章 编译和链接 2.1被隐藏了的过程 我们知道,一个程序由源代码到可执行文件往往由这几步构成: 预处理(Prepressing)-> 编译(Compilat...

1965
来自专栏我的技术专栏

Linux编译工具:gcc入门

1444
来自专栏编程思想之路

Android中资源各种引用方式?,@,@*等等

这几天做系统开发涉及到actionbar的style修改,要从framework层改,不知道?android:attr/是从哪儿引用的属性,给开发带来了很大的困...

1988
来自专栏锦小年的博客

python学习笔记9.2-文件及文件夹操作

本文主要介绍python对文件以及文件夹的操作,主要涉及到文件的创建、读取、文件内容的修改、删除,文件夹的索引、目录的判断等等。此节内容非常重要,是以后编程的基...

2116
来自专栏Python小屋

详解Python项目开发时自定义模块中对象的导入和使用

背景:1)任何一个Python程序文件既可以直接执行,也可以作为模块导入再使用其中的对象;2)对于大型系统开发,一般不会把所有代码放到单个文件中,而是根据功能将...

3845
来自专栏前端杂货铺

高吞吐koa日志中间件

Midlog中间件 node服务端开发中少不了日志打点,而在koa框架下的日志打点在多进程环境中日志信息往往无法对应上下文,而且在高并发下直接进行写buffer...

54310
来自专栏码匠的流水账

nginx proxy cache配置参数解读

本文主要解析一下nginx ngx_http_proxy_module中的cache相关配置参数。

1231

扫码关注云+社区