대규모 HTTP 요청을 할 때 PHP의 CURL 라이브러리는 동시 요청을하고 성능을 향상시키는 데 도움이되는 매우 강력한 도구입니다. 그러나 연결을 효율적으로 관리해야하므로 여러 요청을 단순히 여러 요청을하는 것은 반드시 최적의 성능으로 이어지는 것은 아닙니다. 보다 효율적인 연결 최적화를 달성하려면 Curl_UpKeep () 및 Curl_Multi_Select () 함수를 사용하여 연결 오버 헤드를 줄일 수 있습니다.
curl_upkeep () :이 기능은 주로 초기 컬 연결을 관리하는 데 사용되며, 사용시 유효한 상태를 유지하고 연결 재사용을 유지하여 중복 연결 설정 프로세스를 줄임으로써 리소스를 절약 할 수 있습니다.
curl_multi_select () :이 함수는 curl_multi_exec () 와 함께 사용되므로 멀티 태스킹 CURL 요청의 실행 효율을 최적화하는 데 도움이됩니다. 그 기능은 적어도 하나의 컬 핸들이 준비되기를 기다리는 것을 차단하는 것입니다. 많은 동시 요청을 효율적으로 관리하는 데 적합합니다.
이 두 기능을 결합함으로써 각 요청 동안의 지연이 크게 줄어들 수 있으며 여러 요청 간의 동시 처리 효율을 개선 할 수 있습니다.
curl_upkeep () 및 curl_multi_select ()를 사용하는 방법을 소개하기 전에 기본 멀티 태스킹을 수행하는 방법을 검토해 봅시다. 다음 코드는 curl_multi_init () 및 curl_multi_exec ()를 사용하여 동시 요청을하는 방법을 보여줍니다.
// 다중 초기화cURL핸들
$mh = curl_multi_init();
$handles = [];
$urls = [
'https://m66.net/api/data1',
'https://m66.net/api/data2',
'https://m66.net/api/data3'
];
// 각 요청마다 하나를 만듭니다cURL핸들
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch);
$handles[] = $ch;
}
// 멀티 태스킹 요청을 수행하십시오
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh); // 활성 요청이있을 때까지 차단하십시오
}
} while ($active);
// 결과를 처리하고 청소하십시오
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response;
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
이 코드는 curl_multi_exec ()을 통한 멀티 태스킹 요청을 요청하고 Curl_multi_Select ()을 호출하여 루프가있을 때마다 활성 연결을 기다리므로 불필요한 CPU 리소스 사용을 피합니다.
연결의 빈번한 확립 및 파괴를 피하기 위해 Curl_upkeep () 함수를 통해 연결 다중화를 구현할 수 있습니다. PHP는 Curl_upkeep () 함수를 직접 제공하지는 않지만 Curl_multi_* 함수 조합을 사용하여 유사한 함수를 달성 할 수 있습니다. 구체적으로, 우리는 요청할 때마다 연결을 재현하는 대신 이러한 연결을 관리하기 위해 지속적인 연결 풀을 사용합니다.
연결 풀 초기화 : 먼저 컬 핸들 풀을 생성하고 각 요청에 대한 새 연결을 초기화하는 대신 풀의 연결이 재사용됩니다.
연결 멀티플렉싱 : 멀티 태스킹 요청 실행 중에 연결 풀의 연결을 확인할 수 있으며 무료 연결이 있으면 재사용 할 수 있습니다.
// 지속적인 연결 풀을 만듭니다
$mh = curl_multi_init();
$handles = [];
$connectionPool = [];
// 요청URLs
$urls = [
'https://m66.net/api/data1',
'https://m66.net/api/data2',
'https://m66.net/api/data3'
];
// 초기화cURL핸들并存储
foreach ($urls as $url) {
if (empty($connectionPool[$url])) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$connectionPool[$url] = $ch; // 연결 풀에 새 연결을 저장하십시오
} else {
$ch = $connectionPool[$url]; // 연결 풀에서 기존 연결을 사용하십시오
}
curl_multi_add_handle($mh, $ch);
$handles[] = $ch;
}
// 멀티 태스킹 요청을 수행하십시오
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh); // 활성 요청이있을 때까지 차단하십시오
}
} while ($active);
// 결과를 처리하고 청소하십시오
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response;
curl_multi_remove_handle($mh, $ch);
// 여기서 우리는 연결을 닫지 않습니다,연결 풀에서 멀티플렉싱을 유지하십시오
}
curl_multi_close($mh);
위의 코드에서는 간단한 연결 풀 ConnectionPool을 생성하고 멀티 태스킹 요청이 실행될 때 풀의 연결로 멀티 플렉스됩니다. 이는 특히 여러 요청이 동일한 도메인 이름을 가리킬 때 연결 효율성을 크게 향상시킬 수 있습니다.
Curl_upkeep () (Connection Pool Management) 및 Curl_Multi_Select () (활성 요청 차단 및 대기)를 결합하여 PHP의 CURL 멀티 태스킹 요청을 최적화하여 전반적인 시스템 성능을 향상시킬 수 있습니다. 연결 풀링 메커니즘은 연결의 빈번한 생성 및 파괴를 효과적으로 감소시키고 시스템 리소스를 저장하는 반면 Curl_multi_Select ()는 효율적인 동시 실행을 보장합니다.
이러한 방식으로 많은 양의 HTTP 요청을 처리하고 프로그램 응답 속도를 개선하며 대기 시간을 줄이며 더 높은 성능을 달성 할 때 연결을보다 효율적으로 관리 할 수 있습니다.