PHP에서 동시 HTTP 요청이 높은 경우, 특히 많은 동시 연결이 포함될 때 동시 HTTP 요청을 할 때 자주 초기화 및 컬링 을 해제 할 수 있습니다. 이 문제를 해결하기 위해 Curl_share_init 함수는 DNS 캐시, 쿠키 등과 같은 특정 리소스를 공유하여 다중 스레드 또는 다중 프로세스 환경에서 실행 효율성을 향상시키는 방법을 제공합니다.
이 기사는 Curl_share_init 함수를 사용하는 방법을 소개하고 효율적인 공유 리소스 풀 관리 메커니즘을 구현하기 위해 객체 지향적 인 방식으로 캡슐화합니다.
curl_share_init () 는 libcurl에서 공유 핸들을 초기화하기 위해 제공하는 함수입니다. 여러 컬 핸들이 다음 리소스를 공유 할 수 있습니다.
쿠키 데이터
DNS 캐시
SSL 세션 정보
연결 풀
리소스 공유의 핵심은 curl_setopt를 사용하여 각 컬 핸들에 대한 공유 핸들을 설정하는 것입니다.
curl_setopt($ch, CURLOPT_SHARE, $shareHandle);
공유 핸들 자체는 curl_share_init () 에 의해 생성되며 curl_share_setopt () 를 통해 구성됩니다.
우리는 공유 핸들의 생성, 관리 및 파괴를 캡슐화하는 간단한 공유 리소스 풀 관리 클래스를 설계 할 수 있으며 멀티 스레드 환경에서 재사용을 지원합니다.
class CurlSharePool
{
private static $instance = null;
private $shareHandle;
private function __construct()
{
$this->shareHandle = curl_share_init();
curl_share_setopt($this->shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($this->shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
curl_share_setopt($this->shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
}
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function getShareHandle()
{
return $this->shareHandle;
}
public function __destruct()
{
if ($this->shareHandle) {
curl_share_close($this->shareHandle);
}
}
}
다음은 공유 리소스 풀을 사용하여 여러 HTTP 요청을 보내는 예입니다.
$urls = [
"https://m66.net/api/v1/data1",
"https://m66.net/api/v1/data2",
"https://m66.net/api/v1/data3"
];
$share = CurlSharePool::getInstance()->getShareHandle();
$multiHandle = curl_multi_init();
$curlHandles = [];
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SHARE, $share);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
$running = null;
do {
curl_multi_exec($multiHandle, $running);
curl_multi_select($multiHandle);
} while ($running > 0);
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . PHP_EOL;
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
curl_multi_close($multiHandle);
공유 핸들을 사용하는 것의 가장 큰 장점은 요청 당 DNS를 다시 제작하고 SSL 연결을 다시 설정하지 않으므로 높은 동시성 시나리오에서 효율성을 크게 향상시킬 수 있다는 것입니다. 캡슐화 클래스를 사용하면 자원 관리를 단순화하고 자원 누출을 피하고 나중에 유지 보수 및 확장에보다 도움이 될 수 있습니다.
Curl_share_init은 PHP에서 일반적이지 않지만 고성능 요구 사항을 가진 시스템에서 저렴한 최적화 방법을 제공합니다. 공유 핸들의 객체 관리 모델을 캡슐화함으로써보다 효율적이고 안정적인 자원 재사용을 달성하여 전체 시스템의 응답 속도 및 동시 기능을 향상시킬 수 있습니다.
실제 애플리케이션에서는 스레드 안전을 보장하기위한 스레드 잠금 메커니즘을 도입하고 여러 리소스 유형의 정책 구성을 지원하는 것과 같은 스레드 잠금 메커니즘을 도입하는 등이 유형을 더욱 확장 할 수 있습니다.이 기사가 고성능 PHP 개발에 대한 실질적인 참조 및 영감을 제공 할 수 있기를 바랍니다.