PHP cURL 函数初学者完全指南
文章精选推荐
1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器
7 Cursor 设备ID修改器,你的Cursor又可以继续试用了
文章正文
PHP cURL 函数初学者完全指南
cURL 是 PHP 中一个强大的库,用于通过 URL 执行 HTTP 请求。它支持 GET、POST 等请求方式,并能处理复杂的网络操作,比如上传文件、设置 HTTP 头、处理重定向、SSL 认证等。
1. 什么是 cURL?
cURL(Client URL)是一种命令行工具和库,用于与服务器进行数据传输。PHP 提供了内置的 cURL 扩展,通过它可以使用 PHP 编程实现与 API、网页等的交互。
基本用途:
- 获取网页内容
- 提交表单数据
- 调用 RESTful API
- 下载/上传文件
2. 启用 cURL
在大多数现代 PHP 环境中,cURL 默认启用。如果未启用,可以通过以下步骤开启:
检查 cURL 是否启用
<?php
phpinfo();
?>
在页面中查找 cURL
,如果找到,说明已启用;如果没有,按以下步骤启用。
启用步骤
- 打开 PHP 配置文件
php.ini
。 - 确保以下行未被注释:
extension=curl
- 重启 Web 服务器(如 Apache 或 Nginx)。
3. cURL 基本操作
cURL 的核心函数
PHP 中使用 cURL 需要以下几个核心函数:
curl_init()
:初始化一个 cURL 会话。curl_setopt()
:设置 cURL 请求的选项(如 URL、请求方法、头部等)。curl_exec()
:执行 cURL 请求并获取响应。curl_close()
:关闭 cURL 会话释放资源。
简单的 GET 请求
以下是通过 cURL 获取网页内容的示例:
<?php
// 初始化 cURL
$ch = curl_init();
// 设置 URL
curl_setopt($ch, CURLOPT_URL, "https://www.example.com");
// 将结果以字符串返回,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 执行请求
$response = curl_exec($ch);
// 检查是否有错误
if (curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch);
} else {
echo $response;
}
// 关闭 cURL 会话
curl_close($ch);
?>
说明:
CURLOPT_RETURNTRANSFER
:设置为true
,表示将响应存储在变量$response
中,而不是直接输出。
4. 常见 cURL 选项
基础选项
选项 | 描述 |
---|---|
CURLOPT_URL | 设置目标 URL。 |
CURLOPT_RETURNTRANSFER | 如果为 true ,将响应以字符串形式返回。 |
CURLOPT_TIMEOUT | 设置超时时间(秒)。 |
CURLOPT_USERAGENT | 设置 User-Agent 请求头。 |
CURLOPT_FOLLOWLOCATION | 如果为 true ,跟随服务器重定向。 |
CURLOPT_HTTPHEADER | 设置自定义 HTTP 请求头。 |
POST 请求
要发送 POST 请求,需要设置 CURLOPT_POST
和 CURLOPT_POSTFIELDS
。
<?php
// 初始化 cURL
$ch = curl_init();
// 设置 URL
curl_setopt($ch, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts");
// 设置 POST 方法
curl_setopt($ch, CURLOPT_POST, true);
// 设置 POST 数据
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'title' => 'foo',
'body' => 'bar',
'userId' => 1,
]);
// 返回响应
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 执行请求
$response = curl_exec($ch);
// 检查错误
if (curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch);
} else {
echo $response;
}
// 关闭 cURL
curl_close($ch);
?>
添加自定义 Header
可以通过 CURLOPT_HTTPHEADER
添加自定义的 HTTP 头部。
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 设置自定义 Header
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer YOUR_ACCESS_TOKEN'
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
?>
上传文件
上传文件时,使用 CURLOPT_POSTFIELDS
,同时借助 PHP 的 CURLFile
类。
<?php
$ch = curl_init();
// 设置 URL
curl_setopt($ch, CURLOPT_URL, "https://example.com/upload");
// 设置 POST 请求
curl_setopt($ch, CURLOPT_POST, true);
// 设置上传文件
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'file' => new CURLFile('/path/to/file.jpg', 'image/jpeg', 'file.jpg')
]);
// 返回响应
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 执行请求
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
?>
5. 处理 HTTPS 请求
如果目标 URL 是 HTTPS,可能需要额外的配置来处理 SSL 证书验证。
忽略 SSL 验证
虽然不推荐,但可以通过以下选项忽略 SSL 验证:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
指定证书文件
curl_setopt($ch, CURLOPT_CAINFO, "/path/to/cacert.pem");
6. cURL 进阶功能
重定向处理
如果服务器返回 301 或 302 重定向,可以设置 CURLOPT_FOLLOWLOCATION
:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
保存 Cookie
可以保存和加载服务器返回的 Cookie:
// 保存 Cookie 到文件
curl_setopt($ch, CURLOPT_COOKIEJAR, "/path/to/cookie.txt");
// 使用保存的 Cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, "/path/to/cookie.txt");
获取详细信息
通过 curl_getinfo()
获取请求的详细信息:
$info = curl_getinfo($ch);
print_r($info);
7. cURL 错误处理
通过 curl_errno()
和 curl_error()
获取错误信息:
if (curl_errno($ch)) {
echo "Error: " . curl_error($ch);
}
8. cURL 多线程并发请求(multi_curl)
cURL 支持同时发起多个请求,通过 curl_multi_init()
来实现。
<?php
// 初始化多个 cURL 会话
$urls = [
"https://jsonplaceholder.typicode.com/posts/1",
"https://jsonplaceholder.typicode.com/posts/2"
];
$multiCurl = curl_multi_init();
$handles = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$handles[] = $ch;
curl_multi_add_handle($multiCurl, $ch);
}
// 执行并发请求
do {
$status = curl_multi_exec($multiCurl, $active);
curl_multi_select($multiCurl);
} while ($active && $status == CURLM_OK);
// 获取结果
foreach ($handles as $ch) {
echo curl_multi_getcontent($ch);
curl_multi_remove_handle($multiCurl, $ch);
curl_close($ch);
}
curl_multi_close($multiCurl);
?>
9. 总结
cURL 是 PHP 中非常灵活的网络请求工具,能满足从简单 GET/POST 请求到复杂并发请求的需求。初学者可以从基础的 GET 和 POST 请求开始,逐渐学习自定义 Header、文件上传等高级用法,最后挑战并发请求。
推荐掌握:
- 基本操作流程(
init
→setopt
→exec
→close
)。 - 常用选项如
CURLOPT_POSTFIELDS
、CURLOPT_HTTPHEADER
等。 - 处理错误和调试工具如
curl_getinfo()
和curl_error()
。
通过实践,你将能轻松应对 RESTful API 调用、数据爬取等网络编程任务!