많은 동시 HTTP 요청을 만들 때 Curl_multi_* PHP가 제공하는 일련의 함수는 스크립트에서 동시에 여러 요청을 시작하여 실행 효율성을 향상시킬 수있는 매우 실용적인 도구입니다. 그 중에서 Curl_multi_Close () 는 전체 프로세스의 마지막 단계입니다. Curl_Multi_Init ()에 의해 초기화 된 리소스를 정리하여 모든 CURL 핸들이 제대로 닫히도록하여 자원 누출의 숨겨진 위험이 없습니다. 이 기사는 모든 동시 요청이 완료된 후 모든 컬 세션을 우아하게 닫는 방법을 자세히 설명하기 위해 완전한 예제를 사용합니다.
동시 요청에 Curl_multi_*를 사용하는 경우 일반 프로세스는 다음과 같습니다.
curl_multi 컨테이너를 초기화하십시오.
여러 컬 요청을 생성하고 curl_multi 컨테이너에 추가하십시오.
curl_multi_exec을 사용하여 모든 요청의 실행을 유도하십시오.
루프는 요청이 완료되었는지 확인합니다.
각 컬 요청의 결과를 별도로 처리하십시오.
각 개별 컬 핸들을 제거합니다.
Curl_multi_Close ()를 사용하여 리소스를 해제하십시오.
다음은 모든 요청이 완료된 후 여러 URL을 동시에 요청하고 자원을 우아하게 닫는 방법을 보여주는 예입니다.
<?php
// 동시 요청을 보내려면 URL 목록
$urls = [
"https://gitbox.net/api/data1",
"https://gitbox.net/api/data2",
"https://gitbox.net/api/data3"
];
// 초기화 curl_multi 핸들
$multiHandle = curl_multi_init();
$curlHandles = [];
// 각각에 대해 URL 별도를 만듭니다 curl 핸들,그리고 가입 multi 핸들
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10
]);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
// 모든 요청을 수행하십시오
$active = null;
do {
$mrc = curl_multi_exec($multiHandle, $active);
// curl_multi_select 활성 연결이있을 때까지 차단하십시오
if ($active) {
curl_multi_select($multiHandle);
}
} while ($active && $mrc == CURLM_OK);
// 각 요청의 결과를 얻으십시오
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
$info = curl_getinfo($ch);
$error = curl_error($ch);
echo "URL: " . $info['url'] . PHP_EOL;
echo "HTTP Code: " . $info['http_code'] . PHP_EOL;
echo "Response: " . $response . PHP_EOL;
echo "Error: " . $error . PHP_EOL;
echo str_repeat("-", 40) . PHP_EOL;
// 移除并폐쇄핸들
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 마침내,폐쇄 multi 핸들
curl_multi_close($multiHandle);
?>
모든 핸들이 제거 된 후에 만 호출 : curl_multi_close ()를 호출하기 전에 먼저 curl_multi_remove_handle ()을 통해 멀티 컨테이너에서 모든 클론 핸들을 제거한 다음 curl_close ()를 하나씩 호출해야합니다. 그렇지 않으면 리소스가 공개되거나 행동 적 불확실하지 않을 수 있습니다.
클론 핸들은 자동으로 닫히지 않습니다 . curl_multi_close ()는 멀티 컨테이너 자체 만 닫히고 내부 컬 핸들을 자동으로 닫지 않습니다. curl_init () 가 생성 한 각 핸들을 수동으로 닫아야합니다.
통화 시간 : curl_multi_close ()는 전체 프로세스에서 실행하는 마지막 단계 여야합니다. 통화는 전체 동시 요청 수명주기의 공식 끝입니다.
curl_multi_init () 및 curl_multi_close ()를 올바르게 사용하면 PHP에서 동시 네트워크 요청을 효율적으로 수행하면서 사용 후 리소스를 올바르게 해제하여 메모리 누출 또는 연결 예외를 피할 수 있습니다. 기억하십시오 : 각 curl_init () 는 curl_close () 에 해당하고 각 curl_multi_init ()는 curl_multi_close () 에 해당하여 코드가 더 강력하고 신뢰할 수 있도록합니다.