使用了笨重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' => http_build_query($info),  

        'timeout' => 20  

    )  

));  

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

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

PHP模拟发送POST请求之四、加强file_get_contents()发送POST请求的更多相关文章

  1. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  2. PHP为fopen,file_get_contents等函数请求web地址时增加Http头的方法

    我们在使用fsockopen时可以方便的自定义自己请求的http头内容来访问某些对客户端请求头有特殊限制的网站,但是使用fopen,file_get_contents等函数请求web地址时怎么来灵活定 ...

  3. PHP使用file_get_contents或curl请求https的域名内容为空或Http 505错误的问题排查方法

    前段日子,突然接到用户的反馈,说系统中原来的QQ登录.微博登录通通都不能用,跟踪代码进去后发现,是在 file_get_contents这个函数请求QQ登录的地方报错,在用该函数file_get_co ...

  4. axios 发送post请求的时候会发送两次

    第一次发送的时候会先发送OPTIONS, 第二次才发送POST, 解决方法: 引用qs模块 安装qs依赖 npm install qs --save 引入qs依赖 import qs from 'qs ...

  5. 转:PHP中的使用curl发送请求(GET请求和POST请求)

    原文地址:http://www.jb51.net/article/104974.htm 使用CURL发送请求的基本流程 使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤: 1.初始 ...

  6. nginx限制请求之四:目录进行IP限制

    相关文章: <高可用服务设计之二:Rate limiting 限流与降级> <nginx限制请求之一:(ngx_http_limit_conn_module)模块> <n ...

  7. scrapy框架post请求发送,五大核心组件,日志等级,请求传参

    一.post请求发送 - 问题:爬虫文件的代码中,我们从来没有手动的对start_urls列表中存储的起始url进行过请求的发送,但是起始url的确是进行了请求的发送,那这是如何实现的呢? - 解答: ...

  8. “ping”命令的原理就是向对方主机发送UDP数据包,HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”

    Socket  是一套建立在TCP/IP协议上的接口不是一个协议 应用层:  HTTP  FTP  SMTP  Web 传输层:  在两个应用程序之间提供了逻辑而不是物理的通信(TCP  UDP) T ...

  9. http协议客户端向服务器端请求时一般需要发送的内容

    out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式,文件路径, http协议版本(必写)请求头.... ou ...

随机推荐

  1. Android的init过程(二):初始化语言(init.rc)解析

    Android的init过程(一) 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 在上一篇文章中介绍了init的初始化第一阶段,也就是处理各种属性.在本文将会详细分析i ...

  2. IOS学习笔记之 Socket 编程

    最近开始静心学习IOS编程,虽然起步有点晚,但有句话说的好:“如果想去做,任何时候都不晚”.所以在今天,开始好好学习IOS.(本人之前4年都是搞.Net的,java也培训过一年) 打算学IOS,从哪入 ...

  3. Oracle级联查询

    在ORACLE 数据库中有一种方法可以实现级联查询   select  *                //要查询的字段 from table              //具有子接点ID与父接点I ...

  4. Java NIO服务器端开发

    一.NIO类库简介 1.缓冲区Buffer Buffer是一个对象,包含一些要写入和读出的数据. 在NIO中,所有的数据都是用缓冲区处理的,读取数据时,它是从通道(Channel)直接读到缓冲区中,在 ...

  5. SqlDataReader、SqlDataAdapter與SqlCommand的 区别

    1.SqlDataReader,在线应用,需要conn.open(),使用完之后要关闭. SqlConnection conn = new SqlConnection(connStr); //conn ...

  6. jQuery $.extend() 和 $.fn.extend() 用法

    http://blog.csdn.net/xuemoyao/article/details/19021659

  7. csharp: DataTable Rename ColumnName and remove Column

    enum ChangeNume { /// <summary> /// 简体 /// </summary> gbk=1, /// <summary> /// 英文 ...

  8. git 给远程库 添加多个url地址

     目录[-] 前提 使用流程 原理解析 注意 Other 参考文章 作者:shede333主页:http://my.oschina.net/shede333 && http://blo ...

  9. 【GOF23设计模式】模板方法模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...

  10. CentOS安装Erlang

    1.首先要安装编译源码用的编译器gcc&g++,安装方式很简单,先用yum search gcc搜索出包,然后选择适合自己的版本复制全名,用yum intall gcc_XXX来进行安装即可. ...