PHP8.5引入的curl_share_init_persistent函数用于创建持久化的curl共享句柄,该句柄可以在多个PHP请求生命周期内复用,避免每次请求都重新初始化共享资源带来的性能损耗,适合高频调用外部接口的场景使用。

curl_share_init_persistent基础说明
普通的curl_share_init创建的共享句柄仅在当前请求生命周期内有效,请求结束后就会被销毁。而curl_share_init_persistent创建的持久化共享句柄会保存在PHP的持久化存储中,后续请求可以直接复用,支持共享DNS缓存、SSL会话、Cookie等curl相关资源。
函数基本语法
该函数的语法非常简单,不需要传入任何参数,调用后会返回一个持久化的curl共享句柄资源:
<?php
// 创建持久化curl共享句柄
$shareHandle = curl_share_init_persistent();
if ($shareHandle === false) {
die('创建持久化共享句柄失败');
}
?>
持久化共享句柄的配置与使用
创建持久化共享句柄后,需要设置需要共享的资源类型,目前支持三种共享类型:
- CURLSHOPT_SHARE:设置要共享的资源类型
- CURLSHOPT_UNSHARE:取消共享的资源类型
- CURLSHOPT_LOCKFUNC:设置锁函数,用于多线程场景下的资源同步
设置共享资源类型
我们可以通过curl_share_setopt函数配置共享的资源,常用的共享资源有DNS缓存、SSL会话:
<?php $shareHandle = curl_share_init_persistent(); // 共享DNS缓存,避免重复解析域名 curl_share_setopt($shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); // 共享SSL会话,减少SSL握手开销 curl_share_setopt($shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); // 共享Cookie数据 curl_share_setopt($shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE); ?>
在curl请求中使用共享句柄
配置好共享句柄后,将其绑定到curl初始化后的句柄上,即可让当前curl请求使用共享的资源:
<?php
// 创建持久化共享句柄(实际项目中可以判断句柄是否已存在,避免重复创建)
$shareHandle = curl_share_init_persistent();
curl_share_setopt($shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
// 初始化第一个curl请求
$ch1 = curl_init('https://ipipp.com/api/test');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
// 绑定共享句柄
curl_setopt($ch1, CURLOPT_SHARE, $shareHandle);
$result1 = curl_exec($ch1);
curl_close($ch1);
// 初始化第二个curl请求,会复用第一个请求共享的DNS和SSL资源
$ch2 = curl_init('https://ipipp.com/api/test2');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_SHARE, $shareHandle);
$result2 = curl_exec($ch2);
curl_close($ch2);
?>
和普通curl共享句柄的差异对比
我们可以通过下面的表格清晰看到两者的区别:
| 对比项 | curl_share_init创建的普通句柄 | curl_share_init_persistent创建的持久化句柄 |
|---|---|---|
| 生命周期 | 仅当前请求有效,请求结束销毁 | 跨请求复用,持久化存储 |
| 性能表现 | 每次请求需要重新初始化 | 减少重复初始化开销,高频场景性能更优 |
| 适用场景 | 单次请求内的多个curl共享资源 | 多个请求之间复用共享资源 |
| 资源释放 | 请求结束自动释放 | 需要手动调用curl_share_close释放,否则会一直占用资源 |
使用注意事项
在使用持久化curl共享句柄时,需要注意以下几点:
- 持久化句柄会占用PHP持久化内存,不需要使用时要及时调用
curl_share_close释放,避免内存泄漏 - 多线程环境下使用需要配置锁函数,防止多个线程同时操作共享资源导致数据异常
- 共享的DNS缓存有有效期,过期后会自动重新解析,不需要手动清理
- 如果目标接口地址变更,共享的DNS缓存可能需要等待过期后才会更新,必要时可以手动销毁旧句柄重新创建
释放持久化共享句柄示例
<?php // 当不再需要使用持久化共享句柄时,手动释放 $shareHandle = curl_share_init_persistent(); // 使用句柄的逻辑... // 释放句柄 curl_share_close($shareHandle); ?>
注意:curl_share_close仅会释放当前请求中获取的句柄引用,持久化句柄的实际资源需要在所有引用都释放后才会被PHP销毁,具体销毁时机和PHP的持久化资源管理机制有关。
curl_share_init_persistentPHP8.5curl共享句柄持久化curl修改时间:2026-07-14 08:39:24