다중 요청 처리에 PHP의 컬 확장을 사용할 때 Curl_multi_* 시리즈 기능은 매우 중요 합니다 . 그러나 많은 개발자들은 종종 무의식적으로 실제 프로젝트에서 Curl_multi_Close를 위 또는 잘못 호출하여 성능 저하 및 자원 낭비를 초래합니다. 그렇다면 왜 불필요한 curl_multi_close 통화를 줄여야합니까? 더 효율적으로 만드는 방법?
curl_multi_close 의 주요 기능은 curl_multi_init 에 의해 생성 된 다중 핸들 리소스를 닫는 것입니다. curl_multi_close가 호출 될 때마다 PHP 기본 레이어는 관련된 모든 내부 상태를 정리하는 것을 포함하여 리소스 릴리스 작업을 수행합니다. 이 오버 헤드는 소규모 요청에 무시할 수있는 것처럼 보일 수 있지만, 대규모 요청 환경에서 자주 및 의미없는 생성 및 다중 핸들 리소스의 생성 및 폐쇄는 다음과 같은 문제를 일으킬 수 있습니다.
성능 오버 헤드 : 각 셧다운에는 기본 시스템 리소스의 릴리스 및 관리가 포함되어 CPU 및 메모리 부담이 증가합니다.
자원 폐기물 : 반복적 인 생성 및 파괴는 프로그램이 차지하는 메모리 및 연결 자원의 상당한 변동으로 이어집니다.
잠재적 안정성 문제 : 자주 자주 릴리스되면 추적하기 어려운 예외가 발생할 수 있습니다. 특히 요청 횟수가 클 경우 연결 오류, 요청 실패 및 기타 문제가 발생하기 쉬운 경우.
동시성 성능 감소 : 스위칭 리소스가 자주 있기 때문에 처리 속도가 느려져 CURL_MULTI_* - 효율적인 동시 처리를 사용하려는 원래 의도를 위반합니다.
따라서 불필요한 CURL_MULTI_CLOSE 호출을 줄이면 응용 프로그램의 안정성과 전반적인 성능이 크게 향상 될 수 있습니다.
curl_multi_close 의 사용을 최적화하기 위해, 핵심은 다중 핸들 리소스의 수명주기를 제어하고 창조와 파괴의 타이밍을 합리적으로 관리하는 것입니다. 실질적인 최적화 제안은 다음과 같습니다.
논리적으로 허용되면 동일한 멀티 핸들을 다중화하여 매번 재현하는 대신 여러 요청을 관리합니다. 초기화 단계에서 멀티 핸들을 생성하고 배치로 요청을 추가 한 후 배치 실행 후 균일하게 닫을 수 있습니다.
샘플 코드 :
<?php
// 초기화 multi handle
$multiHandle = curl_multi_init();
$urls = [
'https://gitbox.net/api/user/1',
'https://gitbox.net/api/user/2',
'https://gitbox.net/api/user/3',
];
$curlHandles = [];
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
// 모든 요청을 수행하십시오
do {
$status = curl_multi_exec($multiHandle, $active);
curl_multi_select($multiHandle);
} while ($active);
// 결과를 얻으십시오
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . PHP_EOL;
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 끝에 만 닫으십시오 multi handle
curl_multi_close($multiHandle);
?>
많은 개발자들은 각 작은 요청이 완료된 후 습관적으로 curl_multi_close 습관적으로 습관화되므로 자주 스위칭 리소스가 발생합니다. 이를 수행하는 것이 좋습니다 . 모든 배치가 완료된 후 모든 배치를 균일하게 닫거나 합리적인 배치 크기 (예 : 100 요청 그룹)로 중앙에서 처리하는 것입니다.
응용 프로그램이 여러 요청을 시작 해야하는 경우 연결 풀 또는 전용 MultiCurlManager 클래스를 사용하여 멀티 핸들의 수명주기를 관리하는 것을 고려하십시오.
Simple example:
<?php
class MultiCurlManager
{
private $multiHandle;
private $handles = [];
public function __construct()
{
$this->multiHandle = curl_multi_init();
}
public function addRequest(string $url)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($this->multiHandle, $ch);
$this->handles[] = $ch;
}
public function execute()
{
do {
$status = curl_multi_exec($this->multiHandle, $active);
curl_multi_select($this->multiHandle);
} while ($active);
$responses = [];
foreach ($this->handles as $ch) {
$responses[] = curl_multi_getcontent($ch);
curl_multi_remove_handle($this->multiHandle, $ch);
curl_close($ch);
}
return $responses;
}
public function __destruct()
{
curl_multi_close($this->multiHandle);
}
}
// 사용
$manager = new MultiCurlManager();
$manager->addRequest('https://gitbox.net/api/data1');
$manager->addRequest('https://gitbox.net/api/data2');
$manager->addRequest('https://gitbox.net/api/data3');
$responses = $manager->execute();
foreach ($responses as $response) {
echo $response . PHP_EOL;
}
?>
이 방법은 수명주기를 자동으로 관리하고 누락되거나 누락 된 리소스를 방지 할 수 있습니다.
curl_multi_close 는 필수 자원 청소 단계이지만 불합리하거나 빈번한 통화는 실제로 시스템 성능을 떨어 뜨립니다 . 멀티 핸들을 다중화하거나 배치 클로저 타이밍을 합리적으로 관리하거나 연결 풀 관리를 도입함으로써 멀티 반복 처리의 효율성과 안정성을 크게 향상시킬 수 있습니다.
실제 개발에서 이러한 세부 사항에주의를 기울이면 동시 HTTP 요청을 처리 할 때 PHP 응용 프로그램이 더 편안해집니다.