PHP中如何发起异步HTTPS请求?无需等待响应即可返回数据的实现方法
可行解决方案整理
方案1:修正fsockopen的HTTPS调用方式
fsockopen本身支持HTTPS请求,只需要在域名前添加ssl://或tls://前缀,端口改为443即可适配HTTPS场景,不需要额外切换技术栈:
- 核心代码示例:
$host = 'ssl://你的目标域名'; $port = 443; $timeout = 1; $fp = fsockopen($host, $port, $errno, $errstr, $timeout); if ($fp) { $out = "GET /图片下载接口路径 HTTP/1.1\r\n"; $out .= "Host: 你的目标域名\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); // 不需要等待返回结果,直接关闭连接即可 fclose($fp); }
注意:使用前需要确认PHP环境已开启openssl扩展,否则无法识别ssl协议前缀
方案2:使用cURL非阻塞请求
如果更习惯用cURL处理请求,可通过特殊配置实现请求发送后立即返回,不等待下载执行结果:
- 核心配置项说明:
CURLOPT_TIMEOUT_MS设置为100,即请求发送后最多等待100毫秒就直接结束CURLOPT_NOSIGNAL设置为true,避免短超时场景下抛出信号错误CURLOPT_SSL_VERIFYPEER、CURLOPT_SSL_VERIFYHOST按需配置适配HTTPS证书校验要求
- 核心代码示例:
$ch = curl_init('https://你的图片下载完整地址'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT_MS, 100); curl_setopt($ch, CURLOPT_NOSIGNAL, true); // 生产环境建议开启证书校验,将下方参数改为true curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_exec($ch); curl_close($ch);
方案3:生产环境高可靠方案:异步队列
如果对下载任务的可靠性有要求,可将下载任务写入内存队列(比如Redis队列),主请求写入队列后直接返回,另外启动独立的后台消费进程处理队列内的下载任务。该方案完全不阻塞主请求,还支持任务重试、失败统计等扩展能力,适合量级较大的业务场景。
内容的提问来源于stack exchange,提问作者Luân Tào
相关产品推荐
相关产品推荐

