CURL은 파일 다운로드 또는 크롤링 네트워크 리소스에 PHP를 사용할 때 가장 일반적으로 사용되는 도구 중 하나입니다. 일반적으로 말하면, 우리는 curl_exec ()를 사용하여 요청을 실행하고 요청이 동기식으로 완료 될 때까지 기다립니다. 그러나 일부 고급 시나리오에서는 대기 해야하는 경우 Curl_Pause () 함수를 사용해야합니다.
이 기사에서는 Curl_Pause () 의 역할 및 사용 시나리오를 심도있게 소개하고 다른 CURL 기능을 결합하여보다 복잡한 다운로드 제어를 달성하는 방법을 소개합니다.
Curl_Pause () 는 LIBCURL이 진행중인 전송 작업을 제어하기 위해 제공되는 함수이며, 이는 수신 (읽기) 또는 보내기 (쓰기)를 일시 중지하거나 재개 할 수 있습니다.
PHP 에서이 기능의 프로토 타입은 다음과 같습니다.
<span><span><span class="hljs-title function_ invoke__">curl_pause</span></span><span>(CurlHandle </span><span><span class="hljs-variable">$handle</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$bitmask</span></span><span>): </span><span><span class="hljs-keyword">int</span></span><span>
</span></span>
$ 비트 마스크 매개 변수는 다음 상수의 조합 일 수 있습니다.
CurlPause_RECV : 데이터 수신을 일시 중지하십시오
curlpause_send : 데이터 전송 일시 중지
CurlPause_all : 삭제 및 수신 일시 중지
CurlPause_Cont : 계속 전송 (릴리스 일시 정지)
반환 값은 유형 컬 코드의 상태 코드이며 일반적으로 0은 성공을 나타냅니다.
대역폭, 사용자 작동 또는 서버 응답에 따라 다운로드를 동적으로 일시 중지해야 할 수도 있습니다. 예를 들어, 대역폭이 단단 해지면 다운로드 작업을 일시 중지하고 나중에 재개 할 수 있습니다.
<span><span><span class="hljs-variable">$ch</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-string">"https://example.com/largefile.zip"</span></span><span>);
</span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"largefile.zip"</span></span><span>, </span><span><span class="hljs-string">"w"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_FILE, </span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_WRITEFUNCTION, function(</span><span><span class="hljs-variable">$ch</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>) </span><span><span class="hljs-keyword">use</span></span><span> (&$</span><span><span class="hljs-title">paused</span></span><span>) {
</span><span><span class="hljs-title">static</span></span><span> $</span><span><span class="hljs-title">total</span></span><span> = 0;
</span><span><span class="hljs-variable">$len</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
</span><span><span class="hljs-variable">$total</span></span><span> += </span><span><span class="hljs-variable">$len</span></span><span>;
</span><span><span class="hljs-comment">// 시뮬레이션:다운로드1MB그냥 잠시 멈 춥니 다</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$total</span></span><span> >= </span><span><span class="hljs-number">1024</span></span><span> * </span><span><span class="hljs-number">1024</span></span><span> && !</span><span><span class="hljs-variable">$paused</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">curl_pause</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLPAUSE_RECV);
</span><span><span class="hljs-variable">$paused</span></span><span> = </span><span><span class="hljs-literal">true</span></span><span>;
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$len</span></span><span>;
});
</span><span><span class="hljs-title function_ invoke__">curl_exec</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-comment">// 나중에 복구하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$paused</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">5</span></span><span>); </span><span><span class="hljs-comment">// 우리가 기다린다고 가정 해 봅시다5두번째</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_pause</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLPAUSE_CONT);
</span><span><span class="hljs-title function_ invoke__">curl_exec</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span></span>
Curl_Pause ()는 Curl_Multi_Exec ()를 사용하여 여러 동시 요청을 처리 할 때 더욱 중요합니다. 다른 요청에 영향을 미치지 않고 핸들을 정확하게 일시 중지 할 수 있습니다.
<span><span><span class="hljs-variable">$mh</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();
</span><span><span class="hljs-variable">$chs</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$urls</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$url</span></span><span>) {
</span><span><span class="hljs-variable">$ch</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-variable">$chs</span></span><span>[] = </span><span><span class="hljs-variable">$ch</span></span><span>;
}
</span><span><span class="hljs-comment">// 특정 조건에서 요청을 일시 중지하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_pause</span></span><span>(</span><span><span class="hljs-variable">$chs</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>], CURLPAUSE_RECV);
</span><span><span class="hljs-comment">// 회복 할 때:</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_pause</span></span><span>(</span><span><span class="hljs-variable">$chs</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>], CURLPAUSE_CONT);
</span></span>
모든 서버 또는 전송이 지원 일시 정지 복구, 특히 범위 지원이없는 서버에서 일시 중지는 중단과 동일 할 수 있습니다.
curlopt_returntransfer를 사용하는 경우 더 이상 curl_exec ()를 사용하여 일시 중지 후 나머지 데이터를 얻을 수 없으며 curl_multi 또는 스트리밍을 사용해야합니다.
일시 정지 후에도 데이터가 여전히 버퍼에있을 수 있으므로 여전히 writefunction 콜백이 한 번 호출되는 것을 볼 수 있습니다.
Curl_Pause ()는 HTTP 전송 동작의 더 미세한 세분화 제어를 제공하며, 특히 파일 다운로드, 스트리밍 미디어 처리, 다중 스레드 작업 제어 등에 데이터 흐름의 동적 제어가 필요한 고급 시나리오에 적합합니다.
그것을 사용할 때는 쓰기 기능 콜백과 Curl_multi 환경을 결합하여 전송 상태를 유연하게 관리해야합니다. 마스터 링하면 네트워크 전송 로직 전례없는 유연성과 제어를 제공 할 수 있습니다.