PHP 개발에서 RESTFul 인터페이스에 대한 빈번한 호출은 특히 마이크로 서비스 아키텍처에서 매우 일반적인 시나리오입니다. 다른 서비스 간의 커뮤니케이션은 종종 HTTP 요청에 달려 있습니다. CURL은 HTTP 요청을 처리하기 위해 PHP에서 가장 일반적으로 사용되는 확장입니다. 단일 요청의 성능 오버 헤드는 일반적으로 허용되지만 동시 동시성 시나리오에서는 각 요청이 연결 리소스를 반복적으로 초기화하면 상당한 성능 병목 현상이 발생합니다.
현재 Curl_share_init () 함수는 편리합니다. 다중 컬 핸들이 DNS 캐시, SSL 세션 등과 같은 정보를 공유 할 수있는 리소스 공유 메커니즘을 제공하여 연결 설정 시간을 줄이고 전체 인터페이스 요청의 효율성을 향상시킵니다.
Curl_share_init () 는 CURL에서 제공하는 리소스 공유 초기화 함수이며 CURL 공유 핸들을 반환합니다. 이 핸들을 사용하면 특정 리소스를 공유하도록 여러 컬 요청을 구성 할 수 있습니다.
DNS 캐시 ( curlshopt_share 및 curl_lock_data_dns )
쿠키 ( curlshopt_share 및 curl_lock_data_cookie )
ssl sessions ( curlshopt_share 및 curl_lock_data_ssl_session )
이러한 공유 데이터는 요청 당 반복 계산 및 핸드 셰이크를 크게 줄일 수 있습니다.
예를 들어 여러 서비스 인터페이스를 동시에 요청해야한다고 가정합니다.
https://api.m66.net/service1
https://api.m66.net/service2
https://api.m66.net/service3
다음은 curl_share_init ()를 사용하여 리소스 공유를 구현하는 완전한 PHP 예입니다.
<?php
// 공유 핸들을 초기화하십시오
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
// 요청합니다 URL 정렬
$urls = [
'https://api.m66.net/service1',
'https://api.m66.net/service2',
'https://api.m66.net/service3',
];
// 초기화 curl_multi 핸들
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $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($mh, $ch);
$handles[] = $ch;
}
// 동시 요청을 수행하십시오
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
// 결과를 얻으십시오
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo "Response: " . $response . "\n";
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
// 리소스 정리
curl_share_close($sh);
curl_multi_close($mh);
?>
curl_share_init ()를 사용하는 이점은 주로 다음 측면에 반영됩니다.
DNS 캐시 공유 : 특히 여러 요청이 동일한 도메인 이름에 액세스 할 때 각 요청에 대한 반복 도메인 이름 해상도를 피하십시오. 이점은 분명합니다.
SSL 세션 재사용 : SSL 핸드 셰이크 오버 헤드 감소, 특히 HTTPS 인터페이스 호출이 빈번한 시나리오에서 CPU 리소스를 저장합니다.
연결 효율성 향상 : HTTP Keep-Alive와 함께 사용하면 인터페이스 요청 효율을 크게 향상시킬 수 있습니다.
여러 인터페이스가 자주 호출되는 높은 동시성 환경 또는 응용 시나리오에서는 Curl_share_init () 의 합리적인 사용으로 시스템의 전반적인 성능 및 응답 속도가 크게 향상 될 수 있습니다.
모든 자원이 공유, 특히 쿠키 공유에 적합한 것은 아니며, 이는 보안 또는 상태 오염 문제를 유발할 수 있습니다.
공유 리소스에서 사용한 모든 컬 핸들이 닫힌 후에 공유 리소스를 닫아야합니다.
모든 PHP 설치가 CURL 공유 지원을 활성화 한 것은 아니며 Curl_version () 을 통해 지원 상태를 확인할 수 있습니다.