현재 위치: > 최신 기사 목록> 다운로드 진행 상황을 제어하고 일시 중지하고 싶으십니까? Curl_Pause의 특정 구현 방법은 무엇입니까?

다운로드 진행 상황을 제어하고 일시 중지하고 싶으십니까? Curl_Pause의 특정 구현 방법은 무엇입니까?

M66 2025-08-04

CURL은 파일 다운로드 또는 크롤링 네트워크 리소스에 PHP를 사용할 때 가장 일반적으로 사용되는 도구 중 하나입니다. 일반적으로 말하면, 우리는 curl_exec ()를 사용하여 요청을 실행하고 요청이 동기식으로 완료 될 때까지 기다립니다. 그러나 일부 고급 시나리오에서는 대기 해야하는 경우 Curl_Pause () 함수를 사용해야합니다.

이 기사에서는 Curl_Pause () 의 역할 및 사용 시나리오를 심도있게 소개하고 다른 CURL 기능을 결합하여보다 복잡한 다운로드 제어를 달성하는 방법을 소개합니다.

curl_pause () 란 무엇입니까?

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은 성공을 나타냅니다.

일반적인 사용 시나리오

1. 다운로드 작업의 실시간 제어

대역폭, 사용자 작동 또는 서버 응답에 따라 다운로드를 동적으로 일시 중지해야 할 수도 있습니다. 예를 들어, 대역폭이 단단 해지면 다운로드 작업을 일시 중지하고 나중에 재개 할 수 있습니다.

 <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> (&amp;$</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> &gt;= </span><span><span class="hljs-number">1024</span></span><span> * </span><span><span class="hljs-number">1024</span></span><span> &amp;&amp; !</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>

2. 멀티 스레드 Curl_multi와 함께 사용하십시오

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 환경을 결합하여 전송 상태를 유연하게 관리해야합니다. 마스터 링하면 네트워크 전송 로직 전례없는 유연성과 제어를 제공 할 수 있습니다.