php模拟post传值在日常的工作中用到的不是很多,但是在某些特定的场合还是经常用到的。

下面,我整理了三种php模拟post传值的方法,file_get_contents、curl和socket。
 
第一种:file_get_contents来模拟post
 
  1. <?php
  2.  
  3. function file_get_contents_post($url, $post){
  4.  
  5. $options = array(
  6. 'http'=> array(
  7. 'method'=>'POST',
  8. 'content'=> http_build_query($post),
  9. ),
  10. );
  11.  
  12. $result = file_get_contents($url,false, stream_context_create($options));
  13. return $result;
  14.  
  15. }
  16.  
  17. $data = file_get_contents_post("http://www.a.com/post/post.php", array('name'=>'caiknife','email'=>'caiknife#gmail.com'));
  18. var_dump($data);
 
第二种:curl模拟post
 
  1. <?php
  2.  
  3. function curl_post($url, $post){
  4.  
  5. $options = array(
  6. CURLOPT_RETURNTRANSFER =>true,
  7. CURLOPT_HEADER =>false,
  8. CURLOPT_POST =>true,
  9. CURLOPT_POSTFIELDS => $post,
  10. );
  11.  
  12.  
  13. $ch = curl_init($url);
  14. curl_setopt_array($ch, $options);
  15. $result = curl_exec($ch);
  16. curl_close($ch);
  17. return $result;
  18. }
  19.  
  20. $data = curl_post("http://www.a.com/post/post.php", array('name'=>'caiknife','email'=>'caiknife#gmail.com'));
  21.  
  22. var_dump($data);
 
第三种:socket来模拟post
 
  1. <?php
  2.  
  3. function socket_post($url, $post){
  4. $urls = parse_url($url);
  5. if(!isset($urls['port'])){
  6. $urls['port']=80;
  7. }
  8.  
  9. $fp = fsockopen($urls['host'], $urls['port'], $errno, $errstr);
  10. if(!$fp){
  11. echo "$errno, $errstr";
  12. exit();
  13. }
  14.  
  15. $post = http_build_query($post);
  16. $length = strlen($post);
  17. $header =<<<HEADER
  18.  
  19. <span class="Apple-tab-span" style="white-space:pre"></span>POST {$urls['path']} HTTP/1.1
  20. <span class="Apple-tab-span" style="white-space:pre"></span>Host:{$urls['host']}
  21. <span class="Apple-tab-span" style="white-space:pre"></span>Content-Type: application/x-www-form-urlencoded
  22. <span class="Apple-tab-span" style="white-space:pre"></span>Content-Length:{$length}
  23. <span class="Apple-tab-span" style="white-space:pre"></span>Connection: close
  24. <span class="Apple-tab-span" style="white-space:pre"></span>{$post}
  25. <span class="Apple-tab-span" style="white-space:pre"></span>HEADER;
  26.  
  27. fwrite($fp, $header);
  28. $result ='';
  29. while(!feof($fp)){
  30. $result .= fread($fp,512);
  31. }
  32. $result = explode("\r\n\r\n", $result,2);
  33. return $result[1];
  34.  
  35. }
  36.  
  37. $data = socket_post("http://www.a.com/post/post.php", array('name'=>'caiknife','email'=>'caiknife#gmail.com'));
  38. var_dump($data);
 
上面这三种方法最后看到的内容都是一样的,都可以得到post的传值;但是在是用socket的时候,发送header信息时必须要注意header的完整信息,比如content type和content length必须要有,connection: close和post数据之间要空一行,等等;而通过socket取得的内容是包含了header信息的,要处理一下才能获得真正的内容。
 
http://www.shuchengxian.com/html/PHP/201512/23.html

三种方法教你如何用PHP模拟post提交数据的更多相关文章

  1. 三种方法教你HTML实现点击某一个元素之外触发事件

    HTML实现点击某一个元素之外触发事件 大致编写的HTML界面渲染后是这个样子的,我们现在想要实现的需求是点击Button所在的div不会触发事件,而在点击Button所在的div之外的区域时会触发事 ...

  2. 电视不支持AirPlay镜像怎么办?苹果iPhone手机投屏三种方法

    导读:苹果手机多屏互动功能在哪里?iPhone苹果手机没有AirPlay镜像怎么办?三种方法教你苹果iPhone手机怎么投影到智能电视上. 前言: 苹果iPhone手机投屏到电视设备上,需要使用到Ai ...

  3. ASP.NET MVC 中将数据从View传递到控制器中的三种方法(表单数据绑定)

    http://www.cnblogs.com/zyqgold/archive/2010/11/22/1884779.html 在ASP.NET MVC框架中,将视图中的数据传递到控制器中,主要通过发送 ...

  4. Javascript定义类(class)的三种方法

    将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...

  5. php生成随机数的三种方法

    php生成随机数的三种方法 如何用php生成1-10之间的不重复随机数? 例1,使用shuffle函数生成随机数. <?php$arr=range(1,10);shuffle($arr);for ...

  6. [转]Javascript定义类的三种方法

    作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html 将近2 ...

  7. Javascript 创建对象的三种方法及比较【转载+整理】

    https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...

  8. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  9. Iterator to list的三种方法

    目录 简介 使用while 使用ForEachRemaining 使用stream 总结 Iterator to list的三种方法 简介 集合的变量少不了使用Iterator,从集合Iterator ...

随机推荐

  1. hdu1561 树形dp,依赖背包

    多重背包是某个物品可以选择多次,要把对物品数的枚举放在对w枚举外面 分组背包是某组的物品只能选一个,要把对每组物品的枚举放在对w枚举内侧 依赖背包是多层的分组背包,利用树形结构建立依赖关系,每个结点都 ...

  2. vue组件库(四):组件功能模块划分

    涉及的平台 移动端 一.公共样式 常用变量 var.scss 颜色模块 主题色.状态色.文本色.灰度色(边框和分隔线) 字体 字体.大小.行间距 2.控件 3. 三大模块 样式.有哪些控件

  3. pika的阻塞式使用

    [root@cloudplatform ELK]# cat startIncHouTai.py import os # 杀掉内存中的进程 cmd='pgrep -f PutDataToKafkaInc ...

  4. Using jconsole to connect to JMX on AS7

    Using jconsole to connect to JMX on AS7 https://developer.jboss.org/wiki/UsingJconsoleToConnectToJMX ...

  5. Android开发之实现多次点击事件

    在Android中给我们提供了单次点击事件.但并没有给我们提供双击,或者实现在一定时间内的多次事件.所以需要我们自己在单机监听上进行修改实现. 有如下两种实现方式: 1.定义一个存贮上一个第一次点击的 ...

  6. la 4015

    题解: 烂大街的树形dp?? f[i][j]表示到i点,在i的子树中经过j个,且要返回i点的最小值 g[i][j]表示到i点,在i的子树中经过j个,且不用返回i点的最小值 然后转移做背包就可以了 (注 ...

  7. python常用内建模块--base64

    Base64是一种任意二进制到文本字符串的编码方法,常用于在URL.Cookie.网页中传输少量二进制数据. import base64 a = 'abcdef/+'b= base64.b64enco ...

  8. user-modify属性。

    user-modify属性,用来控制用户能否对页面文本进行编辑.与标签的contentEditable属性类似.· -webkit-user-modify: read-only | read-writ ...

  9. Repository HDU2846

    极限过的 最原始的方法一层一层建树就好了 #include<bits/stdc++.h> using namespace std; ][]={}; ]={}; ]; ; int pos; ...

  10. 038 关于HIVE的配置

    一:常用版本 1.版本 0.13.1 2014年 1.2.1   2015年 版本之间的区别:支持SQL不同,向关系型数据库靠拢. 目前看到的版本是2.3.2了. 2.官网 二:安装配置hive 1. ...