PHP에서 효율적인 네트워크 요청을 할 때는 종종 CURL을 사용하여 HTTP 요청을 시작해야합니다. 그러나 여러 CURL 요청간에 특정 자원 (예 : 쿠키, 파일 디스크립터 등)을 공유 해야하는 경우 전통적인 CURL 요청은 리소스 경쟁 및 동기화 문제를 경험할 수 있습니다. 이 문제를 해결하기 위해 PHP는 CURL_SHARE_INIT 기능을 제공하여 여러 컬 핸들간에 리소스를 공유하는 데 도움이됩니다. 이 기사는 Curl_share_init을 사용하여 여러 PHP 하위 프로세스에서 공유 리소스 동기화를 달성하는 방법을 자세히 살펴 봅니다.
curl_share_init는 공유 컬 핸들을 생성하는 PHP의 함수입니다. 여러 컬 요청이 자원을 공유하도록 도울 수 있습니다. 공유 리소스는 쿠키, 파일 디스크립터, DNS 캐시 등이 될 수 있습니다. 공유 리소스를 사용하면 각 CURL 요청이 동일한 정보를 반복적으로로드하여 프로그램의 효율성을 향상시키는 것을 방지 할 수 있습니다.
CURL 공유 리소스는 높은 동시성 시나리오에서 매우 유용합니다. 예를 들어, 여러 CURL 요청이 모두 동일한 웹 사이트에 액세스 해야하는 경우 쿠키를 공유하여 요청할 때마다 로그인 정보를 다시 구입하지 않음으로써 여러 요청의 세션 상태를 시뮬레이션 할 수 있습니다. 또한 공유 DNS 캐시를 사용하면 빈번한 DNS 쿼리를 줄이고 성능을 향상시킬 수 있습니다.
Curl_share_init은 여러 컬 핸들과 관련 될 수있는 공유 리소스 핸들을 만드는 데 사용됩니다. 사용하기위한 기본 단계는 다음과 같습니다.
curl_share_init을 사용하여 공유 핸들을 만듭니다.
특정 리소스 (예 : 쿠키, DN, 파일 설명자 등)를 공유하도록 공유 핸들을 구성하십시오.
공유 핸들을 여러 컬 요청과 연결하십시오.
컬 요청을 수행하고 자원을 공유하는지 확인하십시오.
마지막으로 공유 핸들과 컬 핸들을 해제하십시오.
<?php
// 공유 핸들을 초기화하십시오
$share = curl_share_init();
// 공유 리소스를 구성합니다(예를 들어 cookies)
curl_share_setopt($share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
// 다중 생성 cURL 핸들
$curl1 = curl_init('http://m66.net/api/endpoint1');
$curl2 = curl_init('http://m66.net/api/endpoint2');
// 将共享핸들与 cURL 핸들关联
curl_setopt($curl1, CURLOPT_SHARE, $share);
curl_setopt($curl2, CURLOPT_SHARE, $share);
// 다른 설정 cURL 옵션
curl_setopt($curl1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl2, CURLOPT_RETURNTRANSFER, true);
// 요청을 실행하십시오
$response1 = curl_exec($curl1);
$response2 = curl_exec($curl2);
// 출력 결과
echo "Response 1: " . $response1 . "\n";
echo "Response 2: " . $response2 . "\n";
// 리소스를 자유롭게합니다
curl_share_close($share);
curl_close($curl1);
curl_close($curl2);
?>
위의 코드에서 먼저 curl_share_init $ share 로 공유 핸들을 생성 한 다음 curl_share_setopt를 사용하여 공유 핸들을 구성하여 쿠키 데이터를 공유합니다. 다음으로, 우리는 두 개의 컬 핸들 $ curl1 과 $ curl2를 만들고 curlopt_share 옵션을 통해 공유 핸들을 연결합니다. 요청을 실행 한 후 컬 핸들과 공유 핸들을 닫았습니다.
다중 프로세스 환경에서, 특히 PHP의 PCNTL_FORK를 사용하여 여러 자식 프로세스를 생성 할 때 CURL_SHARE_INIT를 사용하여 리소스를 공유 할 수도 있습니다. 각 어린이 프로세스는 동일한 리소스를 공유하여 중복 리소스 초기화를 피하고 리소스 동기화를 가능하게합니다.
<?php
// 공유 핸들을 초기화하십시오
$share = curl_share_init();
curl_share_setopt($share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
// 만들다 cURL 핸들
$curl1 = curl_init('http://m66.net/api/endpoint1');
$curl2 = curl_init('http://m66.net/api/endpoint2');
// 将共享핸들与 cURL 핸들关联
curl_setopt($curl1, CURLOPT_SHARE, $share);
curl_setopt($curl2, CURLOPT_SHARE, $share);
// 만들다하위 프로세스
$pid = pcntl_fork();
if ($pid == -1) {
// 오류 처리
die("Fork failed!");
} elseif ($pid == 0) {
// 하위 프로세스 1
curl_setopt($curl1, CURLOPT_RETURNTRANSFER, true);
$response1 = curl_exec($curl1);
echo "Child Process 1 Response: " . $response1 . "\n";
curl_close($curl1);
} else {
// 주요 과정
curl_setopt($curl2, CURLOPT_RETURNTRANSFER, true);
$response2 = curl_exec($curl2);
echo "Parent Process Response: " . $response2 . "\n";
curl_close($curl2);
// 等待하위 프로세스结束
pcntl_wait($status);
}
// 공유 리소스를 무료로 제공합니다
curl_share_close($share);
?>
이 예에서는 먼저 공유 리소스 핸들 $ 공유 및 공유 쿠키를 설정합니다. 그런 다음 PCNTL_FORK를 사용하여 자식 프로세스를 만들었습니다. 하위 프로세스에서는 하나의 컬 요청을 독립적으로 실행하고 기본 프로세스는 다른 요청을 실행합니다. 공유 리소스를 통해 주요 프로세스 및 하위 프로세스는 중복 리소스로드를 피할 수 있습니다.
다중 프로세스 환경에서 각 프로세스는 각 프로세스가 독립적으로 실행되고 공유 리소스에 대한 액세스가 동기화되도록 부모 프로세스의 파일 디스크립터 및 공유 리소스를 복사합니다.
curl_share_init을 사용하는 경우 요청이 완료된 후 리소스를 제거하기 위해 공유 핸들을 닫으십시오.
스레드는 PHP에서 직접 지원되지 않으므로 멀티 프로세스는 동시성을 달성하는 일반적인 방법입니다. 대규모 동시성을 처리 할 때는 PCNTL_FORK 및 CURL_SHARE_INIT를 결합하여 성능을 향상시키는 것을 고려할 수 있습니다.
curl_share_init을 사용하면 여러 PHP 아동 프로세스에서 공유 리소스를 동기화 할 수 있습니다. 이는 네트워크 요청 성능을 향상시키고 중복 리소스로드를 줄이는 데 매우 도움이됩니다. 특히 동시성이 높은 환경에서 공유 자원의 합리적인 사용은 불필요한 오버 헤드를 효과적으로 줄이고 시스템 효율성을 향상시킬 수 있습니다. PCNTL_FORK 및 CURL을 결합하여 자원을 공유함으로써 복잡한 동시 요청 및 자원 공유 문제를 더 잘 처리 할 수 있습니다.