PHP中使用cURL实现Get和Post请求的方法

一、curl是什么

  PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。

  libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证

二、curl命令行执行

  1、Get方法请求 curl protocol://address:port/url?args

  例如:curl http://www.baidu.com

  2、Post方法请求 curl -d "args" "protocol://address:port/url"

  例如:curl -d "user=root&passwd=12345678" "http://baidu.com"

三、curl模拟浏览器执行

function curlRequest($url, $data = null, $headers=null, $connect_timeout = 1000, $read_timeout = 2000)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    if ($headers) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);//设置请求头
    }
    if ($data !== null) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    if (defined('CURLOPT_CONNECTTIMEOUT_MS')) {
        $options[CURLOPT_CONNECTTIMEOUT_MS] = $connect_timeout;
        $options[CURLOPT_TIMEOUT_MS]        = $connect_timeout + $read_timeout;
    } else {
        $options[CURLOPT_CONNECTTIMEOUT] = ceil($connect_timeout / 1000);
        $options[CURLOPT_TIMEOUT]        = ceil(($connect_timeout + $read_timeout) / 1000);
    }

    $content = curl_exec($ch);
    if (false === $content) {
        return false;
    }
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($http_code !== 200) {
        return false;
    }
    return $content;

四、curl下载图片

function downloadImage($thumb)
{
    $img_type = strrchr($thumb, '.');
    $fileName = uniqid() . rand(1000, 9999);
    $dir = ROOT_PATH . 'images/temp/' . date('Ymd') . '/';
    $dir1 = '/images/temp/' . date('Ymd') . '/';
    if (!is_dir($dir)) {
        mkdir($dir, 0700, true);
    }
    $new_file = $dir . $fileName . $img_type;
    $resource = fopen($new_file, 'wb');

    $ch = curl_init(); //初始化一个curl句柄
    curl_setopt($ch, CURLOPT_URL, $thumb); //需要获取的 URL 地址
    curl_setopt($ch, CURLOPT_FILE, $resource); //设置成资源流的形式
    curl_setopt($ch, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
    //curl_setopt($ch,CURLOPT_RETURNTRANSFER,false);//以数据流的方式返回数据,false时直接显示
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置超时时间
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_exec($ch); //执行curl
    curl_close($ch); //关闭curl会话
    fclose($resource); //关闭句柄
    if (!file_exists($new_file) || filesize($new_file) == 0)
        return false;
    return $dir1 . $fileName . $img_type;
}