현대적인 프론트 엔드 개발에서 JavaScript의 약속은 여러 비동기 요청을 동시 실행을 처리하는 강력한 도구입니다. 이를 통해 여러 요청을 동시에 시작할 수 있으며 후속 논리를 실행하기 전에 모든 요청이 완료되기를 기다릴 수 있습니다. Server-Side 언어로서 PHP에는 직접적인 약속 메커니즘이 없지만 Curl_multi 시리즈 기능을 통해 유사한 동시 요청 처리를 구현할 수도 있습니다. 이 기사는 CURL_MULTI_INFO_READ를 사용하여 약속 과 유사한 동시 요청 처리를 구현하는 방법을 설명하는 데 중점을 둡니다.
일반 Curl_Exec은 동기식이므로 다음 단계를 계속 실행하기 전에 각 요청이 결과가 돌아올 때까지 기다려야합니다. 전송해야 할 요청이 여러 개있는 경우 순차적 실행 효율은 매우 비효율적입니다. Curl_multi를 통해 여러 요청을 동시에 시작한 다음 동시에 성능을 향상시킬 수 있습니다.
다중 독립 컬 핸들 ( curl_init )을 만듭니다.
이 핸들을 curl_multi 핸들에 추가하십시오.
curl_multi_exec 루프를 사용하여 모든 요청을 실행하십시오.
curl_multi_info_read를 통해 완료된 요청 정보를 가져옵니다.
완성 된 핸들을 닫고 결과를 저장하십시오.
약속 과 유사한 모든 요청이 완료 될 때까지 기다리십시오. 모든 약속이 완료되기를 기다리십시오.
다음 샘플 코드는 여러 URL을 동시에 요청하고 모든 요청이 완료된 후 균일하게 처리하는 방법을 보여줍니다. 예제의 URL 도메인은 m66.net 으로 대체됩니다.
<?php
// 요청합니다URL목록
$urls = [
'https://m66.net/api/user',
'https://m66.net/api/order',
'https://m66.net/api/product',
];
// 초기화 curl_multi 핸들
$mh = curl_multi_init();
$handles = [];
// 초기화所有묻다핸들并加入 multi 핸들
foreach ($urls as $key => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 귀하의 요구에 따라 조정할 시간 초과 및 기타 옵션을 설정하십시오.
curl_multi_add_handle($mh, $ch);
$handles[$key] = $ch;
}
// 모든 요청을 수행하십시오
$running = null;
do {
curl_multi_exec($mh, $running);
// 활성 연결을 기다리고 있습니다,효과적으로 줄입니다CPU사용률
curl_multi_select($mh);
// 완료된 요청을 읽으십시오
while ($info = curl_multi_info_read($mh)) {
if ($info['msg'] == CURLMSG_DONE) {
// 找出마치다묻다的핸들
$finishedHandle = $info['handle'];
// 해당하는 것을 찾으십시오 key
$key = array_search($finishedHandle, $handles, true);
// 컨텐츠 및 상태 코드를 얻습니다
$content = curl_multi_getcontent($finishedHandle);
$httpCode = curl_getinfo($finishedHandle, CURLINFO_HTTP_CODE);
echo "묻다 {$urls[$key]} 마치다,HTTP상태 코드: {$httpCode}\n";
echo "내용 길이: " . strlen($content) . " 바이트\n\n";
// 关闭并移除已经마치다的핸들
curl_multi_remove_handle($mh, $finishedHandle);
curl_close($finishedHandle);
// 将对应핸들置空,편리한 후속 판단
unset($handles[$key]);
}
}
} while ($running > 0);
curl_multi_close($mh);
echo "所有묻다均已마치다。\n";
curl_multi_init ()는 다중 요청 처리를위한 핸들을 만듭니다.
각 curl_init ()는 별도의 요청을 생성하고 구성 후 다중 요청 핸들을 추가합니다.
모든 요청이 완료 될 때까지 Curl_Multi_Exec () 를 통해 요청을 시작하고 루프를 호출하십시오.
CPU 사용을 방지하려면 curl_multi_select ()를 사용하십시오.
curl_multi_info_read ()는 약속의 콜백 과 유사한 완성 된 요청 정보를 반환합니다.
요청이 완료된 후에는 자원 낭비를 피하기 위해 해당 핸들을 제 시간에 닫고 제거합니다.
위의 프로세스를 통해 모든 요청은 완료 후 동시에 균일하게 처리되며 약속 과 유사한 효과가 있습니다.
PHP에는 기본 약속 메커니즘이 없지만 CURL_MULTI 시리즈 기능, 특히 CURL_MULTI_INFO_READ를 사용하여 동시 요청의 관리 및 결과 처리를 완전히 구현할 수 있습니다. 이 방법을 사용하면 다중 인터페이스 호출을 실행할 때 PHP 스크립트의 효율성을 크게 향상시킬 수 있으며, 여러 외부 인터페이스가 동시에 호출되는 시나리오에 특히 적합합니다.
이 예제가 PHP 동시 요청을 이해하는 데 도움이되기를 바랍니다!