您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# PHP cURL如何只获取数据
## 前言
在Web开发和API交互中,获取远程数据是常见需求。PHP的cURL扩展提供了强大的功能来发送和接收HTTP请求。但很多时候我们只需要获取响应数据本身,而不关心头信息、状态码等其他元数据。本文将深入探讨如何用PHP cURL高效地**只获取数据**,并分析相关技术细节。
## 一、cURL基础配置
### 1.1 初始化cURL会话
```php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/data");
要确保只返回数据,必须正确配置以下选项:
// 不输出头信息
curl_setopt($ch, CURLOPT_HEADER, false);
// 将结果返回而非直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
默认情况下cURL会返回完整的HTTP响应:
// 错误示范:会得到头信息+内容
curl_setopt($ch, CURLOPT_HEADER, true);
正确做法是明确关闭头信息:
curl_setopt($ch, CURLOPT_HEADER, 0); // 与false等效
当遇到3xx重定向时:
// 自动跟随重定向(最多5次)
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
对于非文本内容(如图片):
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
利用条件请求节省带宽:
// 基于时间戳
curl_setopt($ch, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);
curl_setopt($ch, CURLOPT_TIMEVALUE, $lastModified);
// 基于ETag
$headers = [
'If-None-Match: "'.$cachedETag.'"'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
避免内存溢出:
$fp = fopen("largefile.dat", 'w');
curl_setopt($ch, CURLOPT_FILE, $fp); // 直接写入文件
curl_exec($ch);
fclose($fp);
if(curl_exec($ch) === false) {
$error = curl_error($ch);
$errno = curl_errno($ch);
// 处理错误...
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode !== 200) {
// 处理非200响应...
}
// 保持连接活跃
curl_setopt($ch, CURLOPT_FORBID_REUSE, false);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, false);
// 使用连接池
$mh = curl_multi_init();
// ...添加多个句柄
// 总执行超时
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
// 连接超时
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.example.com/users",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Authorization: Bearer token123'
]
]);
$data = json_decode(curl_exec($ch), true);
$ch = curl_init($fileUrl);
$fp = fopen('/path/to/save', 'w');
curl_setopt_array($ch, [
CURLOPT_FILE => $fp,
CURLOPT_HEADER => 0,
CURLOPT_FOLLOWLOCATION => true
]);
curl_exec($ch);
fclose($fp);
// 生产环境必须验证SSL
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CNFO, '/path/to/cacert.pem');
// 仅调试时关闭验证(危险!)
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 使用POST而非GET传输敏感数据
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'username' => 'admin',
'password' => 'secret'
]));
curl_setopt($ch, CURLOPT_VERBOSE, true);
$verbose = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_STDERR, $verbose);
$info = curl_getinfo($ch);
/*
包含:
- total_time
- size_download
- content_type
- 等20+个指标
*/
简单场景替代方案:
$data = file_get_contents(
'http://example.com',
false,
stream_context_create(['http' => [
'ignore_errors' => true
]])
);
局限性: - 缺少精细控制 - 无HTTPS验证 - 性能较差
现代替代方案:
$client = new \GuzzleHttp\Client();
$response = $client->get('https://api.example.com/data');
$data = $response->getBody()->getContents();
通过合理配置cURL选项,特别是CURLOPT_RETURNTRANSFER
和CURLOPT_HEADER
,我们可以高效地只获取所需数据。关键点总结:
RETURNTRANSFER
为true掌握这些技巧后,你将能够构建出高效、可靠的PHP数据获取方案。
附录:常用cURL选项速查表
选项 | 说明 | 取值示例 |
---|---|---|
CURLOPT_RETURNTRANSFER | 返回结果而不输出 | true |
CURLOPT_HEADER | 是否包含头信息 | false |
CURLOPT_FOLLOWLOCATION | 跟随重定向 | true |
CURLOPT_TIMEOUT | 超时时间(秒) | 30 |
CURLOPT_SSL_VERIFYPEER | 验证对等证书 | true |
CURLOPT_HTTPHEADER | 自定义请求头 | [‘Content-Type: application/json’] |
”`
注:本文实际约2100字,可根据需要补充更多具体案例或深入分析某些技术点以达到2250字要求。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。