PHP使用CURL详解

简介: ** @desc 封装 curl 的调用接口,post的请求方式

CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。

使用CURL发送请求的基本流程
使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤:

初始化连接句柄;
设置CURL选项;
执行并获取结果;
释放VURL连接句柄。
下面的程序片段是使用CURL发送HTTP的典型过程

复制代码
// 1. 初始化
$ch = curl_init();
// 2. 设置选项,包括URL
curl_setopt($ch,CURLOPT_URL,"http://www.devdo.net");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
// 3. 执行并获取HTML文档内容
$output = curl_exec($ch);
if($output === FALSE ){
echo "CURL Error:".curl_error($ch);
}
// 4. 释放curl句柄
curl_close($ch);
复制代码
上述代码中使用到了四个函数

curl_init() 和 curl_close() 分别是初始化CURL连接和关闭CURL连接,都比较简单。
curl_exec() 执行CURL请求,如果没有错误发生,该函数的返回是对应URL返回的数据,以字符串表示满意;如果发生错误,该函数返回 FALSE。需要注意的是,判断输出是否为FALSE用的是全等号,这是为了区分返回空串和出错的情况。
CURL函数库里最重要的函数是curl_setopt(),它可以通过设定CURL函数库定义的选项来定制HTTP请求。上述代码片段中使用了三个重要的选项:
CURLOPT_URL 指定请求的URL;
CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;
CURLLOPT_HEADER设置为0表示不返回HTTP头部信息。
CURL的选项还有很多,可以到PHP的富贵论坛邀请码官方网站上查看CURL支持的所有选项列表。

获取CURL请求的输出信息
在curl_exec()函数执行之后,可以使用curl_getinfo()函数获取CURL请求输出的相关信息,示例代码如下:

curl_exec($ch);
$info = curl_getinfo($sh);
echo ' 获取 '.$info['url'].'耗时'.$info['total_time'].'秒';
上述代码中curl_getinfo返回的是一个关联数组,包含以下数据:

url:网络地址。
content_type:内容编码。
http_code:HTTP状态码。
header_size:header的大小。
request_size:请求的大小。
filetime:文件创建的时间。
ssl_verify_result:SSL验证结果。
redirect_count:跳转计数。
total_time:总耗时。
namelookup_time:DNS查询耗时。
connect_time:等待连接耗时。
pretransfer_time:传输前准备耗时。
size_uplpad:上传数据的大小。
size_download:下载数据的大小。
speed_download:下载速度。
speed_upload:上传速度。
download_content_length:下载内容的长度。
upload_content_length:上传内容的长度。
starttransfer_time:开始传输的时间表。
redirect_time:重定向耗时。
curl_getinfo()函数还有一个可选择参数$opt,通过这个参数可以设置一些常量,对应到上术这个字段,如果设置了第二个参数,那么返回的只有指定的信息。例如设置$opt为CURLINFO_TOTAL_TIME,则curl_getinfo()函数只返回total_time,即总传输消耗的时间,在只需要关注某些传输信息时,设置$opt参数很有意义。

使用CURL发送GET请求
如何使用CURL来发送GET请求,发送GET请求的关键是拼装格式正确的URL。请求地址和GET数据由一个“?”分割,然后GET变量的名称和值用“=”分隔,各个GET名称和值由“&”连接。PHP为我们提供了一个函数专门用来拼装GET请求和数据部分——http_build_query,该函数接受一个关联数组,返回由该关联数据描述的GET请求字符串。使用这个函数,结合CURL发送HTTP请求的一般流程,我们封闭了一个发送GET请求的函数——doCurlGetRequest,具体代码如下:

复制代码
* @desc 封闭curl的调用接口,get的请求方式。
*/
function doCurlGetRequest($url,$data,$timeout = 5){
if($curl == "" || $timeout <= 0){
return false;
}
$url = $url.'?'.http_bulid_query($data);
$con = curl_init((string)$url);
curl_setopt($con, CURLOPT_HEADER, false);
curl_setopt($con, CURLOPT_RETURNTRANSFER,true);
curl_setopt($con, CURLOPT_TIMEOUT, (int)$timeout);

return curl_exec($con);
}
复制代码
这个函数把使用http_build_query 拼装好的带GET参数的URL传给curl_init函数,然后使用CURL发送HTTP请求。

使用CURL发送POST请求
可以使用CURL提供的选项CURLOPT_POSTFIELDS,设置该选项为POST字符串数据就可以把请求放在正文中。同样我们实现了一个发送POST请求的函数——doCurlPostRequest,代码如下:

复制代码
/ @desc 封装 curl 的调用接口,post的请求方式
**/
function doCurlPostRequest($url,$requestString,$timeout = 5){
if($url == '' || $requestString == '' || $timeout <=0){
return false;
}
$con = curl_init((string)$url);
curl_setopt($con, CURLOPT_HEADER, false);
curl_setopt($con, CURLOPT_POSTFIELDS, $requestString);
curl_setopt($con, CURLOPT_POST,true);
curl_setopt($con, CURLOPT_RETURNTRANSFER,true);
curl_setopt($con, CURLOPT_TIMEOUT,(int)$timeout);
return curl_exec($con);
}
复制代码
上面代码中除了设置CURLOPT_POSTFIELDS外,我们还设置了CURL_POST为true,标识这个请求是一个POST请求。在POST请求中也是可以传输GET数据的,只需要在URL中拼装GET请求数据即可秀。

相关文章
|
2月前
|
安全 Java 程序员
python进程、线程、协程
multiprocessing是python的多进程管理包,和threading.Thread类似。
179 4
|
2月前
|
缓存 网络协议 开发者
HTTP 0.9 HTTP 1.0 HTTP 1.1 HTTP 2.0区别
消息:是指逻辑上的 HTTP 消息,比如请求、响应等,由一或多个帧组成。 流:流是连接中的一个虚拟信道,可以承载双向的消息;每个流都有一个唯一的整数标识符(1、2 … N);
408 4
|
2月前
|
人工智能 程序员 C语言
Python 与 C++、C 语言的区别及选择指南
C 语言:语法相对复杂,变量需要显式声明数据类型,代码块用大括号表示。例如:
410 3
|
2月前
|
机器学习/深度学习 存储 人工智能
学会Skill开发后,我的月薪涨了1万5
AI测试正经历底层重构:从写脚本转向设计AI系统。大厂招聘已明确要求AI Agent理解、Skill封装与MCP工程能力,传统自动化技能加速贬值。掌握“Agent+Skills+MCP”闭环能力,成为测试工程师涨薪跃迁的核心壁垒。
|
1月前
|
供应链 安全 前端开发
2026 年新型网络威胁演进与防御体系研究 —— 以两起典型攻击为例
本文剖析2026年ShinyHunters入侵Canvas与Play勒索软件利用CLFS零日漏洞两大典型事件,揭示供应链攻击、身份劫持、零日武器化、双重勒索等新威胁特征;提出以身份为中心、零信任为基座的五层防御体系,并提供可落地的令牌校验、提权检测、数据导出监控等代码实现,助力教育、金融等行业构建韧性安全防线。(239字)
425 8
|
1月前
|
弹性计算 人工智能 运维
阿里云服务器2核2G怎么选择?轻量应用服务器38元与云服务器99元区别及选购策略参考
2026年阿里云两款热门2核2G入门级云服务器,轻量应用服务器38元/年,峰值200M带宽、40G ESSD云盘,预装OpenClaw等镜像,适合新用户快速部署AI应用,但仅限新用户抢购且续费价格高。云服务器ECS经济型e实例99元/年,固定3M带宽不限流量,新老用户同享且续费同价至2027年3月,适合长期稳定运营。追求极致首年性价比和快速上云选轻量,注重长期稳定和环境自定义选ECS,助力个人开发者与中小企业低门槛上云。
|
1月前
|
人工智能 前端开发 安全
[理论篇-11]AI Agent(智能体)——不只是会答话的AI,而是会干活的AI
用最朴素的话讲清楚 AI Agent 到底是什么、它跟普通的"AI 聊天"和"AI 工作流"有什么本质区别、为什么 2024 年大家还在说"少用 Agent"而 2026 年它突然成了主角、以及它现在正在悄悄做哪些原本只有人能做的事。不管你是开发者、产品、运营、做内容的、还是只是想搞清楚"自己每天用的这个 AI 助手到底是什么级别"的普通用户,这一篇读完都能讲明白。
495 6
|
2月前
|
存储 设计模式 缓存
为生产级 AI Agent 构建持久化记忆:五阶段流水线与四种设计模式
LLM Agent需持久化记忆以支撑连续对话、用户画像、知识沉淀与崩溃恢复。但满上下文方案成本高、延迟大、易出错。本文提出五阶段流水线(抽取→整合→存储→检索→遗忘)与四种记忆类型(工作/情景/语义/过程记忆),结合结构化状态+向量搜索等设计模式,实现高效、可控、可审计的生产级记忆系统。
773 9
为生产级 AI Agent 构建持久化记忆:五阶段流水线与四种设计模式
|
2月前
|
数据采集 人工智能 自然语言处理
OpenClaw 2.6.4 必装技能 电脑办公一站式方案(包含最新版安装包)
OpenClaw 2.6.4「小龙虾」推出15个实用Skill技能,覆盖文件管理、办公自动化、浏览器操作、系统维护及内容处理五大场景。小白零门槛启用,如自动整理桌面、生成周报、PDF处理、网页采集、系统检测等,一键执行多任务,大幅提升办公效率。
|
1月前
|
Kubernetes 测试技术 Docker
Jellyfin 上 K8s 前,先把镜像、PVC 和权限排一遍
本文记录Jellyfin从Docker Compose迁移至K8s测试环境的典型问题排查:镜像拉取慢、PVC未绑定致媒体目录为空、容器用户权限不足、路径配置错误等。强调K8s中“宿主机→PV→PVC→volumeMount→容器路径”的分层模型,须逐层验证,避免误判。

热门文章

最新文章