대규모 API 크롤링 작업을 수행 할 때 성능 최적화가 중요합니다. PHP 및 CURL을 사용하는 개발자의 경우 Curl_share_init () 의 합리적인 사용은 시스템 자원 소비를 크게 줄이고 효율성을 향상시킬 수 있습니다. 이 기사는 기능, 사용 시나리오 및 코드에서 올바르게 구현하는 방법에 대해 자세히 소개합니다.
Curl_share_init ()는 공유 핸들 (CURL 공유 핸들)을 초기화하기 위해 PHP Curl Extension에서 제공하는 함수입니다. 핸들을 공유하면 DNS 캐시, SSL 세션 캐시, 쿠키 등과 같은 리소스를 공유 할 수 있습니다. 여러 컬 핸들 사이에 반복적 인 연결을 피하거나 도메인 이름의 반복적 인 해상도를 피하여 여러 동의 요청의 성능을 크게 향상시킬 수 있습니다.
요컨대,이 기능의 핵심 기능은 "자원 공유 및 중복 작업을 줄입니다"입니다.
예를 들어 수백 또는 수천 개의 HTTP 요청을 동시에 작성 해야하는 경우.
큰 REST API 데이터베이스를 크롤링하십시오.
여러 타사 데이터 소스를 정기적으로 동기화합니다.
동시성이 높은 동일한 API 엔드 포인트에 액세스하십시오.
각 요청이 DNS 쿼리와 SSL 핸드 셰이크를 개별적으로 설정하면 성능이 큰 폐기물을 유발할 수 있습니다. curl_share_init ()를 사용하면 이러한 요청이 부분 캐시를 공유하여 오버 헤드를 줄일 수 있습니다.
다음은 curl_share_init ()를 사용하여 대규모 API 크롤링 작업을 최적화하기위한 샘플 코드입니다.
<?php
// 공유 핸들을 초기화하십시오
$sh = curl_share_init();
// 공유 리소스 유형을 설정하십시오,우리는 여기서 공유합니다 DNS 그리고 Cookie
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
$urls = [
'https://m66.net/api/data1',
'https://m66.net/api/data2',
'https://m66.net/api/data3',
// 계속 더 추가 할 수 있습니다 API 주소
];
$multiHandle = curl_multi_init();
$curlHandles = [];
// 각각 초기화하십시오 cURL easy 핸들
foreach ($urls as $i => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 绑定共享핸들
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$i] = $ch;
}
// 동시 요청을 수행하십시오
$running = null;
do {
curl_multi_exec($multiHandle, $running);
curl_multi_select($multiHandle);
} while ($running > 0);
// 결과를 얻으십시오
foreach ($curlHandles as $i => $ch) {
$response = curl_multi_getcontent($ch);
echo "Response from {$urls[$i]}:\n";
echo $response . "\n";
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 자원을 자유롭게합니다
curl_share_close($sh);
curl_multi_close($multiHandle);
공유 리소스 설정 <br> Curl_share_setopt ()를 사용하여 공유 리소스 유형을 지정하는 데 일반적으로 사용됩니다.
curl_lock_data_dns : 공유 DNS 캐시.
curl_lock_data_cookie : 공유 쿠키.
curl_lock_data_ssl_session : SSL 세션을 공유하십시오.
프로세스에서 공유하지 마십시오
컬 공유 핸들은 동일한 프로세스에만 적용됩니다. 다중 프로세스 크롤링에는 다른 메커니즘 (예 : 외부 캐시 또는 데이터베이스)을 사용해야합니다.
자원을 올바르게 해제 <br> 크롤링 작업이 끝나면 메모리 누출을 피하기 위해 Curl_Share_Close () 및 Curl_Multi_Close ( )에게 전화하십시오.
DNS 및 SSL 세션 공유를 활성화하면 다음을 피할 수 있습니다.
동일한 도메인 이름을 반복하십시오 (특히 동일한 도메인의 많은 요청에 대해).
SSL 핸드 셰이크 (특히 HTTPS 요청)를 반복하십시오.
실제 테스트에서 수백 개의 동시 요청에 대해이 최적화는 CPU 및 네트워크로드를 크게 줄이고 전체 처리량을 향상시킬 수 있습니다.