Skip to content

PHP cURL 扩展库

cURL 是一个通用的库,并非 PHP 独有。PHP cURL 扩展库 是一个封装的函数库。可以用来模拟浏览器和服务器进行交互,功能比较强大。

1. 建立 cURL 请求

<?php
// 1. 初始化
$ch = curl_init();
// 2. 设置选项,包括 URL
curl_setopt($ch, CURLOPT_URL, "http://www.163100.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 将 curl_exec() 获取的信息以文件流的形式返回,而不是直接输出
curl_setopt($ch, CURLOPT_HEADER, 1);         // 启动时会将头文件的信息作为数据流输出
curl_setopt($ch, CURLOPT_TIMEOUT, 60);       // 设置 cURL 允许执行的最长秒数
// 3. 执行并获取 HTML 文档内容
$output = curl_exec($ch);
if ($output === false) {
    echo 'cURL Error:' . curl_error($ch);
}
// 4. 释放 cURL 句柄
curl_close($ch);
echo $output; 

很多时候并不需要 header 头,把 CURLOPT_HEADER 设为 0 或者不设置(默认为 0)。

2. 获取请求相关的信息

通过 curl_getinfo() 函数可以返回 cURL 执行后这一请求相关的信息,如下所示:

<?php 
// ...
curl_exec($ch);
$info = curl_getinfo($ch);
echo '获取' . $info['url'] . '耗时' . $info['total_time'] . '秒';

// 返回 $info 数组如下
Array
(
    [url] => http://www.163100.com
    [content_type] => text/html; charset=UTF-8  // 内容编码
    [http_code] => 200
    [header_size] => 252                        // header 的大小
    [request_size] => 53                        // 请求的大小
    [filetime] => -1                            // 文件创建时间
    [ssl_verify_result] => 0                    // SSL 验证结果
    [redirect_count] => 0                       // 跳转次数
    [total_time] => 0.109                       // 耗时
    [namelookup_time] => 0                      // DNS 查询时间
    [connect_time] => 0.016                     // 连接时间
    [pretransfer_time] => 0.016                 // 准备传输耗时
    [size_upload] => 0                          // 上传数据大小
    [size_download] => 15903                    // 下载数据大小
    [speed_download] => 145899                  // 下载速度
    [speed_upload] => 0                         // 上传速度
    [download_content_length] => -1
    [upload_content_length] => 0
    [starttransfer_time] => 0.094               // 开始传输耗时
    [redirect_time] => 0                        // 重定向耗时
)

3. 在 cURL 中用 POST 方法发送数据

<?php
$url = "http://localhost/post.php";
$post_data = array(
    'foo'    =>  'bar',
    'query'  =>  'php',
    'action' => 'submit'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 设置为 POST
curl_setopt($ch, CURLOPT_POST, 1);
// 把 POST 的变量加上
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
$output = curl_exec($ch);
if ($output === false) {
    echo 'cURL Error:' . curl_error($ch);
}
curl_close($ch);
echo $output;

4. 使用 cURL 上传文件

上传文件和 POST 类似,只需要把文件路径当作一个 POST 变量传过去,不过记得在前面加上 @ 符号。

<?php
// ...
$post_data = array(
    'foo'    => 'bar',
    'upload' => '@test.zip'
);
// ....


参考资料

  1. Techniques for Mastering cURL

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*