PHP使用CURL详解

curl概念

普通用户作为客户端,会通过各种请求获取服务器上的资源,比如:图片、样式,脚本,数据。

PHP里面有一个非常强大的函数库,它们的目的就是让你安全的从远程网站上取回内容。这些函数被称作CURL。现在,你不要被CURL官方页面上大量的东西吓阻,它实际上非常的简单

curl是客户端向服务器请求资源的工具

curl使用场景

  • 网页资源
    • 编写网页爬虫
  • WebService数据接口资源
    • 动态获取接口数据,比如天气、号码归属地
  • ftp
    • 下载ftp服务器里面的文件
  • 其他

使用curl发送请求的基本流程

// 1. 初始化、创建了一个curl会话资源,成功返回一个句柄
 $ch = curl_init();

 // 2. 设置选项,包括URL
 curl_setopt($ch,CURLOPT_URL,"http://www.devdo.net");  //设置URL
 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //这是设置是否将响应结果存入变量,1是存入,0是直接echo出
 curl_setopt($ch,CURLOPT_HEADER,0);

 // 3. 执行并获取HTML文档内容
 $output = curl_exec($ch);
 if($output === FALSE ){
    echo "CURL Error:".curl_error($ch);
 }

 // 4. 释放curl句柄
 curl_close($ch);

设置选项

通过curl_setopt方法来设置参数,很重要。但是内容比较多,多地让你看得想吐,还是根据需要熟能生巧吧。简单列几项:

选项 说明
CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;
CURLOPT_TIMEOUT 设置超时限制防止死循环
CURLOPT_POST 提交类型1为post,0为get
CURLOPT_POSTFIELDS post数组
CURLOPT_USERAGENT 用户代理
CURLOPT_URL 请求url
CURLOPT_CUSTOMREQUEST 请求类型
CURLOPT_HEADER 是否显示状态头

curl实例

一个GET请求

/**
 *@desc 封闭curl的调用接口,get的请求方式。
 */
function doCurlGetRequest($url,$data,$timeout = 5)
{
 if($curl == "" || $timeout <= 0){
        return false;
 }
    $url = $url.'?'.http_bulid_query($data);
    $con = curl_init((string)$url);
    curl_setopt($con, CURLOPT_HEADER, false);
    curl_setopt($con, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($con, CURLOPT_TIMEOUT, (int)$timeout);

    return curl_exec($con);
}

一个POST请求

/**
 * @desc 封装 curl 的调用接口,post的请求方式
 */
function doCurlPostRequest($url,$requestString,$timeout = 5)
{
 if($url == '' || $requestString == '' || $timeout <=0){
    return false;
 }
    $con = curl_init((string)$url);
    curl_setopt($con, CURLOPT_HEADER, false);
    curl_setopt($con, CURLOPT_POSTFIELDS, $requestString);
    curl_setopt($con, CURLOPT_POST,true);
    curl_setopt($con, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($con, CURLOPT_TIMEOUT,(int)$timeout);
    return curl_exec($con); 
}

几个demo

//模拟post 提交数据
//传递3个参数 如果是https 就需要将ssl 默认参数修改为 true
public static function Http_post($url,$data,$ssl=FALSE)
{
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    if($ssl)
    {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); //对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); //对证书中检查ssl加密算法是否存在
    }
    //curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //模拟用户使用的浏览器
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); //自动设置referer
    curl_setopt($curl, CURLOPT_POST, 1);       //发送一个常规的post 请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // post 提交的数据包
    curl_setopt($curl, CURLOPT_TIMEOUT, 30);  // 设置超时限制防止死循环
    curl_setopt($curl, CURLOPT_HEADER, 0);    //显示返回的header q区域内容
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  // 获取的信息以文件的形式返回
    $tmpInfo = curl_exec($curl); //执行操作
    if(curl_errno($curl)){
        return FALSE;
    }
    curl_close($curl); //关闭curl 会话
    return $tmpInfo; //返回数据
}

//模拟get 提交数据
//传递一个参数即可 $url 就是需要请求的url地址
public static function Http_get1($url)
{
    if (!function_exists('curl_init')) {
        die('curl 未开启');
    };
    $oCurl = curl_init();
    if (stripos($url, "https://") !== FALSE) {
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
    }
    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
    $sContent = curl_exec($oCurl);
    $aStatus = curl_getinfo($oCurl);
    curl_close($oCurl);
    if (intval($aStatus["http_code"]) == 200) {
        return $sContent;
    } else {
        return false;
    }
}

//模拟get 提交数据
//传递一个参数即可 $url 就是需要请求的url地址
public static function Http_get($url)
{
    $data = file_get_contents($url);
    return $data;
}

参考

https://www.cnblogs.com/manongxiaobing/p/4698990.html

Posted on Categories 开发 Tags