現在の位置: ホーム> 最新記事一覧> ダウンロードの進行状況を制御して一時停止したいですか? curl_pauseの具体的な実装方法は何ですか?

ダウンロードの進行状況を制御して一時停止したいですか? curl_pauseの具体的な実装方法は何ですか?

M66 2025-08-04

Curlは、ファイルのダウンロードにPHPを使用したり、ネットワークリソースをクロールする場合に最も一般的に使用されるツールの1つです。一般的に言えば、 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">// 待っているとしましょう52番</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_multi_exec()を使用して複数の同時リクエストを処理する場合、 curl_pause()はさらに重要です。他のリクエストに影響を与えることなく、ハンドルを正確に一時停止できます。

 <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コールバックが1回呼び出されているのが表示される場合があります。

要約します

curl_pause()は、特にファイルのダウンロード、ストリーミングメディア処理、マルチスレッドタスクコントロールなどでデータフローの動的制御が必要な高度なシナリオに適した、HTTP伝送動作のより細かい粒状制御をPHPに提供します。

使用する場合は、 writefunction機能コールバックとcurl_multi環境を組み合わせて、送信ステータスを柔軟に管理する必要があります。マスターすると、ネットワーク伝送ロジックが前例のない柔軟性と制御を提供できます。