현대 웹 개발에서 많은 수의 HTTP 요청을 처리하는 것은 배치 크롤링 인터페이스 데이터, 병렬 다운로드 리소스, 링크 상태 확인 등과 같은 일반적인 요구 사항입니다. 기존의 직렬 요청 방법 (즉, 한 요청이 끝나고 다음 중 하나를 시작합니다)은 비효율적입니다. 이를 위해 PHP는 CURL_MULTI_* 시리즈 기능을 제공하여 동시 요청을 구현하는 반면 CURL_SHARE_* 시리즈는 여러 컬 핸들간에 리소스 (예 : DNS 캐시)를 공유하여 성능을 추가로 최적화 할 수 있습니다. 이 기사는 효율적인 동시 요청 최적화를 달성하기 위해 curl_multi_exec () 와 curl_share_init ()를 결합하는 방법을 소개합니다.
curl_multi_* 일련의 함수를 사용하면 하나의 줄을 기다리는 대신 동시에 여러 HTTP 요청을 보낼 수 있습니다. 핵심 워크 플로는 다음과 같습니다.
멀티 핸들 ( curl_multi_init )을 초기화하십시오.
멀티 핸들에 여러 개의 쉬운 핸들 ( curl_init )을 추가하십시오.
curl_multi_exec ()를 사용하여 동시 요청을 유도하십시오.
curl_multi_select ()를 사용하여 활성 핸들을 기다리십시오 (CPU 유휴 상태를 피하십시오).
결과를 수집하고 자원을 닫습니다.
이 방법은 크롤러, 인터페이스 집계, CDN 예열 등과 같은 많은 요청이 동시에 처리 해야하는 시나리오에 특히 적합합니다.
curl_multi_* 는 동시 요청을 보낼 수 있지만, 각 쉬운 핸들은 기본적으로 독립적입니다. 예를 들어 각각의 쉬운 핸들은 DNS를 개별적으로 해결하고 자체 쿠키 등을 유지해야합니다. Curl_share_* 일련의 기능은 여러 내부 핸들이 특정 내부 리소스를 공유 할 수 있도록 허용합니다 (예 : DNS 캐시, SSL 세션, 쿠키 등).
핵심 단계는 다음과 같습니다.
curl_share_init ()를 사용하여 공유 객체를 만듭니다.
curl_share_setopt ()를 사용하여 공유 컨텐츠 (예 : curlshopt_share)를 설정하십시오.
curl_setopt ($ ch, curlopt_share, $ share)를 사용하여 공유 객체를 쉬운 핸들에 첨부하십시오.
요청이 완료된 후 공유 객체를 해제하십시오.
다음은 실제로 실행할 수있는 PHP 코드의 예입니다.
<?php
// 동시 요청이 필요합니다URL목록
$urls = [
'https://m66.net/api/endpoint1',
'https://m66.net/api/endpoint2',
'https://m66.net/api/endpoint3',
'https://m66.net/api/endpoint4'
];
// 초기화 multi handle
$multiHandle = curl_multi_init();
// 공유 객체를 만듭니다
$shareHandle = curl_share_init();
curl_share_setopt($shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
// 각각 저장하십시오 easy handle
$curlHandles = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SHARE, $shareHandle);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$url] = $ch;
}
// 동시 요청을 수행하십시오
$active = null;
do {
$mrc = curl_multi_exec($multiHandle, $active);
if ($mrc == CURLM_CALL_MULTI_PERFORM) {
continue;
}
curl_multi_select($multiHandle);
} while ($active && $mrc == CURLM_OK);
// 결과를 수집하십시오
$responses = [];
foreach ($curlHandles as $url => $ch) {
$responses[$url] = curl_multi_getcontent($ch);
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 폐쇄 multi handle 그리고 share handle
curl_multi_close($multiHandle);
curl_share_close($shareHandle);
// 인쇄 결과
foreach ($responses as $url => $content) {
echo "Response from $url:\n";
echo $content . "\n\n";
}
? Curl_multi_를 사용하여 동시성 성능을 향상 시키십시오 *: 여러 요청을 동시에 시작하고 처리하여 전체 시간 소모를 크게 줄입니다.
? Curl_share_를 사용하여 중복 오버 헤드를 저장 *: DNS 캐시와 같은 리소스를 공유하여 중복 구문 분석을 피하고 전반적인 효율성을 향상 시키십시오.
? 참고 리소스 릴리스 : 요청이 완료된 후 각 쉬운 핸들, 멀티 핸들 및 공유 핸들을 해제하십시오. 그렇지 않으면 메모리 누출이 발생할 수 있습니다.
? Curl_multi_Select ()와 결합 : CPU 점유율을 100%피하기 위해 네트워크 활동을 기다립니다.
높은 동시 인터페이스 응집 요청.
많은 수의 페이지 나 파일의 대량 크롤링.
웹 사이트 모니터링 및 건강 점검.
CDN 또는 캐시 워밍업.
curl_multi_exec () 및 curl_share_init ()를 사용하면 진정한 동시성을 달성 할 수있을뿐만 아니라 리소스 공유를 통해 중복 작업을 줄일 수있어 동시 네트워크 요청을 처리 할 때 PHP가보다 효율적이고 안정적입니다.
실제 애플리케이션에서 최적화 병목 현상이 발생하면 연결 풀링, 작업 예약, 예외 처리 및 기타 수단을 추가하여 전체 솔루션을 개선 할 수 있습니다.