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

一般来说用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. 1.26 Python知识进阶 - 继承

    继承 继承(Inheritance)是面向对象的程序设计中代码重要的主要方法.继承是允许使用现有类的功能,并在无需重新改写原来的类的情况下,对这些功能进行扩展.继承可以避免代码复制和相关的代码维护等问 ...

  2. make 2>&1 | tee build.log

    make 2>&1 | tee build.log 保存编译log,方便问题查找

  3. Linux下常用的中文输入法平台有IBus、fcitx和scim

    Linux下常用的中文输入法平台有IBus.fcitx和scim.scim现在维护滞后,不推荐使用. IBus ("Intelligent Input Bus") 是一个 输入法框 ...

  4. html中的瀑布流是什么

    html中的瀑布流是什么 一.总结 1.瀑布流: 从左往右排列,哪一列现在的总高度最小,就优先排序把item(单元格)放在这一列.这样排完所有的单元格后,可以保证每一列的总高度都相差不大 2.看效果图 ...

  5. 支持10W高并发请求的IIS Web服务器常用设置

    支持高并发的IIS Web服务器常用设置   适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows ...

  6. 4. Vue-Resource / axios 异步插件

    安装 cnmp i vue-resource --save (--save 安装到dependencies下) 引用 <script src="node_modules/vue-res ...

  7. angular反向代理

    第一步:根目录新建 proxy.conf.json target:就是代理的服务器地址. 接口地址必须是http://localhost:8081/api开头 { "/api":{ ...

  8. GO语言学习(二十)Go 语言递归函数

    Go 语言递归函数 递归,就是在运行的过程中调用自己. 语法格式如下: func recursion() { recursion() /* 函数调用自身 */ } func main() { recu ...

  9. MyBatis学习总结(13)——Mybatis查询之resultMap和resultType区别

    MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性 ...

  10. 全然用linux工作,放弃windows

    按: 虽然我们已经不习惯看长篇大论, 但我还是要说, 这是一篇值得你从头读到尾的长篇文章. 2005年9月22日,清华在读博士生王垠在水木社区BLOG上发表了<清华梦的粉碎--写给清华大学的退学 ...