PHP의 컬 확장을 사용하여 대량의 HTTP 요청을 할 때 성능 병목 현상 : DNS 중복 해상도가 발생할 수 있습니다. 요청할 때마다 컬은 도메인 이름을 한 번 구문 분석해야하므로 특히 동일한 도메인 이름으로 여러 요청을 할 때 추가 시간을 오버 헤드로 가져올 수 있습니다. 다행히도 PHP는 DNS 캐시를 공유 하여이 문제를 피할 수있는 함수를 제공합니다. 이 기사에서는 사용 방법을 보여줍니다.
curl_share_init ()는 공유 핸들을 생성하기 위해 CURL Extension에서 제공하는 함수입니다. 이 공유 핸들은 DNS 캐시, 쿠키, SSL 세션 등과 같은 여러 컬 세션간에 특정 리소스를 공유 할 수 있습니다.
공유 DNS 캐시를 활성화하면 여러 요청은 도메인 이름을 한 번만 해결하면됩니다. 후속 요청은 결과를 직접 재사용하여 네트워크 대기 시간을 크게 줄일 수 있습니다.
간단한 예제 코드를 사용하여 사용 방법을 설명하겠습니다.
<?php
// 만들다 cURL 공유 핸들
$sh = curl_share_init();
// 공유 옵션을 설정하십시오,할 수 있게 하다 DNS 공유
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
$urls = [
'https://m66.net/api/data1',
'https://m66.net/api/data2',
'https://m66.net/api/data3',
];
foreach ($urls as $url) {
$ch = curl_init();
// 설정 URL 그리고 다른 필요한 옵션
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 绑定공유 핸들
curl_setopt($ch, CURLOPT_SHARE, $sh);
// 요청을 실행하십시오
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo '실수: ' . curl_error($ch) . PHP_EOL;
} else {
echo '응답: ' . $response . PHP_EOL;
}
// 폐쇄 cURL 세션
curl_close($ch);
}
// 폐쇄공유 핸들
curl_share_close($sh);
?>
1 ??? 공유 핸들을 만듭니다 <br> 우리는 curl_share_init ()를 사용하여 공유 핸들 $ sh를 만듭니다.
2 ?? 공유 자원을 설정하십시오 <br> curl_share_setopt ()를 사용하여 공유 DNS 데이터 ( Curl_Lock_Data_dns )를 지정합니다.
3 ???? 각 컬 세션에서 공유 핸들을 바인딩 <br> curl_setopt () 에서 curlopt_share를 사용하여 공유 핸들을 현재 컬 핸들 $ ch 에 연결하십시오.
4 ?? 손잡이를 닫습니다 <br> 모든 요청을 완료 한 후 curl_share_close ()를 사용하여 공유 핸들을 해제해야합니다.
모든 요청이 완료된 후에 공유 핸들을 닫아야합니다.
프로그램에서 여러 스레드 또는 동시 요청이 동시에 실행되는 경우 레이스 조건을 방지하기 위해 자원을 잠그는 데주의해야합니다.
쿠키, SSL 및 기타 데이터를 공유 할 때 동일한 방법을 사용할 수 있으며 Curl_Lock_Data_* 상수를 교체하십시오.
API 집계, 배치 크롤링 및로드 테스트와 같은 동일한 도메인 이름에 대한 많은 요청과 관련된 시나리오의 경우 DNS 중복 해상도를 피하면 DNS 쿼리 속도 및 서버 대기 시간에 따라 DNS 중복 해상도를 피하면 일반적으로 약 10% ~ 30%의 성능 향상이 발생할 수 있습니다. 모든 시나리오를 크게 향상시킬 수는 없지만 간단하고 거의 비용이없는 최적화 방법입니다.