这也是个老生常谈的话题了,上午花了点时间把这个问题整理了一下。

一般来说用PHP来模拟post提交数据有三种方法,file_get_contents、curl和socket。

写了个公用函数,专门用来打印post数据:

  1. <?php
  2. function pr() {
  3. $params = func_get_args();
  4. foreach ($params as $key => $value) {
  5. echo "<pre>";
  6. print_r($value);
  7. echo "</pre>";
  8. }
  9. }

先写一个post.php,用来接收post数据并打印出来:

  1. <?php
  2. require dirname(__FILE__).'/function.php';
  3. if (isset($_POST) && !empty($_POST)) {
  4. pr($_POST);
  5. } else {
  6. pr("NO POST DATA!");
  7. }

下面是用file_get_contents来模拟post:

  1. <?php
  2. require dirname(__FILE__).'/function.php';
  3. function file_get_contents_post($url, $post) {
  4. $options = array(
  5. 'http' => array(
  6. 'method' => 'POST',
  7. // 'content' => 'name=caiknife&email=caiknife@gmail.com',
  8. 'content' => http_build_query($post),
  9. ),
  10. );
  11. $result = file_get_contents($url, false, stream_context_create($options));
  12. return $result;
  13. }
  14. $data = file_get_contents_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));
  15. var_dump($data);

很简单是吧?再来看看curl模拟post:

  1. <?php
  2. require dirname(__FILE__).'/function.php';
  3. function curl_post($url, $post) {
  4. $options = array(
  5. CURLOPT_RETURNTRANSFER => true,
  6. CURLOPT_HEADER         => false,
  7. CURLOPT_POST           => true,
  8. CURLOPT_POSTFIELDS     => $post,
  9.     CURLOPT_RETURNTRANSFER   =>1,//这个值不设置或者为0,那么你所访问的函数有返回值也不会接收(只返回true或者false),如果为1,成功了,就返回值,不成功返回false
  10. );
  11. $ch = curl_init($url);
  12. curl_setopt_array($ch, $options);
  13. $result = curl_exec($ch);
  14. curl_close($ch);
  15. return $result;
  16. }
  17. $data = curl_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));
  18. var_dump($data);

第二个curl实例(本人喜欢这个实例)

dump(ppost("http://localhost:8080/thinkox/index.php?s=/home/user/login",$shuzu));//这是调用语句$shuzu就是参数

function ppost($url,$arr){
$post_data = $arr;
$url=$url;
$o="";
foreach ($post_data as $k=>$v)
{
$o.= "$k=".urlencode($v)."&";
}
$post_data=substr($o,0,-1);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//这里也是那个是否接收返回值的设置
//为了支持cookie
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$result = curl_exec($ch);
return $result;
}

最后是用socket来模拟post:

  1. <?php
  2. require dirname(__FILE__).'/function.php';
  3. function socket_post($url, $post) {
  4. $urls = parse_url($url);
  5. if (!isset($urls['port'])) {
  6. $urls['port'] = 80;
  7. }
  8. $fp = fsockopen($urls['host'], $urls['port'], $errno, $errstr);
  9. if (!$fp) {
  10. echo "$errno, $errstr";
  11. exit();
  12. }
  13. $post = http_build_query($post);
  14. $length = strlen($post);
  15. $header = <<<HEADER
  16. POST {$urls['path']} HTTP/1.1
  17. Host: {$urls['host']}
  18. Content-Type: application/x-www-form-urlencoded
  19. Content-Length: {$length}
  20. Connection: close
  21. {$post}
  22. HEADER;
  23. fwrite($fp, $header);
  24. $result = '';
  25. while (!feof($fp)) {
  26. // receive the results of the request
  27. $result .= fread($fp, 512);
  28. }
  29. $result = explode("\r\n\r\n", $result, 2);
  30. return $result[1];
  31. }
  32. $data = socket_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));
  33. var_dump($data);

这三种方法最后看到的内容都是一样的,但是在是用socket的时候,发送header信息时必须要注意header的完整信息,比如content type和content length必须要有,connection: close和post数据之间要空一行,等等;而通过socket取得的内容是包含了header信息的,要处理一下才能获得真正的内容。

最新文章

  1. Qt qmake 使用(含遗留问题)
  2. 《C#本质论》读书笔记(14)支持标准查询操作符的集合接口
  3. BZOJ2584 : [Wc2012]memory
  4. 2016-03-24:Windows内存泄露分析工具
  5. BufferedInputSream和BufferedOutputSream,,,
  6. 用Python组合Celery Redis RabbitMQ进行分布式数据抓取
  7. 为什么数据科学家们选择了Python语言?
  8. (function(){}).call(window) 严格模式匿名函数的this指向undefined
  9. 如何完美打造Win8 Metro版IE10浏览器页面(转)
  10. Linux/CentOS下的CST和UTC时间的区别以及不一致的解决方法
  11. listView 单选实现
  12. Tomcat日志catalina.out文件过大的处理方法
  13. Android - 用Fragments实现动态UI
  14. Python基础入门教程(4)(数据类型)
  15. Leetcode_257_Binary Tree Paths
  16. 02-Java中的对象和类
  17. Centos系统下 Gitolite安装与相关配置(git权限控制软件)
  18. 软件工程_7th weeks
  19. js中的hasOwnProperty
  20. iOS原生和React-Native之间的交互2

热门文章

  1. HDU5126 stars(CDQ分治)
  2. 一句话解决Ping问题(主机,开发板,虚拟机)
  3. 不安装谷歌市场,下载谷歌市场中的APK
  4. textview-显示行数限制
  5. Python3的取余操作
  6. h5背景
  7. jmeter连接mysql数据库配置
  8. Codeforces Round #367 (Div. 2) (A,B,C,D,E)
  9. OVS中对于用户层和datapath层的多个通道利用epoll进行控制
  10. RMAN备份到NFS,报错 ORA-27054