用php 循环写一个并发请求

点击查看代码
<?php
// 要测试的接口 URL
$apiUrl = 'https://example.com/api';

// 并发请求数
$concurrentRequests = 10;

// 创建 cURL 多个句柄
$curlHandles = [];
for ($i = 0; $i < $concurrentRequests; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // 在这里可以设置其他 cURL 选项,如请求方法、请求头等
    $curlHandles[] = $ch;
}

// 创建 cURL 多个句柄的批处理
$multiHandle = curl_multi_init();
foreach ($curlHandles as $ch) {
    curl_multi_add_handle($multiHandle, $ch);
}

// 执行并发请求
$active = null;
do {
    $mrc = curl_multi_exec($multiHandle, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($multiHandle) != -1) {
        do {
            $mrc = curl_multi_exec($multiHandle, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

// 获取响应并处理
$responses = [];
foreach ($curlHandles as $ch) {
    $responses[] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($multiHandle, $ch);
}
curl_multi_close($multiHandle);

// 处理响应数据,可以输出或记录
foreach ($responses as $response) {
    // 处理响应数据的逻辑
    // 例如,您可以在这里检查响应是否满足预期的条件,记录响应时间等
    echo $response;
}

// 注意:这只是一个简单的示例,您可能需要根据实际需要进行调整和优化。
?>

在 PHP 中,使用 Fiber 来发送并发请求是一种相对新的方法,可以实现高并发的请求:

点击查看代码

<?php
// 安装 swoole 扩展: composer require swoole/swoole
require_once 'vendor/autoload.php';

use Swoole\Coroutine as co;

function sendRequest($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    $response = curl_exec($ch);
    
    if (curl_errno($ch)) {
        echo 'Curl error: ' . curl_error($ch) . PHP_EOL;
    }
    
    curl_close($ch);
    
    return $response;
}

$urls = array_fill(0, 100, 'https://example.com/api'); // 替换为您要测试的接口 URL

co\run(function () use ($urls) {
    $results = [];

    foreach ($urls as $url) {
        co::create(function () use ($url, &$results) {
            $response = sendRequest($url);
            $results[] = $response;
        });
    }

    co::sched();
    
    // 处理响应数据,可以输出或记录
    foreach ($results as $response) {
        // 处理响应数据的逻辑
        // 例如,您可以在这里检查响应是否满足预期的条件,记录响应时间等
        echo $response;
    }
});
?>

posted @ 2023-09-01 17:03  哼哼哈兮啊  阅读(11)  评论(0编辑  收藏  举报