当前位置:首页 > PHP

curl 实现异步 php

2026-02-16 09:10:21PHP

使用 curl 实现 PHP 异步请求

在 PHP 中,curl 默认是同步执行的,但可以通过一些技巧实现类似异步的效果。以下是几种常见的方法:

设置 CURLOPT_TIMEOUT 和 CURLOPT_CONNECTTIMEOUT

通过设置极短的超时时间,可以让 curl 请求快速返回,不阻塞主进程:

curl 实现异步 php

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/async");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 1); // 1秒超时
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
curl_exec($ch);
curl_close($ch);

使用 curlmulti* 函数组

curlmulti* 允许同时处理多个 curl 请求,虽然不是真正的异步,但能提高并发效率:

$mh = curl_multi_init();
$ch1 = curl_init("http://example.com/1");
$ch2 = curl_init("http://example.com/2");

curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running);

curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

结合 fsockopen 实现真正异步

使用 fsockopen 可以建立非阻塞连接:

curl 实现异步 php

$fp = fsockopen("example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)";
} else {
    $out = "GET /async.php HTTP/1.1\r\n";
    $out .= "Host: example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    fclose($fp);
}

使用 ignore_user_abort 和 fastcgi_finish_request

在 PHP-FPM 环境下可以这样实现:

echo "Request processing started";
fastcgi_finish_request();

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/async");
curl_exec($ch);
curl_close($ch);

通过队列系统实现

更健壮的方式是使用消息队列:

// 生产者
$queue = new Redis();
$queue->connect('127.0.0.1', 6379);
$queue->lPush('async_requests', json_encode(['url' => 'http://example.com']));

// 消费者 (单独进程)
while(true) {
    $task = $queue->rPop('async_requests');
    if ($task) {
        $data = json_decode($task, true);
        $ch = curl_init($data['url']);
        curl_exec($ch);
        curl_close($ch);
    }
    sleep(1);
}

每种方法都有其适用场景,需要根据具体需求选择。对于简单的异步需求,短超时或 fsockopen 方法足够;对于高并发场景,建议使用队列系统。

标签: curlphp
分享给朋友:

相关文章

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php实现静态

php实现静态

静态化实现方法 PHP实现静态化主要通过生成HTML文件或缓存机制来减少服务器动态解析的开销。以下是几种常见方法: 生成静态HTML文件 通过file_put_contents()将动态内容保存为H…

php 实现下载

php 实现下载

PHP 实现文件下载的方法 使用 PHP 实现文件下载可以通过设置 HTTP 头信息,强制浏览器将文件作为附件下载而非直接打开。 基本下载实现 $file_path = 'path/to/your/…

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节点。每个…