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

一般来说用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信息的,要处理一下才能获得真正的内容。

php-post模拟登录,同步登录(摘自网络)的更多相关文章

  1. php单点登录之模拟淘宝天猫同步登录

    说到单点登录大家都很了解,一个站点登录其他域会自动登录. 单点登录SSO(Single Sign On)的方法有很多,比如:p3p.共享session.共享cookice.第三方OAuth认证. 这里 ...

  2. Yii2 多域名跨域同步登录退出

    在平台开发过程中,项目分为前台(frontend)www.xxx.com和后台(backend) yun.xxx.com两部分,绑定两个域名, 我们知道在没有绑定域名的时候前后台可以同步登录和退出,但 ...

  3. Java 模拟新浪登录 2016

    想学习一下网络爬虫.涉及到模拟登录,查阅了一番资料以后发现大部分都有点过时了,就使用前辈们给的经验,Firefox抓包调试,採用httpclient模拟了一下新浪登录. 不正确之处多多包括.须要的能够 ...

  4. Android原生同步登录状态到H5网页避免二次登录

    本文解决的问题是目前流行的 Android/IOS 原生应用内嵌 WebView 网页时,原生与H5页面登录状态的同步. 大多数混合开发应用的登录都是在原生页面中,这就牵扯到一个问题,如何把登录状态传 ...

  5. ucenter 整合同步登录的内部实现原理及thinkphp整合ucenter

    1.用户登录discuz,通过logging.php文件中的函数uc_user_login对post过来的数据进行验证,也就是对username和password进行验证.2.如果验证成功,将调用位于 ...

  6. Yii中配置单点登录 即多个子站同步登录

    研究Yii的同步登录大概2个多月,几乎查遍了网上所有资料和案例,但都不是很理想,最后摸索出整理出来以下配置方案. 以下配置文件在config.php中,所有需要同步的站点都需要填写.网上一些站点给出的 ...

  7. discuz 同步登录问题

    最近一直在搞discuz论坛的二次开发,发现在论坛登录或退出的时候应用却没有同步登录或同步退出,这下子麻烦了,后来查看,原来没有产生js的同步代码,查找原因,发现$_G['setting']['all ...

  8. 【转】 Ucenter同步登录原理解析

    应用中调用函数us_user_synlogin并输出 echo uc_user_synlogin($uid); 解析: 1. 该函数位于client.PHP中 2. 作用实质上是调用ucenter u ...

  9. HttpWebRequest模拟c#网站登录

     用户名 密码 模拟登录asp.net开发的网站 关心两个问题:通过控件属性获取数据.响应事件. 上面是一个普通的asp.net表单.输入用户名.密码后,点击按钮将会进入各自绑定的后台函数,而不仅仅是 ...

随机推荐

  1. CF1009F Dominant Indices(树上DSU/长链剖分)

    题目大意: 就是给你一棵以1为根的树,询问每一个节点的子树内节点数最多的深度(相对于这个子树根而言)若有多解,输出最小的. 解题思路: 这道题用树链剖分,两种思路: 1.树上DSU 首先想一下最暴力的 ...

  2. Bag of Features (BOF)图像检索算法

    1.首先.我们用surf算法生成图像库中每幅图的特征点及描写叙述符. 2.再用k-means算法对图像库中的特征点进行训练,生成类心. 3.生成每幅图像的BOF.详细方法为:推断图像的每一个特征点与哪 ...

  3. hdu5387 Clock

    Problem Description Give a time.(hh:mm:ss).you should answer the angle between any two of the minute ...

  4. oracle学习之路(二)------数组类型/记录类型的使用

    Oracle记录类型介绍 RECORD:用户自己定义数据类型,由单行多列的标量构成的复合数据类型.它将一个或多个标量封装成一个对象进行操作记录不能够总体拿来比較也不能够总体推断为空.能够总体拿来赋值. ...

  5. 24岁程序员, 一个人撑起App开发项目

    "疲惫吾心,怎样躲藏! 四处荒芜,怎话忧伤?"临近中秋,看到艾瑞斯的QQ签名,无尽的伤感.这个年仅24的青年.连续3年没有回家了,近期一个月总是失眠,没有家人的陪伴,就连女朋友都没 ...

  6. Kurento应用开发指南(以Kurento 5.0为模板) 之中的一个:简单介绍,安装与卸载

    文件夹 1. Kurento是什么               3 2. Kurento简单介绍                       3 2.1 WebRTC媒体server         ...

  7. 28. Spring Boot配置方式

    转自:https://blog.csdn.net/webzhuce/article/details/54564019

  8. spring-data-redis 使用

    以前使用过Jedis,后面因项目需要使用spring-data-redis,设置一个键值及其过期时间后怎么都不对. 源代码: redisTemplate.opsForValue().set(key, ...

  9. OpenAL音频播放

    // // OpenALPlayer.m // live // // Created by lujunjie on 2016/11/5. // Copyright © 2016年 lujunjie. ...

  10. Monkey (压力测试)-移动端手机压力测试工具 monkey以及monkeyrunner

    4. Monkey (压力测试) 这个是Android提供的系统工具.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行压力测试.Monkey测试是一种 ...