php-curl

curl

curl_init()初始化 → curl_setopt()配置请求参数 → 执行请求curl_exec() → curl_getinfo() 获取请求信息→ curl_close() 释放资源

```

function get($url)

{

$ch = curl_init();

  • curl_setopt(ch, CURLOPT_URL, url);


curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

output = curl_exec(ch);

httpCode = curl_getinfo(ch, CURLINFO_HTTP_CODE);

if($httpCode == 404) {

return 404;

}

curl_close($ch);

return $output;

}

```

curl_init()

**PHP-CURL 扩展的入口函数**,是发起所有 CURL 网络请求的**第一步、必用步**,没有它就无法使用 CURL 的任何功能。

✅ 核心作用

✅ 初始化一个全新的 **CURL 会话句柄(CURL handle)**,创建 CURL 操作的「核心容器」;

✅ 为后续的 `curl_setopt()`(配置请求)、`curl_exec()`(执行请求)、`curl_close()`(关闭请求)提供**唯一操作标识**;

✅ 申请并占用对应的系统资源,承载整个 CURL 请求的所有配置、状态、响应数据。

写法1:无参数 → 初始化空的CURL会话(最常用,URL后续用curl_setopt(ch, CURLOPT_URL, url)配置)

```

resource curl_init ( void )

```

写法2:带参数 → 初始化时直接指定请求的URL

```

resource curl_init ( string $url = null )

```

✅ 写法 1:无参数初始化

```

<?php

// 1. 初始化空的CURL会话,得到句柄$ch

$ch = curl_init();

// 2. 后续通过curl_setopt()单独配置请求URL(核心优势:灵活)

curl_setopt($ch, CURLOPT_URL, 'https://www.baidu.com');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 3. 执行+关闭

output = curl_exec(ch);

curl_close($ch);

?>

```

✅ 优势(为什么推荐)

✅ 分离「初始化」和「配置 URL」,当 URL 需要**动态拼接、条件变更**时,修改更方便;

✅ 符合 CURL「初始化→配置→执行→关闭」的标准流程,代码可读性更强;

✅ 适配多配置场景(如同时配置超时、HTTPS、请求头),扩展性更好。

✅ 写法 2:初始化时直接传 URL(简化写法)

```

<?php

// 1. 初始化的同时,直接指定请求URL

$ch = curl_init('https://www.baidu.com');

// 2. 无需再配置CURLOPT_URL,直接配置其他参数

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 3. 执行+关闭

output = curl_exec(ch);

curl_close($ch);

?>

```

✅ 适用场景

✅ 简单请求场景:URL 固定不变、无需额外复杂配置,一行完成初始化 + 指定 URL,代码更简洁;

✅ 快速测试场景:临时发起单个 GET 请求,追求代码精简。

危害:`curl_init()` 会占用服务器的**内存、文件描述符**等系统资源,若大量请求未关闭句柄,会导致服务器资源耗尽,程序卡死 / 报错;所以要及时关闭。

curl_setopt()

PHP-CURL 扩展中 **最核心、最常用** 的函数,没有之一;它是承接 `curl_init()`(初始化)和 `curl_exec()`(执行)的**桥梁函数**。

专门为**已初始化的 CURL 句柄**(`curl_init()`返回的`$ch`)**设置单个请求配置项**,可以理解为:给你的 CURL 请求「定制规则、配置参数」。

小到指定请求 URL、设置返回模式,大到配置超时、HTTPS 兼容、请求头、POST 数据,**所有 CURL 的请求规则都靠它来定义**。

你的`get()`函数能实现「获取响应内容、不直接输出」的核心效果,完全依赖`curl_setopt()`的配置。

```

bool curl_setopt ( resource ch , int option , mixed $value )

```

| 参数名 | 类型 | 必传 | 核心作用 & 你的代码对应示例 |

| ------- | -------- | --- | ------------------------------------------------------------------- |

| ch \| resource \| 是 \| \*\*CURL 句柄\*\*:\`curl_init()\`返回的资源变量(你的代码中就是\`ch`),表示「要给哪个 CURL 请求配置参数」 |

| $option | int | 是 | **配置选项常量**:PHP 内置的、以`CURLOPT_`开头的常量(如`CURLOPT_URL`),表示「要配置哪一项规则」 |

| value \| mixed \| 是 \| \*\*配置值\*\*:对应\`option`的具体取值(字符串 / 数字 / 布尔值),表示「这项规则要配置成什么样子」 |

✅ 返回值说明

  • ✅ 配置**成功** → 返回布尔值 `true`;

  • ❌ 配置**失败** → 返回布尔值 `false`(极少出现,仅`ch\`无效 /\`option`不存在时触发)。

> ✅ 关键提醒:一个`curl_setopt()`**只能设置一个配置项**,要配置多个规则,就需要**多次调用**(你的代码中就是调用 2 次,配置 2 个规则)。

例如:

指定请求的目标 URL

```

// 你的代码原句 curl_setopt(ch, CURLOPT_URL, url);

```

各参数对应解析

  1. `$ch`:当前初始化好的 CURL 请求句柄;

  2. `CURLOPT_URL`:配置选项常量 → 含义是「设置 CURL 请求的目标 URL 地址」;

  3. `$url`:你的函数入参 → 要请求的百度 / 接口地址(字符串类型)。

作用

这行代码的唯一目的:**告诉 CURL,你要请求哪个网址**,是所有 CURL 请求的「必配项」。

curl_exec()

PHP-CURL 扩展的 **执行核心函数**,是 CURL 请求链路中「承上启下的最终执行环节」,也是你之前代码中发起**实际网络请求**的关键函数。

执行**已完成初始化 + 参数配置**的 CURL 会话句柄(`curl_init()`创建 + `curl_setopt()`配置的`$ch`),**真正发起网络请求**;

向目标 URL 发送请求、接收服务器响应,并根据`curl_setopt()`的配置规则,返回 / 输出响应结果;

是 CURL 请求链路中,**唯一触发实际网络通信**的函数,没有它,所有`curl_init()`和`curl_setopt()`的配置都只是「纸上谈兵」。

✅ 通俗理解:`curl_init()` = 打开浏览器、`curl_setopt()` = 输入网址 + 设置浏览器参数、`curl_exec()` = **按下回车,访问目标页面**。

```

mixed curl_exec ( resource $ch )

```

| 参数 | 类型 | 是否必填 | 核心说明 | 代码对应 |

| --- | -------- | ---- | ------------------------------------------------------- | ------------ |

| ch \| resource \| 是 \| 由\`curl_init()\`返回的\*\*有效 CURL 句柄\*\*,包含了所有请求配置(URL、返回模式、超时等) \| 代码中直接传入\`ch` |

✅ 返回值规则(重中之重,和你的代码强绑定)

`curl_exec()`的返回值**完全由你之前配置的 `CURLOPT_RETURNTRANSFER` 决定**,这是两个函数最核心的联动关系,也是你代码能正常工作的关键,分 2 种核心情况,必须死记:

✔️ 情况 1:配置了 `curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1)`(你的代码写法 ✅ 开发首选)

✅ **返回响应内容**:执行成功 → 返回目标 URL 的**完整响应体字符串**(HTML 源码、JSON 数据、纯文本、XML 等);

✅ **返回错误标识**:执行失败 → 返回布尔值 `false`(如网络中断、域名解析失败、URL 无效)。

> ✅ 你的代码正是用这种配置,所以`output = curl_exec(ch)`能直接接收响应内容,这是开发中 99% 的使用方式!

✔️ 情况 2:未配置 / 配置了 `curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0)`(默认值 ❌ 不推荐)

✅ **直接输出内容**:执行成功 → **不会返回响应内容**,而是将响应体**直接打印到页面 / 控制台**;

✅ **仅返回状态标识**:执行成功返回`true`,执行失败返回`false`,**无法获取响应内容本身**。

> ❌ 弊端:内容被强制输出,无法赋值给变量做解析、存储等后续操作,开发中几乎不用。

✅ 你的代码中返回值对应关系

```

// 你的代码核心行

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 配置返回模式为「赋值」

output = curl_exec(ch); // ✅ 执行后,响应内容直接存入$output变量

```

curl_getinfo()

PHP-CURL 扩展的 **请求信息获取函数**,是 CURL 请求链路中**专属的「数据统计 / 信息采集」工具**,也是你代码中实现「404 状态码判断」的核心函数。

✅ 核心作用

✅ 仅能在 `curl_exec()` 执行后调用,**提取已完成的 CURL 会话句柄`$ch`中存储的「请求 + 响应全量信息」**;

✅ 可获取「HTTP 状态码、请求 URL、响应耗时、传输字节数」等几十种数据,满足**请求状态判断、接口性能分析、错误排查**等需求;

✅ 你的`get()`函数能精准捕获 404,完全依赖该函数提取的 HTTP 响应状态码,是业务容错的核心。

> ✅ 通俗理解:`curl_exec()` = 按下回车访问网页、`curl_getinfo()` = **查看本次访问的「详情数据」**(比如是否 404、加载耗时多久、访问的真实地址)。

写法1:不传$opt → 获取【全部】请求信息,返回关联数组

```

array curl_getinfo ( resource $ch )

```

写法2:传入$opt → 获取【指定】的某一项信息,返回对应值(你的代码写法 ✅ 开发首选)

```

mixed curl_getinfo ( resource ch , int opt = 0 )

```

✅ 参数 1:`$ch`(必传,核心)

  • 类型:`resource`(CURL 资源句柄)

  • 要求:必须是 `curl_init()` 创建、且已执行 `curl_exec()` 的**有效句柄**;

  • 你的代码对应:直接传入初始化好的`$ch`,完全符合要求。

✅ 参数 2:`$opt`(可选,核心筛选)

  • 类型:`int`(PHP 内置的`CURLINFO_*`系列常量)

  • 作用:指定「要提取哪一项具体信息」,不传则返回**所有信息的关联数组**;

  • 你的代码对应:传入`CURLINFO_HTTP_CODE`,专门提取「HTTP 响应状态码」。

写法 1(不传`$opt`)→ 返回「全量信息数组」

执行成功返回**关联数组**,数组的`key`是`CURLINFO_*`常量名,`value`是对应信息,示例:

```

allInfo = curl_getinfo(ch);

print_r($allInfo);

```

输出示例(核心片段):

```

Array

(

url\] =\> https://www.baidu.com \[http_code\] =\> 200 // HTTP状态码 \[total_time\] =\> 0.02 // 整个请求耗时(秒) \[size_download\] =\> 12345 // 下载的字节数 \[ssl_verify_result\] =\> 0 // SSL验证结果 ) \`\`\` #### 写法 2(传入\`$opt\`)→ 返回「指定单项值」(你的代码用法) 执行成功返回\*\*单一值\*\*,值的类型由\`$opt\`决定;执行失败返回\`false\`。 你的代码中:\`curl_getinfo($ch, CURLINFO_HTTP_CODE)\` → 直接返回\*\*整型的 HTTP 状态码\*\*(如 200、404、500),极简高效! \`\`\` // 你的代码原句 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if($httpCode == 404) { return 404; } \`\`\` ### ✅ 1. 核心常量:\`CURLINFO_HTTP_CODE\` 详解 这是开发中\*\*最常用、最核心\*\*的\`CURLINFO_\*\`常量,没有之一: - ✅ 含义:提取本次 CURL 请求的 \*\*HTTP 响应状态码\*\*; - ✅ 返回值类型:\`整型\`(如 200、404、302、500); - ✅ 状态码意义(高频): ✔️ 200 → 请求成功,服务器正常返回内容; ✔️ 404 → 资源未找到; ✔️ 301/302 → 页面重定向; ✔️ 500 → 目标服务器内部错误; ✔️ 403 → 目标服务器拒绝访问。 - \`curl_getinfo()\` \*\*强依赖\`curl_exec()\`\*\*:没有执行请求,就没有可提取的信息; - \`curl_getinfo()\` \*\*必须早于\`curl_close()\`\*\*:句柄关闭后,所有信息被销毁,无法提取; - 提取的信息\*\*仅对当前\`$ch\`有效\*\*:不同 CURL 句柄的信息相互独立,互不干扰。 ## curl_close() PHP-CURL 扩展的 \*\*收尾 / 销毁函数\*\*,是 CURL 请求链路中 \*\*最后一步、必执行步骤\*\*,与 \`curl_init()\` 形成\*\*严格的成对关系\*\*,也是保障服务器资源安全的核心函数。 ### ✅ 核心作用 ✅ 关闭一个\*\*已初始化、已执行\*\*的 CURL 会话句柄 \`$ch\`,\*\*强制释放该句柄占用的所有系统资源\*\*; ✅ 销毁 CURL 句柄中存储的「请求配置、响应数据、状态信息」等所有内容,让 \`$ch\` 变为无效句柄; ✅ 你的\`get()\`函数中,它是请求完成后的\*\*规范收尾操作\*\*,能彻底避免服务器内存泄漏、资源耗尽的风险。 \> ✅ 通俗理解(延续之前的浏览器类比): \> \> \`curl_init()\` = 打开浏览器窗口、\`curl_close()\` = \*\*关闭浏览器窗口\*\*; \> \> 用完浏览器不关闭,会占用电脑内存;用完 CURL 句柄不关闭,会占用服务器资源。 \`\`\` void curl_close ( resource $ch ) \`\`\` \| 参数 \| 类型 \| 是否必填 \| 核心说明 \| 代码对应 \| \| --- \| -------- \| ---- \| ------------------------------------------------ \| ------------ \| \| $ch \| resource \| 是 \| 由\`curl_init()\`创建的\*\*有效 CURL 资源句柄\*\*,可是已执行 / 未执行的句柄 \| 代码中直接传入\`$ch\` \| 函数返回值为 \`void\`(无返回值),调用后\*\*不会返回任何数据\*\*,也无需接收返回值,执行即完成资源释放操作。

相关推荐
REDcker2 小时前
Linux 文件描述符与 Socket 选项操作详解
linux·运维·网络
2501_927773072 小时前
imx6驱动
linux·运维·服务器
hy____1233 小时前
Linux_进程间通信
linux·运维·服务器
银发控、3 小时前
nginx静态资源
运维·nginx
独角鲸网络安全实验室3 小时前
本地信任成“致命漏洞”:数千Clawdbot Agent公网裸奔,供应链与内网安全告急
网络·网关·安全·php·漏洞·clawdbot·信任机制漏洞
老百姓懂点AI3 小时前
[测试工程] 告别“玄学”评测:智能体来了(西南总部)基于AI agent指挥官的自动化Eval框架与AI调度官的回归测试
运维·人工智能·自动化
德育处主任Pro3 小时前
『NAS』用SSH的方式连上NAS
运维·ssh
Meaauf3 小时前
VMware安装中科方德服务器操作系统
运维·服务器·中科方德
南宫码农3 小时前
神马影视8.5版本如意伪静态+视频教程
linux·运维·centos