用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;
}
});
?>