PHP에서 CURL 확장을 사용하는 경우 Curl_multi_* 함수는 일반적으로 여러 동시 요청을 처리하는 데 사용됩니다. 이러한 기능은 특히 여러 HTTP 요청이 동시에 전송 될 때 프로그램의 성능을 크게 향상시킬 수 있습니다. 그러나 curl_multi_close 함수를 사용할 때 일부 개발자는 요청 처리에서 간섭 문제에 직면하여 요청이 올바르게 완료되지 않거나 오류를 반환 할 수 있습니다.
이 기사는 요청 처리의 간섭을 피하는 방법을 살펴보고 실용적인 코드 예제 및 솔루션을 공유합니다.
PHP는 CURL_MULTI_* 기능을 제공하여 여러 동시 커플 요청을 수행합니다. 주요 기능은 다음과 같습니다.
curl_multi_init () : 컬 다중 핸들을 초기화하십시오.
curl_multi_add_handle () : 여러 개의 컬 핸들을 하나의 여러 핸들에 추가하십시오.
curl_multi_exec () : 모든 컬 요청을 실행합니다.
curl_multi_getContent () : CURL 요청의 내용을 가져옵니다.
curl_multi_remove_handle () : 여러 핸들에서 컬 핸들을 제거합니다.
curl_multi_close () : 모든 컬 핸들을 닫고 리소스를 해제하십시오.
<?php
$multiHandle = curl_multi_init();
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3'
];
$handles = [];
// 여러 요청 핸들을 초기화합니다
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$handles[] = $ch;
}
// 요청을 실행하십시오
$running = null;
do {
curl_multi_exec($multiHandle, $running);
} while ($running);
// 응답 데이터를 얻습니다
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
curl_multi_remove_handle($multiHandle, $ch);
}
// 손잡이를 닫으십시오
curl_multi_close($multiHandle);
?>
curl_multi_close 기능은 편리한 청소 기능이지만, 요청 처리의 마지막 단계에서, 특히 요청이 완료되지 않을 때 Curl_multi_close가 호출 될 때 때때로 방해 할 수 있습니다. 이 간섭으로 인해 일부 요청이 올바르게 완료되지 않거나 수신 된 응답이 불완전합니다.
동시 요청의 완료 시간은 일관되지 않습니다 . 요청의 다른 응답 시간이 다르기 때문에 Curl_Multi_Close가 호출되면 일부 요청이 완료되지 않았으므로 요청이 사전에 닫히게됩니다.
리소스 릴리스 문제 : 경우에 따라 경우에 따라 Resource가 완전히 릴리스되기 전에 Curl_Multi_Close 호출은 다른 요청에 영향을 미치거나 연결이 연결이 끊어 질 수 있습니다.
curl_multi_close 함수의 요청 처리에서 간섭을 피하기 위해 다음과 같은 전략을 채택 할 수 있습니다.
curl_multi_close를 호출하기 전에 모든 요청이 완료되었는지 확인하십시오. curl_multi_exec 에 의해 반환 된 실행 상태를 확인하여 모든 요청이 완료되었는지 확인할 수 있습니다. curl_multi_close는 모든 요청이 처리 될 때만 호출해야합니다.
<?php
$multiHandle = curl_multi_init();
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3'
];
$handles = [];
// 여러 요청 핸들을 초기화합니다
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$handles[] = $ch;
}
// 요청을 실행하십시오
$running = null;
do {
$mrc = curl_multi_exec($multiHandle, $running);
if ($mrc > 0) {
echo "CURL exec error: " . curl_multi_strerror($mrc);
}
} while ($running);
// 응답 데이터를 얻습니다
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
curl_multi_remove_handle($multiHandle, $ch);
}
// 손잡이를 닫으십시오
curl_multi_close($multiHandle);
?>
경우에 따라 Curl_Multi_Select ()를 사용하여 요청 처리 성능을 최적화 할 수 있습니다. CURL_MULTI_EXEC을 지속적으로 폴링하는 대신 CURL 요청이 완료되기를 기다리는 동안 프로세스를 차단할 수있어 CPU 사용량을 줄이고 요청의 원활한 처리를 보장합니다.
<?php
$multiHandle = curl_multi_init();
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3'
];
$handles = [];
// 여러 요청 핸들을 초기화합니다
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$handles[] = $ch;
}
// 요청을 실행하십시오并使用 curl_multi_select 성능 향상
$running = null;
do {
$mrc = curl_multi_exec($multiHandle, $running);
if ($mrc > 0) {
echo "CURL exec error: " . curl_multi_strerror($mrc);
}
curl_multi_select($multiHandle);
} while ($running);
// 응답 데이터를 얻습니다
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
curl_multi_remove_handle($multiHandle, $ch);
}
// 손잡이를 닫으십시오
curl_multi_close($multiHandle);
?>
요청 처리의 간섭을 피하려면 모든 요청이 완료되고 응답이 올바르게 반환되었는지 확인해야합니다. 요청의 실행 상태를 모니터링하고 Curl_Multi_Select를 사용하여 성능을 최적화하고 가능한 간섭을 피하기 위해 요청이 완료된 후 CURL_MULTI_CLOSE가 호출되는지 확인할 수 있습니다.
이러한 방법을 통해 PHP의 동시 요청의 안정성과 성능을 효과적으로 개선하여 요청 처리 프로세스가 원활하고 불필요한 간섭이 없도록합니다.