PHP cURL 函数

cURL 是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议。

cURL 概述

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

cURL 是一个功能强大的库,支持多种协议,包括:

  • HTTP 和 HTTPS
  • FTP 和 FTPS
  • SCP 和 SFTP
  • Telnet
  • SMTP
  • 以及更多...

系统需求

为了使用PHP的cURL函数,你需要安装 libcurl 包。

检查cURL支持
// 检查cURL扩展是否可用
if (function_exists('curl_version')) {
    $curl_version = curl_version();
    echo "cURL 版本: " . $curl_version['version'];
} else {
    echo "cURL 扩展未安装";
}

安装说明

要使用PHP的cURL支持你必须在编译PHP时加上 --with-curl[=DIR] 选项,DIR为包含lib和include的目录路径。

在include目录中必须有一个名为curl,包含了easy.h和curl.h的文件夹。lib文件夹里应该有一个名为libcurl.a的文件。

不同系统的安装方法
Ubuntu/Debian:
sudo apt-get install php-curl
sudo service apache2 restart
CentOS/RHEL:
sudo yum install php-curl
sudo service httpd restart
Windows:

在php.ini文件中取消注释或添加:extension=curl

PHP cURL 函数列表

函数 描述 版本
curl_init() 初始化一个cURL会话。 PHP 4.0.2+
curl_setopt() 设置一个cURL传输选项。 PHP 4.0.2+
curl_setopt_array() 为cURL传输会话批量设置选项。 PHP 5.1.3+
curl_exec() 执行一个cURL会话。 PHP 4.0.2+
curl_getinfo() 获取一个cURL连接资源句柄的信息。 PHP 4.0.4+
curl_error() 返回最后一次的错误字符串。 PHP 4.0.3+
curl_errno() 返回最后一次的错误号。 PHP 4.0.3+
curl_close() 关闭一个cURL会话。 PHP 4.0.2+
curl_multi_init() 返回一个新cURL批处理句柄。 PHP 5+
curl_multi_add_handle() 向curl批处理会话中添加单独的curl句柄。 PHP 5+
curl_multi_exec() 运行当前 cURL 句柄的子连接。 PHP 5+
curl_multi_getcontent() 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流。 PHP 5+
curl_multi_info_read() 获取当前解析的cURL的相关传输信息。 PHP 5+
curl_multi_remove_handle() 移除curl批处理句柄资源中的某个句柄资源。 PHP 5+
curl_multi_close() 关闭一组cURL句柄。 PHP 5+
curl_multi_select() 等待所有cURL批处理中的活动连接。 PHP 5+
curl_multi_setopt() 为cURL批处理会话设置选项。 PHP 5.5+
curl_multi_strerror() 返回描述错误代码的字符串文本。 PHP 5.5+
curl_pause() 暂停及恢复连接。 PHP 5.5+
curl_reset() 重置一个cURL会话句柄的所有的选项。 PHP 5.5+
curl_escape() 使用 URL 编码给定的字符串。 PHP 5.5+
curl_unescape() 解码 URL 编码后的字符串。 PHP 5.5+
curl_strerror() 返回错误代码的字符串描述。 PHP 5.5+
curl_copy_handle() 复制一个cURL句柄和它的所有选项。 PHP 5+
curl_version() 获取cURL版本信息。 PHP 4.0.2+
curl_file_create() 创建一个 CURLFile 对象。 PHP 5.5+

基本使用示例

简单的GET请求
// 初始化cURL
$ch = curl_init();

// 设置选项
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);

// 执行请求
$response = curl_exec($ch);

// 检查错误
if (curl_errno($ch)) {
    echo 'cURL错误: ' . curl_error($ch);
}

// 获取请求信息
$info = curl_getinfo($ch);
echo 'HTTP状态码: ' . $info['http_code'];

// 关闭cURL
curl_close($ch);

// 输出响应
echo $response;
POST请求示例
$ch = curl_init();

$postData = array(
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'message' => 'Hello World'
);

curl_setopt_array($ch, array(
    CURLOPT_URL => 'https://api.example.com/submit',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $postData,
    CURLOPT_HTTPHEADER => array(
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer your_token_here'
    )
));

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo '错误: ' . curl_error($ch);
}

curl_close($ch);
并发请求(多cURL)
// 创建多cURL句柄
$mh = curl_multi_init();

$handles = [];
$urls = [
    'https://api.example.com/user/1',
    'https://api.example.com/user/2',
    'https://api.example.com/user/3'
];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
    ]);
    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
}

// 执行并发请求
$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

// 获取所有响应
$responses = [];
foreach ($handles as $ch) {
    $responses[] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

curl_multi_close($mh);

print_r($responses);
最佳实践
  • 总是检查cURL错误码和错误信息
  • 设置适当的超时时间(CURLOPT_TIMEOUT)
  • 对于HTTPS请求,验证SSL证书(CURLOPT_SSL_VERIFYPEER)
  • 使用curl_setopt_array()批量设置选项
  • 记得关闭cURL句柄释放资源
  • 对于大量请求,考虑使用多cURL提高效率