PHP에서 Curl_multi_* 일련의 함수는 동시에 여러 HTTP 요청을 시작하는 강력한 방법을 제공하여 프로그램의 동시성 성능을 향상시킵니다. 그 중에서 Curl_multi_Close ()는 자원을 정리하는 데 사용되는 기능입니다. 모든 동시 요청이 완료된 후에 호출되며 기본 리소스를 공개하는 데 중요한 단계입니다. 그러나 부적절하게 사용하면 메모리 누출이 발생하거나 요청이 완전히 종료되지 않을 수 있습니다.
이 기사는 실제 코드 예제를 사용하여 Curl_multi_Close ()를 올바르게 사용하여 장기적인 요청을 종료하는 방법을 설명합니다.
curl_multi_close ()는 curl_multi_init () 에 의해 페어링 된 최종 함수입니다. 그 목적은 멀티 핸들 리소스를 닫고 관련된 모든 리소스를 해제하는 것입니다. 이 멀티 핸들에 추가 된 각 개별 컬 핸들을 자동으로 닫지 않으므로 수동으로 처리해야합니다.
다음은 Curl_Multi_* 일련의 함수를 사용하여 여러 HTTP 요청을 실행하고 리소스를 올바르게 마무리하는 표준 프로세스입니다.
<?php
// 요청 된 것을 만듭니다 URL 정렬
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3',
];
// 초기화 multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];
// 각각에 대해 URL 초기화单独的 curl 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;
}
// 모든 요청을 수행하십시오
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($running) {
curl_multi_select($multiHandle); // 피하다 CPU 너무 높은 점유
}
} while ($running && $status == CURLM_OK);
// 결과를 처리하고 각각을 닫습니다 curl handle
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
$info = curl_getinfo($ch);
echo "요청 상태 코드: " . $info['http_code'] . "\n";
echo "응답 내용: " . substr($response, 0, 100) . "...\n"; // 콘텐츠 만 표시하십시오
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 마지막으로 multi handle
curl_multi_close($multiHandle);
오류 : 손잡이를 제거하지 않고 멀티 핸들을 닫습니다
// 잘못된 사용
curl_close($ch); // 먼저 닫습니다 curl handle
curl_multi_close($mh);
올바른 순서는 다음과 같습니다.
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
curl_multi_close($mh);
오류 : 모든 요청이 완료되기를 기다리지 않습니다
일부 개발자는 Curl_Multi_Select ()를 직접 또는 CURL_MULTI_EXEC () 직후에 직접 건너 뛰거나 직접 닫으므로 일부 요청이 완료되지 않습니다. do-while 루프 사용은 모든 요청이 완료되도록 신뢰할 수있는 방법입니다.
장기적인 요청 (예 : 큰 파일 다운로드 또는 원격 계산)의 경우 다음 방법을 제어 할 수 있습니다.
합리적인 curlopt_timeout을 설정하십시오
CPU 사용량을 줄이려면 Curl_Multi_Select () 를 사용하십시오
Curl_Multi_INFO_READ ()에 의해 반환 된 상태를 확인하고 처리합니다.
예제 (시간 초과 컨트롤 추가) :
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 최대 실행 시간을 설정하십시오30두번째
curl_multi_close () 자체는 복잡하지는 않지만 Resource가 완전히 해제되도록 Curl_Multi_Remove_Handle () 및 Curl_Close () 와 함께 사용해야합니다. 동시 동시성 요청 시나리오에서는 컬러 핸들을 표준적으로 폐쇄하는 것이 자원 누출을 피하고 프로그램 안정성을 향상시키는 열쇠입니다.
멀티 스레드 네트워크 요청을 사용하는 경우 다음 순서를 명심하십시오.
멀티 핸들에 단일 핸들을 추가하십시오
멀티 핸들을 실행하십시오
결과를 얻으십시오
단일 핸들을 제거하고 닫습니다
마지막으로 멀티 핸들을 닫습니다
위의 방법을 통해 Curl_multi_* 시리즈 기능을 효율적으로 사용하고 모든 연결을 올바르게 종료하여 코드의 유지 관리 및 작동 효율성을 향상시킬 수 있습니다.