zoukankan      html  css  js  c++  java
  • 使用PHP CURL的POST数据

    curl 是使用URL语法的传送文件工具,支持FTP、FTPS、HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP。curl 支持SSL证书、HTTP POST、HTTP PUT 、FTP 上传,kerberos、基于HTT格式的上传、代理、cookie、用户+口令证明、文件传送恢复、http代理通道和大量其他有用的技巧。

    原来php默认并不进行此项功能的扩展,但还是有的,只是没有让它生效罢了。打开PHP安装目录,搜索以下三个文件 ssleay32.dll、libeay32.dll和 php_curl.dll,一一拷贝到系统目录下的system32文件夹下,修改php.ini文件,找到;extension= php_curl.dll行,去掉前面的;号,保存,重启服务器。

    下面举几个例子。

    短彩信发送

    01 $xml_data = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    02 <TaskDataTransfer4EReq xmlns="http://www.aspirehld.com/iecp/TaskDataTransfer4EReq">
    03 <eid> </eid>
    04 <username> </username>
    05 <password> </password>
    06 <src> </src>
    07 <destmsisdn>'.$pns.'</destmsisdn>
    08 <content type="sms">
    09     <title>'.$content.'</title>
    10 </content>
    11 </TaskDataTransfer4EReq>';
    12  
    13 $url = 'http://www.nowamagic.net/service/taskSubmit';//接收XML地址
    14  
    15 $header = "Content-type: text/xml";//定义content-type为xml
    16 $ch = curl_init(); //初始化curl
    17 curl_setopt($ch, CURLOPT_URL, $url);//设置链接
    18 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息
    19 curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置HTTP头
    20 curl_setopt($ch, CURLOPT_POST, 1);//设置为POST方式
    21 curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);//POST数据
    22 $response = curl_exec($ch);//接收返回信息
    23 if(curl_errno($ch)){//出错则显示错误信息
    24     print curl_error($ch);
    25 }
    26 curl_close($ch); //关闭curl链接
    27 echo $response;//显示返回信息

    POST数据飞信接口

    01 $username = 13800138000;
    02 $password = 123456;
    03 $sendto = 13912345678;
    04 $message = "测试一个试试看!";
    05  
    06 $curlPost = 'username='.urlencode($username).'&
    07 password='.urlencode($password).'&
    08 sendto='.urlencode($sendto).'&
    09 message='.urlencode($message).'';
    10  
    11 $ch = curl_init();//初始化curl
    12 curl_setopt($ch,CURLOPT_URL,'http://sms.api.bz/fetion.php');//抓取指定网页
    13 curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
    14 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
    15 curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
    16 curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
    17 $data = curl_exec($ch);//运行curl
    18 curl_close($ch);
    19 print_r($data);//输出结果

    飞信接口模式:http://sms.api.bz/fetion.php?username=您的移动飞信登录手机号,&password=您的移动飞信登录密码,&sendto=接收短信的飞信好友手机号,&message=短信内容。

    总结一下使用curl方法:

    1. 初始化curl
    2. 使用curl_setopt设置目标url,和其他选项
    3. curl_exec,执行curl
    4. 执行后,关闭curl
    5. 最后一步就是输出

    CERL 多线程

    curl一般用来抓取网页,第二种就是get或者post数据,第三种应用就是实现PHP的多线程任务。下面来实现多线程的:

    01 <?php
    02 /*
    03 curl 多线程抓取
    04 */
    05  
    06  /**
    07      * curl 多线程
    08      
    09      * @param array $array 并行网址
    10      * @param int $timeout 超时时间
    11      * @return array
    12      */
    13  function Curl_http($array,$timeout){
    14     $res = array();
    15     $mh = curl_multi_init();//创建多个curl语柄
    16     $startime = getmicrotime();
    17     foreach($array as $k=>$url){
    18         $conn[$k]=curl_init($url);
    19          
    20         curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout);//设置超时时间
    21         curl_setopt($conn[$k], CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    22         curl_setopt($conn[$k], CURLOPT_MAXREDIRS, 7);//HTTp定向级别
    23         curl_setopt($conn[$k], CURLOPT_HEADER, 0);//这里不要header,加块效率
    24         curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
    25         curl_setopt($conn[$k],CURLOPT_RETURNTRANSFER,1);
    26         curl_multi_add_handle ($mh,$conn[$k]);
    27     }
    28      //防止死循环耗死cpu 这段是根据网上的写法
    29         do {
    30             $mrc = curl_multi_exec($mh,$active);//当无数据,active=true
    31         } while ($mrc == CURLM_CALL_MULTI_PERFORM);//当正在接受数据时
    32         while ($active and $mrc == CURLM_OK) {//当无数据时或请求暂停时,active=true
    33             if (curl_multi_select($mh) != -1) {
    34                 do {
    35                     $mrc = curl_multi_exec($mh, $active);
    36                 } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    37             }
    38         }
    39      
    40     foreach ($array as $k => $url) {
    41           curl_error($conn[$k]);
    42           $res[$k]=curl_multi_getcontent($conn[$k]);//获得返回信息
    43           $header[$k]=curl_getinfo($conn[$k]);//返回头信息
    44           curl_close($conn[$k]);//关闭语柄
    45           curl_multi_remove_handle($mh  , $conn[$k]);   //释放资源 
    46         }
    47          
    48         curl_multi_close($mh);
    49         $endtime = getmicrotime();
    50         $diff_time = $endtime - $startime;
    51          
    52         return array('diff_time'=>$diff_time,
    53                      'return'=>$res,
    54                     'header'=>$header       
    55                     );
    56      
    57  }
    58  //计算当前时间
    59  function getmicrotime() {
    60         list($usec, $sec) = explode(" ",microtime());
    61         return ((float)$usec + (float)$sec);
    62     }
    63      
    64     //测试一下,curl 三个网址
    65     $array = array(
    66                 "http://www.weibo.com/",
    67                 "http://www.renren.com/",
    68                 "http://www.qq.com/"
    69                 );
    70  
    71     $data = Curl_http($array,'10');//调用
    72     var_dump($data);//输出
    73       
    74 ?>

    因为$active要等全部url数据接受完毕才变成false,所以这里用到了curl_multi_exec的返回值判断是否还有数据,当有数据的时候就不停调用curl_multi_exec,暂时没有数据就进入select阶段,新数据一来就可以被唤醒继续执行。这里的好处就是CPU的无谓消耗没有了。

    这个多线程的写法步骤:

    1. 调用curl_multi_init
    2. 循环调用curl_multi_add_handle,这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
    3. 持续调用curl_multi_exec
    4. 根据需要循环调用curl_multi_getcontent获取结果
    5. 调用curl_multi_remove_handle,并为每个字handle调用curl_close
    6. 调用curl_multi_close

    本文地址:http://www.nowamagic.net/librarys/veda/detail/124,欢迎访问原出处。

  • 相关阅读:
    hdu 6702 ^&^ 位运算
    hdu 6709 Fishing Master 贪心
    hdu 6704 K-th occurrence 二分 ST表 后缀数组 主席树
    hdu 1423 Greatest Common Increasing Subsequence 最长公共上升子序列 LCIS
    hdu 5909 Tree Cutting FWT
    luogu P1588 丢失的牛 宽搜
    luogu P1003 铺地毯
    luogu P1104 生日
    luogu P1094 纪念品分组
    luogu P1093 奖学金
  • 原文地址:https://www.cnblogs.com/zsmynl/p/3539160.html
Copyright © 2011-2022 走看看