PHP 프로그래밍에서 Curl_multi_* 함수는 강력한 멀티 태스킹 동시 처리 기능을 제공합니다. 그러나 실제 개발 중에 Curl_Multi_Close ()를 사용하여 CURL_SETOPT_ARRAY () 와 협력 할 때 몇 가지 일반적인 문제가 발생할 수 있습니다. 오늘 우리는 이러한 문제를 분석하고 문제를 해결하는 데 도움이 될 것입니다.
curl_multi_* 함수는 여러 동시 요청을 실행하기위한 도구입니다. 가장 일반적으로 사용되는 기능은 다음과 같습니다.
curl_multi_init () : 여러 컬 세션을 초기화합니다.
curl_multi_add_handle () : 여러 컬 프로세서에 컬 핸들을 추가하십시오.
curl_multi_exec () : 여러 컬 요청을 실행합니다.
curl_multi_close () : 여러 세션을 닫습니다.
실제로 사용하면 일반적으로 Curl_setopt_array () 로 여러 옵션을 설정하지만 예외가 발생하면 위치 문제가 더 번거 롭을 수 있습니다.
<?php
// 다중 초기화 cURL 세션
$multiHandle = curl_multi_init();
// 다중 생성 cURL 핸들
$curlHandles = [];
for ($i = 0; $i < 3; $i++) {
$curlHandles[$i] = curl_init();
// 설정 cURL 옵션
curl_setopt_array($curlHandles[$i], [
CURLOPT_URL => "https://gitbox.net/api/resource" . $i, // 바꾸다 URL 도메인 이름
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
// 添加핸들到多重 cURL 세션中
curl_multi_add_handle($multiHandle, $curlHandles[$i]);
}
// 얼마나 많은 실행 cURL 묻다
$running = null;
do {
curl_multi_exec($multiHandle, $running);
} while ($running);
// 获取묻다结果
foreach ($curlHandles as $handle) {
$response = curl_multi_getcontent($handle);
echo "Response: $response\n";
}
// 폐쇄 cURL 핸들
foreach ($curlHandles as $handle) {
curl_multi_remove_handle($multiHandle, $handle);
curl_close($handle);
}
// 폐쇄多重 cURL 세션
curl_multi_close($multiHandle);
?>
때로는 요청이 완료 되더라도 Curl_multi_exec ()는 여전히 종료되지 않으므로 프로그램이 계속 실행할 수 없습니다. 이 문제는 일반적으로 다음 상황에서 발생합니다.
타임 아웃 옵션이 올바르게 설정되지 않습니다 . 요청이 시간 초과 옵션을 설정하지 않거나 시간 초과가 너무 길어지면 Curl_Multi_Exec () 가 여기에 갇혀 종료 할 수 없습니다.
curl_multi_remove_handle () 또는 curl_close ()가 호출되지 않습니다 . hance 핸들을 올바르게 제거하고 닫히지 않으면 Curl_multi_exec () 도 데드 루프에 들어갈 수도 있습니다.
솔루션 : 처리가 완료된 후 CURL_MULTI_REMOVE_HANDLE () 및 CURL_CLOSE ()를 호출하여 리소스를 올바르게 정리하십시오.
curl_setopt_array ()는 한 번에 여러 옵션을 설정하는 데 사용되지만 옵션 순서 또는 잘못된 옵션으로 인해 컬 동작이 비정상적입니다. 특히 curl_multi_* 를 사용하는 동안 일반적인 문제는 다음과 같습니다.
일관되지 않은 URL 설정 : 다른 컬 핸들이 동일한 URL 구성을 사용하면 요청 간의 충돌이 발생할 수 있습니다.
옵션 재정의 문제 : curl_setopt_array ()가 여러 번 호출되면 이전 옵션이 덮어 쓰기로 구성되어 구성이 일치하지 않습니다.
솔루션 : curl_setopt_array () 에 전달 된 모든 옵션을 확인하여 정확하고 충돌이 없는지 확인하십시오. 예를 들어 URL이 올바르게 교체되었는지 확인하십시오.
각각 curl_multi_init () 로 호출되면 Curl_multi_close ()가 여러 세션을 닫으려면 호출되어야합니다. curl_multi_close ()를 호출하는 것을 잊어 버린 경우 메모리 누출 또는 과도한 파일 디스크립터 사용이 발생하여 성능 문제가 발생할 수 있습니다.
솔루션 : 코드가 완료되면 Curl_Multi_Close ()가 호출되어 여러 컬 세션을 닫으십시오.
URL 설정 확인 : 특히 Curl_SetOpt_array () 로 여러 옵션을 설정할 때 모든 컬 핸들에 유효한 URL이 있는지 확인하고 오류 또는 누락을 확인하십시오.
디버그 로그 : CURL DEBUG 출력을 활성화하여 컬 핸들의 상세한 실행 프로세스를 볼 수 있습니다. 이는 요청이 성공적으로 시작되었는지 또는 예외가 발생했는지 여부를 찾는 데 도움이됩니다.
시간 초과 구성 : 적절한 시간 초과 시간을 설정하고 각 요청에 시간 초과 설정이 있는지 확인하십시오. 요청이 너무 오래 걸리면 프로그램이 종료 될 수 없습니다.
자원 정리 : Curl_multi_Remove_handle () 및 Curl_Close () 에 대한 호출을 포함하여 사용 후 각 컬 핸들은 올바르게 닫아야합니다.
메모리 및 파일 핸들 : PHP의 메모리 제한 및 파일 핸들 제한을 확인하여 여러 컬 세션이 자원 누출을 유발하지 않도록합니다.
Curl_multi_* 기능을 합리적으로 사용하면 여러 동시 요청을 효율적으로 처리 할 수 있습니다. 그러나 실제 개발에서 세부 사항 문제는 쉽게 예외 또는 성능 문제로 이어질 수 있습니다. 이 기사에 제공된 문제 해결 단계가 일반적인 문제를 해결하고 멀티 태스킹 컬 요청이 원활하게 실행되도록하는 데 도움이되기를 바랍니다.