PHP에서 CURL은 HTTP, HTTPS, FTP 등과 같은 여러 프로토콜을 통해 요청을 보낼 수있는 강력한 라이브러리입니다. Curl_multi_* 일련의 함수는 동시에 여러 비동기 요청을 발행하여 성능을 향상시키고 요청 시간을 줄일 수 있습니다. 비동기 요청은 특히 여러 HTTP 요청이 필요한 경우 매우 유용합니다.
그러나 비동기 요청에 CURL_MULTI_* 함수를 사용할 때는 공통된 함정이 있습니다 : 반복적으로 연결 . CURL_MULTI_CLOSE 기능을 통해 CURL 세션을 닫으면 연결이 제대로 관리되지 않으면 일부 연결이 올바르게 닫히지 않기 전에 반복적으로 닫혀 오류 또는 메모리 누출을 유발할 수 있습니다.
이 기사에서는 PHP에서 Curl_multi_Close를 올바르게 사용하여 비동기 요청을 관리하고 반복적 인 연결 폐쇄를 피하는 방법을 보여줍니다.
먼저 PHP의 Curl_multi_* 시리즈 기능을 사용하여 여러 비동기 요청을 시작하는 방법을 살펴 보겠습니다. 다음은 기본 예입니다.
<?php
// 다중 생성 cURL 세션
$ch1 = curl_init();
$ch2 = curl_init();
// 설정 cURL 요청 옵션
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/endpoint1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/endpoint2');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// 만들다 cURL 여러 핸들
$mh = curl_multi_init();
// 각각을 넣으십시오 cURL 세션加入여러 핸들
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// 비동기 요청을 수행하십시오
do {
$status = curl_multi_exec($mh, $active);
} while ($active);
// 각 요청의 결과를 얻으십시오
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 출력 결과
echo "Response 1: " . $response1 . "\n";
echo "Response 2: " . $response2 . "\n";
// 关闭세션
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);
?>
이 예에서는 두 개의 컬 세션을 생성하고 요청 URL을 설정하고 Curl_multi_* 함수를 사용하여 동시에 두 개의 비동기 요청을 발행합니다. curl_multi_exec은 모든 요청이 완료 될 때까지 실행됩니다. 그런 다음 Curl_multi_getContent를 사용하여 반환 결과를 얻고 모든 세션을 닫습니다.
위의 코드에서 Curl_multi_close를 사용하여 Curl Multi-Handle을 닫고 Curl_Close를 사용하여 각 개별 컬 세션을 닫습니다. 이것은 일반적인 관행이지만 Curl_multi_Close는 여러 핸들을 닫는 데 책임이 있으며 각 세션 핸들을 닫지 않는다는 점에 유의해야합니다. 따라서 curl_multi_close를 닫은 후에도 각 curl_close는 여전히 curl_close를 통해 닫아야합니다.
문제 : 경우에 따라 Curl_Close 또는 Curl_Multi_Close를 반복적으로 호출하면 연결이 반복적으로 닫히는 문제가 발생할 수 있습니다. 이를 피하기 위해 두 가지 방법을 수행 할 수 있습니다.
각 핸들이 한 번만 닫혀 있는지 확인하십시오 <br> 루프 나 처리 중에 실수로 특정 세션을 반복적으로 닫을 수 있습니다. 이 문제를 피하기 위해 닫을 때 마크를 만들 수 있으며 각 핸들이 한 번만 닫히도록 할 수 있습니다.
먼저 핸들을 제거한 다음 닫습니다 <br> Curl_multi_Remove_handle을 사용하여 핸들을 제거하고 닫을 때 각 핸들이 여러 핸들에서 제거되도록합니다. 이것은 curl_multi_close가 호출 될 때 닫힌 핸들이 나타나는 것을 피합니다.
반복적 인 연결 폐쇄를 피하기 위해 코드를 개선했습니다.
<?php
// 다중 생성 cURL 세션
$ch1 = curl_init();
$ch2 = curl_init();
// 설정 cURL 요청 옵션
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/endpoint1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/endpoint2');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// 만들다 cURL 여러 핸들
$mh = curl_multi_init();
// 각각을 넣으십시오 cURL 세션加入여러 핸들
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// 비동기 요청을 수행하십시오
do {
$status = curl_multi_exec($mh, $active);
} while ($active);
// 각 요청의 결과를 얻으십시오
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 출력 결과
echo "Response 1: " . $response1 . "\n";
echo "Response 2: " . $response2 . "\n";
// 移除句柄后再关闭세션
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// 올바르게 닫습니다
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);
?>
curl_multi_* 함수를 사용하여 성능을 향상시키기위한 여러 비동기 요청을 효과적으로 시작하십시오.
컬 세션을 닫을 때 Curl_multi_Remove_handle을 사용하여 세션을 제거한 다음 Curl_Multi_Close를 호출하십시오.
각 컬 세션은 Curl_Multi_Close 에서 반복적 인 닫기를 피하기 전에 Curl_Close를 통해 닫아야합니다.
연결 폐쇄를 올바르게 관리함으로써 반복적 인 연결 폐쇄를 피하여 코드가 더 안정적이고 효율적인지 확인할 수 있습니다.