PHP에서 CURL 은 강력하고 일반적으로 사용되는 네트워크 요청 도구이며 Curl_multi_* 일련의 기능을 통해 우리를 허용합니다. 이것은 고성능 인터페이스 집계, 비동기 요청 등과 같은 시나리오에서 매우 유용합니다.
그러나 많은 개발자는 종종 Curl_multi_* , 특히 Curl_multi_Close () 를 사용할 때 자원 릴리스 프로세스를 무시합니다. 이 기사는 표준 프로세스를 메인 라인으로 취하며 curl_multi_init to curl_multi_close 의 전체 사용법을 단계별로 이해하게되며 코드 예제가 보충됩니다.
Curl_multi_* PHP가 제공하는 일련의 기능은 다중 동시 컬 핸들을 관리하기 위한 도구입니다. 이는 기존의 단일 컬 요청과 다릅니다. 이는 여러 HTTP 요청을 동시에 시작하여 응답 효율을 향상시킬 수 있습니다.
이러한 기능을 사용하면 다음 단계로 나눌 수 있습니다.
멀티 핸들 초기화 : curl_multi_init ()
여러 컬 요청 추가 (쉬운 핸들) : curl_multi_add_handle ()
요청 실행 : curl_multi_exec () 및 curl_multi_select ()
응답 내용 가져 오기 : curl_multi_getContent ()
쉬운 핸들을 제거하고 닫습니다 : curl_multi_remove_handle () 및 curl_close ()
멀티 핸들 닫기 : curl_multi_close ()
다음은 세 가지 다른 URL을 동시에 요청해야한다고 가정 할 때 표준 다중 요청 프로세스입니다.
<?php
// 요청합니다 URL 목록
$urls = [
"https://gitbox.net/api/service1",
"https://gitbox.net/api/service2",
"https://gitbox.net/api/service3"
];
// 초기화 multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];
// 1. 각각에 대해 URL a curl easy handle 그리고 추가하십시오 multi handle 가운데
foreach ($urls as $i => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$i] = $ch;
}
// 2. 구현하다 multi 묻다
$active = null;
do {
$mrc = curl_multi_exec($multiHandle, $active);
// 인터넷을 기다리고 있습니다 I/O 준비하십시오,피하다 CPU 너무 높은 점유
if ($mrc == CURLM_OK) {
curl_multi_select($multiHandle);
}
} while ($active > 0 && $mrc == CURLM_OK);
// 3. 콘텐츠와 깨끗한 손잡이를 얻으십시오
$responses = [];
foreach ($curlHandles as $i => $ch) {
// 응답 내용을 얻으십시오
$responses[$i] = curl_multi_getcontent($ch);
// 싱글을 제거하고 닫으십시오 handle
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 4. 마지막으로 multi handle,리소스를 자유롭게합니다
curl_multi_close($multiHandle);
// 출력 결과
foreach ($responses as $index => $body) {
echo "Response from URL #{$index}: \n";
echo $body . "\n\n";
}
curl_multi_close ()는 즉시 쉬운 핸들을 파괴하지는 않지만 (먼저 제거하고 닫아야 함) 멀티 핸들 자체가 차지하는 기본 자원을 자유롭게하는 책임이 있습니다. 호출하는 것을 잊어 버리면 상주 프로세스와 같은 장기 실행 스크립트에서 메모리 누출 또는 파일 디스크립터 소진이 발생할 수 있습니다.
요약 : curl_multi_init ()를 사용하는 모든 스크립트는 curl_multi_close () 로 끝나야합니다!
차단 및 고착을 요청 하시겠습니까?
curl_multi_select () 가 올바르게 사용되는지 확인하십시오.
curl_setopt (..., curlopt_returntransfer, true) 가 놓치지 않도록하십시오.
메모리 누출 또는 연결 예외?
curl_multi_remove_handle () 및 curl_close () 가 각 요청 후 호출됩니까?
curl_multi_close ()가 마침내 호출됩니까?
Curl_multi_*는 네트워크 요청을 동시에 처리 할 때 매우 효율적인 수단을 제공합니다. curl_multi_init () 에서 curl_multi_close () 로의 전체 프로세스를 마스터하면 코드 성능 및 리소스 관리 기능을 효과적으로 향상시킬 수 있습니다.
이 세 가지 "필수"를 기억하십시오.
각 요청은 멀티 핸들에 추가되어야합니다.
각 요청을 완료하면 제거하고 닫아야합니다.
마지막으로, Multi Resource를 제거하려면 curl_multi_close ()가 호출되어야합니다.
표준화 된 프로세스 및 리소스 관리를 통해 PHP 동시 요청은보다 강력하고 효율적입니다.