PHP에서 Curl은 HTTP 요청을 수행하기위한 매우 일반적인 라이브러리입니다. 개발자에게 다른 서버와 상호 작용하는 유연하고 효율적인 방법을 제공합니다. 일반적으로 curl_init ()을 사용하여 컬 세션을 초기화하고 Curl_Exec ()을 사용하여 요청을 실행 한 다음 Curl_Close ()를 사용하여 세션을 닫고 리소스를 확보합니다.
그러나 코드에서 여러 CURL 요청을 실행할 때 Curl_Close () 함수를 사용하면 특히 여러 병렬 요청을 사용할 때 모든 연결을 즉시 닫지 않을 수 있습니다. 이 문제의 이유는 CURL 요청이 비동기 적으로 실행되기 때문입니다. Curl_Close ()는 단순히 현재 CURL 세션 객체를 닫고 하단의 모든 네트워크 연결을 즉시 파괴 할 수 없습니다.
여러 요청을 실행할 때, 특히 여러 병렬 요청이 이루어질 때 이러한 요청을 처리하는 데 다중 스레드 메커니즘이 사용됩니다. 이러한 요청은 기본 연결 풀에서 관리되며 요청이 완전히 완료되면 Curl_Exec ()가 즉시 반환되지 않습니다. 실제로 요청이 완료되기를 기다리는 동안 기본 네트워크 연결과 상호 작용 하며이 프로세스는 Curl_Close () 의 직접적인 영향을받지 않습니다.
Curl_Close () 함수의 기능은 CURL 세션을 닫고 세션과 관련된 리소스를 릴리스하는 것입니다. 그러나 세션을 마감한다고해서 모든 연결이 즉시 릴리스된다는 의미는 아닙니다. 특히 여러 요청이 병렬로 실행되면 연결 종료 및 리소스 릴리스가 지연 될 수 있습니다. CURL 라이브러리는 여러 요청에 연결 풀을 사용하고 여러 요청이 완료 될 때까지 즉시 모든 연결을 지우지 않기 때문입니다.
// 다중 생성 cURL 세션
$ch1 = curl_init('http://gitbox.net/example1');
$ch2 = curl_init('http://gitbox.net/example2');
$ch3 = curl_init('http://gitbox.net/example3');
// 요청 옵션을 설정합니다
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
// 요청 및 저장 결과를 실행하십시오
$response1 = curl_exec($ch1);
$response2 = curl_exec($ch2);
$response3 = curl_exec($ch3);
// 关闭세션
curl_close($ch1);
curl_close($ch2);
curl_close($ch3);
위의 코드에서는 Curl_Close ()를 호출하여 각 컬 세션을 닫지 만 연결 종료는 즉시 발생하지 않습니다. CURL은 모든 요청이 완료 될 때까지 요청의 일부 중간 프로세스가 처리되도록 계속 연결을 계속 유지합니다.
CURL 효율성을 향상시키기 위해, 특히 여러 요청이 수행 될 때 연결 풀이 유지됩니다. 요청이 완료 될 때마다 연결은 즉시 닫히지 않지만 다음 사용을 위해 연결 풀로 반환됩니다. 이 연결 멀티플렉싱 방법은 각 요청에 대한 연결을 다시 설정할 필요가 없기 때문에 요청의 성능을 크게 향상시킵니다.
그러나이 접근법은 Curl_Close () 를 통해 특정 컬 세션을 닫지 만 연결 풀의 연결이 모든 요청이 완료 될 때까지 정리하는 것이 지연 될 수 있음을 의미합니다. 또는 CURL이 현재 요청 시퀀스를 완전히 처리합니다.
모든 연결이 마지막에 닫혀 있는지 확인 해야하는 경우 CURL_MULTI_* 함수를 사용하여 여러 병렬 요청을 관리 할 수 있습니다. Curl_multi_* 일련의 함수를 사용하면 여러 컬 세션의 실행 상태를 병렬로 관리 할 수 있으므로 연결을 닫기 전에 모든 요청이 완료되도록합니다. 아래 그림과 같이 :
// 다중 생성 cURL 세션
$ch1 = curl_init('http://gitbox.net/example1');
$ch2 = curl_init('http://gitbox.net/example2');
$ch3 = curl_init('http://gitbox.net/example3');
// 요청 옵션을 설정합니다
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
// acURL多세션句柄
$mh = curl_multi_init();
// 将세션添加到多세션句柄中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
curl_multi_add_handle($mh, $ch3);
// 执行多세션请求
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
// 요청이 완료 될 때까지 기다리십시오
curl_multi_select($mh);
}
} while ($active);
// 关闭所有세션
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_remove_handle($mh, $ch3);
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);
curl_close($ch3);
Curl_multi_*를 사용하면 여러 세션이 완료된 후 모든 연결이 완전히 정리되고 닫히므로 모든 요청이 완료된 후에 기본 연결이 완전히 해제 될 수 있습니다.
CURL을 사용하여 PHP에서 여러 요청을 수행 할 때 Curl_Close ()는 특히 병렬 요청의 경우 모든 연결을 즉시 닫지 않습니다. Curl은 연결 풀을 사용하여 멀티 플렉스 연결을 사용하여 성능을 향상시키기 때문에 연결 종료가 지연 될 수 있기 때문입니다. 모든 연결을 제 시간에 해제 할 수 있도록 CURL_MULTI_* 함수를 사용하여 병렬 요청을 관리 할 수 있으므로 모든 요청이 완료된 후 모든 연결이 닫히도록 할 수 있습니다. 이 방법은 연결 릴리스 문제를 해결할뿐만 아니라 요청 실행의 효율성을 향상시킵니다.