php-post模拟登录,同步登录(摘自网络)
这也是个老生常谈的话题了,上午花了点时间把这个问题整理了一下。
一般来说用PHP来模拟post提交数据有三种方法,file_get_contents、curl和socket。
写了个公用函数,专门用来打印post数据:
- <?php
- function pr() {
- $params = func_get_args();
- foreach ($params as $key => $value) {
- echo "<pre>";
- print_r($value);
- echo "</pre>";
- }
- }
先写一个post.php,用来接收post数据并打印出来:
- <?php
- require dirname(__FILE__).'/function.php';
- if (isset($_POST) && !empty($_POST)) {
- pr($_POST);
- } else {
- pr("NO POST DATA!");
- }
下面是用file_get_contents来模拟post:
- <?php
- require dirname(__FILE__).'/function.php';
- function file_get_contents_post($url, $post) {
- $options = array(
- 'http' => array(
- 'method' => 'POST',
- // 'content' => 'name=caiknife&email=caiknife@gmail.com',
- 'content' => http_build_query($post),
- ),
- );
- $result = file_get_contents($url, false, stream_context_create($options));
- return $result;
- }
- $data = file_get_contents_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));
- var_dump($data);
很简单是吧?再来看看curl模拟post:
- <?php
- require dirname(__FILE__).'/function.php';
- function curl_post($url, $post) {
- $options = array(
- CURLOPT_RETURNTRANSFER => true,
- CURLOPT_HEADER => false,
- CURLOPT_POST => true,
- CURLOPT_POSTFIELDS => $post,
- CURLOPT_RETURNTRANSFER =>1,//这个值不设置或者为0,那么你所访问的函数有返回值也不会接收(只返回true或者false),如果为1,成功了,就返回值,不成功返回false
- );
- $ch = curl_init($url);
- curl_setopt_array($ch, $options);
- $result = curl_exec($ch);
- curl_close($ch);
- return $result;
- }
- $data = curl_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));
- 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:
- <?php
- require dirname(__FILE__).'/function.php';
- function socket_post($url, $post) {
- $urls = parse_url($url);
- if (!isset($urls['port'])) {
- $urls['port'] = 80;
- }
- $fp = fsockopen($urls['host'], $urls['port'], $errno, $errstr);
- if (!$fp) {
- echo "$errno, $errstr";
- exit();
- }
- $post = http_build_query($post);
- $length = strlen($post);
- $header = <<<HEADER
- POST {$urls['path']} HTTP/1.1
- Host: {$urls['host']}
- Content-Type: application/x-www-form-urlencoded
- Content-Length: {$length}
- Connection: close
- {$post}
- HEADER;
- fwrite($fp, $header);
- $result = '';
- while (!feof($fp)) {
- // receive the results of the request
- $result .= fread($fp, 512);
- }
- $result = explode("\r\n\r\n", $result, 2);
- return $result[1];
- }
- $data = socket_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));
- var_dump($data);
这三种方法最后看到的内容都是一样的,但是在是用socket的时候,发送header信息时必须要注意header的完整信息,比如content type和content length必须要有,connection: close和post数据之间要空一行,等等;而通过socket取得的内容是包含了header信息的,要处理一下才能获得真正的内容。
php-post模拟登录,同步登录(摘自网络)的更多相关文章
- php单点登录之模拟淘宝天猫同步登录
说到单点登录大家都很了解,一个站点登录其他域会自动登录. 单点登录SSO(Single Sign On)的方法有很多,比如:p3p.共享session.共享cookice.第三方OAuth认证. 这里 ...
- Yii2 多域名跨域同步登录退出
在平台开发过程中,项目分为前台(frontend)www.xxx.com和后台(backend) yun.xxx.com两部分,绑定两个域名, 我们知道在没有绑定域名的时候前后台可以同步登录和退出,但 ...
- Java 模拟新浪登录 2016
想学习一下网络爬虫.涉及到模拟登录,查阅了一番资料以后发现大部分都有点过时了,就使用前辈们给的经验,Firefox抓包调试,採用httpclient模拟了一下新浪登录. 不正确之处多多包括.须要的能够 ...
- Android原生同步登录状态到H5网页避免二次登录
本文解决的问题是目前流行的 Android/IOS 原生应用内嵌 WebView 网页时,原生与H5页面登录状态的同步. 大多数混合开发应用的登录都是在原生页面中,这就牵扯到一个问题,如何把登录状态传 ...
- ucenter 整合同步登录的内部实现原理及thinkphp整合ucenter
1.用户登录discuz,通过logging.php文件中的函数uc_user_login对post过来的数据进行验证,也就是对username和password进行验证.2.如果验证成功,将调用位于 ...
- Yii中配置单点登录 即多个子站同步登录
研究Yii的同步登录大概2个多月,几乎查遍了网上所有资料和案例,但都不是很理想,最后摸索出整理出来以下配置方案. 以下配置文件在config.php中,所有需要同步的站点都需要填写.网上一些站点给出的 ...
- discuz 同步登录问题
最近一直在搞discuz论坛的二次开发,发现在论坛登录或退出的时候应用却没有同步登录或同步退出,这下子麻烦了,后来查看,原来没有产生js的同步代码,查找原因,发现$_G['setting']['all ...
- 【转】 Ucenter同步登录原理解析
应用中调用函数us_user_synlogin并输出 echo uc_user_synlogin($uid); 解析: 1. 该函数位于client.PHP中 2. 作用实质上是调用ucenter u ...
- HttpWebRequest模拟c#网站登录
用户名 密码 模拟登录asp.net开发的网站 关心两个问题:通过控件属性获取数据.响应事件. 上面是一个普通的asp.net表单.输入用户名.密码后,点击按钮将会进入各自绑定的后台函数,而不仅仅是 ...
随机推荐
- eclipse- MAT安装及使用
1.安装eclipse mat插件 1)查看当前eclipse版本 进入eclipse目录:右击eclipse图标,看到安装目录/home/zhangshuli/adt-bundle-linux-x8 ...
- 用硬件卡克隆Linux集群
650) this.width=650;" onclick="window.open("http://blog.51cto.com/viewpic.php?refimg= ...
- HDU 4631 Sad Love Story 平面内最近点对
http://acm.hdu.edu.cn/showproblem.php?pid=4631 题意: 在平面内依次加点,求每次加点后最近点对距离平方的和 因为是找平面最近点对...所以加点以后这个最短 ...
- php学习笔记5
PHP 常量 常量值被定义后,在脚本的其他任何地方都不能被改变. 一个常量由英文字母.下划线.和数字组成,但数字不能作为首字母出现. (常量名不需要加 $ 修饰符). 注意: 常量在整个脚本中都可以使 ...
- 【Uva 11080】Place the Guards
[Link]: [Description] 一些城市,之间有道路相连,现在要安放警卫,警卫能看守到当前点周围的边,一条边只能有一个警卫看守,问是否有方案,如果有最少放几个警卫. [Solution] ...
- Spring CORS
转载:Spring MVC 4.2 增加 CORS 支持 http://spring.io/blog/2015/06/08/cors-support-in-spring-framework http: ...
- ORA-01078错误举例:SID的大写和小写错误
案例重演: dbca建库.SID:metro --手工建库时实例名小写的metro ...... [oracle@org54 ~]$ export ORACLE_SID=METRO ...
- VUE笔记 - 品牌后台 - v-for Splice Some Filter findIndex indexOf 直接return函数结果
<body> <div id="app"> <div class="panel panel-primary"> <di ...
- 【2017中国大学生程序设计竞赛 - 网络选拔赛 hdu 6150】Vertex Cover
[链接]点击打开链接 [题意] 有人写了一个最小点覆盖的贪心算法,然后,让你去hack它. 并且,要求这个算法得到的错误答案,是正确答案的三倍. 让你任意输出hack数据,点数<=500 [题解 ...
- 【Educational Codeforces Round 31 A】Book Reading
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 水模拟 [代码] #include <bits/stdc++.h> using namespace std; const ...