赶紧来复习一下PHP的curl用法吧

感觉很长时间没有用到PHP的curl了,代码什么的一概不记得了,这次碰巧看到一篇有关PHP curl用法的文章,就看了一下,总算有了点回忆,以下几段代码谨记!

1、判断url的有效行的函数,后面会用到

/**
 *检测curl是否出错
 * @param type $ch  curl对象
 */
function curl_check_error($ch) {
    curl_errno($ch) && exit(curl_error($ch));
}

2、curl模拟get请求

/**
 * curl get发起请求
 * @param string $url   请求的url地址
 * @param type $params  传递的参数列表
 * @return type         请求返回的数据
 */
function curl_get($url = '', $params = array()) {
    //请求url合法性检测
    curl_check($url);
    //参数合并
    if (is_array($params) && !empty($params)) {
        strpos($url, '?', strlen($url) - 1) || $url .= '?';
        foreach ($params as $key => $value) {
            $url .= $key . '=' . $value;
        }
    }
    //初始化curl
    $ch     = curl_init();
    //设置请求的url地址
    curl_setopt($ch, CURLOPT_URL, $url);
    //请求禁止header部分
    curl_setopt($ch, CURLOPT_HEADER, false);
    //请求数据不直接打印出来
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //请求执行处理
    $result = curl_exec($ch);
    //请求错误处理
    curl_check_error($ch);
    //请求关闭处理
    curl_close($ch);
    return $result;
}

3、curl模拟post请求

/**
 * curl post发起请求
 * @param string $url   请求的url地址  
 * @param type  $data   传递的参数列表
 * @param type $header  请求的头部信息
 * @return type         请求返回的数据
 */
function curl_post($url = '', $data = array(), $header = array()) {
    //请求url合法性检测
    curl_check($url);
    //组装参数
    if (is_array($data) && !empty($data)) {
        $url .= http_build_query($data);
    }
    //post请求头部信息合并
    $header = array_merge(
        array(
            'application/x-www-form-urlencoded;charset=utf-8',  
            'Content-length: ' . strlen($data)
        ), 
        $header);
    //请求初始化
    $ch     = curl_init();
    //设置请求的url地址
    curl_setopt($ch, CURLOPT_URL, $url);
    //请求禁止header部分
    curl_setopt($ch, CURLOPT_HEADER, 1);
    //请求的数据不直接输出
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //请求方式设置为post,不设置为get
    curl_setopt($ch, CURLOPT_POST, 1);
    //请求附加的post数据
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    //设置请求的头部信息
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    //请求开始执行
    $result = curl_exec($ch);
    //请求错误处理
    curl_check_error($ch);
    //请求关闭处理
    curl_close($ch);
    return $result;
}

4、来个模拟登陆的试试-登陆一般可都是post提交的

/**
 * curl登陆操作
 * @param type $login_url   登陆地址
 * @param type $data        登陆参数
 * @param type $index_url   成功地址
 * @return type
 */
function curl_login($login_url = '', $data = array(), $index_url = '') {
    curl_check($login_url);
    if (is_array($data) && !empty($data)) {
        $data = http_build_query($data);
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $login_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    date_default_timezone_set('PRC');
    curl_setopt($ch, CURLOPT_COOKIESESSION, true);
    curl_setopt($ch, CURLOPT_COOKIEFILE, 'curl_login_cookie_file');
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'curl_login_cookie_file');
    curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, 
        array(
            'application/x-www-form-urlencoded;charset=utf-8',
            'Content-length: ' . strlen($data)
        )
    );
    curl_exec($ch);
    curl_check_error($ch);
    if (!empty($index_url)) {
        curl_check($index_url);
        curl_setopt($ch, CURLOPT_URL, $index_url);
        curl_setopt($ch, CURLOPT_POST, false);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:text/html'));
        $result = curl_exec($ch);
        curl_check_error($ch);
        curl_close($ch);
        return $result;
    } else {
        curl_close($ch);
    }
}

5、试试模拟ftp下载文件吧

/**
 * curl ftp下载文件
 * @param type $server_url  服务器地址+下载的文件名 [ftp://115.28.104.241/php_curl_ftp_download.md]
 * @param type $save_file   本地保存的文件路径
 * @param type $data        数据 一般是用户名和密码
 * @param type $timeout     超时时间
 * @return boolean
 */
function curl_ftp_download($server_url, $save_file, $data, $timeout = 300) {
    curl_check($server_url);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $server_url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_USERPWD, join(':', $data));
    if (empty($save_file)) {
        exit('保存文件的路径无效');
    }
    $fp = fopen($save_file, 'wb');
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_exec($ch);
    fclose($fp);
    curl_check_error($ch);
    return true;
}

6、再试试模拟ftp上传文件呵

/**
 * curl ftp上传文件
 * @param type $server_url  服务器地址+保存的文件名 [ftp://115.28.104.241/php_curl_ftp_upload.md]
 * @param type $upload_file   本地保存的文件路径
 * @param type $data        数据 一般是用户名和密码
 * @param type $timeout     超时时间
 * @return boolean
 */
function curl_ftp_upload($server_url, $upload_file, $data, $timeout = 300) {
    curl_check($server_url);
    file_exists($upload_file) || exit('上传文件不存在...');
    $fp = fopen($upload_file, 'r');
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $server_url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_USERPWD, join(':', $data));
    curl_setopt($ch, CURLOPT_UPLOAD, 1);
    curl_setopt($ch, CURLOPT_INFILE, $fp);
    curl_setopt($ch, CURLOPT_INFILESIZE, filesize($upload_file));
    curl_exec($ch);
    curl_check_error($ch);
    return true;
}

7、最后就是尝试一下模拟https的请求了

/**
 * https方式请求资源
 * @param type $https_url   https协议的url
 * @return type
 */
function curl_https_request($https_url = '') {
    curl_check($https_url);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $https_url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //https加密访问的时候需要核对证书的有效性,这里要设置一下时区
    date_default_timezone_set('PRC');
    //服务器不去验证
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    curl_check_error($ch);
    return $result;
}

好了,上面这七段代码敲完了,期间还是得不断去查手册资料什么的才能写清楚,不过写完了似乎印象就更深刻了,以后记不住了也方便来看看哈!

友荐云推荐