Position actuelle: Accueil> Derniers articles> Vous voulez contrôler les progrès de téléchargement et faire une pause? Quelles sont les méthodes de mise en œuvre spécifiques de curl_pause?

Vous voulez contrôler les progrès de téléchargement et faire une pause? Quelles sont les méthodes de mise en œuvre spécifiques de curl_pause?

M66 2025-08-04

Curl est l'un des outils les plus couramment utilisés lors de l'utilisation de PHP pour des téléchargements de fichiers ou des ressources réseau rampantes. D'une manière générale, nous utilisons Curl_exec () pour exécuter la demande et attendre que la demande termine de manière synchrone. Cependant, dans certains scénarios avancés, par exemple, si vous devez attendre, vous devez utiliser la fonction curl_pause () .

Cet article présentera en profondeur le rôle et les scénarios d'utilisation de Curl_pause () , et comment combiner d'autres fonctions Curl pour obtenir un contrôle de téléchargement plus complexe.

Qu'est-ce que curl_pause () ?

curl_pause () est une fonction fournie par libcurl pour contrôler les opérations de transmission en cours, qui peuvent faire une pause ou reprendre la réception (lire) ou envoyer (écrire).

En PHP, le prototype de cette fonction est le suivant:

 <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>

Le paramètre $ bitmask peut être une combinaison des constantes suivantes:

  • Curlpause_recv : pause la réception des données

  • Curlpause_send : pause envoyant des données

  • Curlpause_all : pause envoyage et réception

  • Curlpause_cont : continuer la transmission (pause libérée)

La valeur de retour est un code d'état de type curlcode, généralement 0 indique le succès.

Scénarios d'utilisation typiques

1. Contrôle en temps réel des tâches de téléchargement

Vous devrez peut-être une pause en pause dynamiquement en fonction de la bande passante, des opérations utilisateur ou de la réponse du serveur. Par exemple, lorsque la bande passante est serrée, une tâche de téléchargement peut être interrompue et reprendre plus tard.

 <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">// simulation:Télécharger1MBJuste une pause</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">// Récupérer plus tard</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">// Supposons que nous attendions5Deuxième</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. Utiliser avec Curl_Multi multithread

curl_pause () est encore plus important lors de l'utilisation de curl_multi_exec () pour gérer plusieurs demandes simultanées. Vous pouvez suspendre une poignée avec précision sans affecter d'autres demandes.

 <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">// Pause une demande dans certaines conditions</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">// Lors de la récupération:</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>

Choses à noter

  • Tous les serveurs ou transports ne prennent pas en charge la récupération de pause, en particulier sur les serveurs sans support de portée, la pause peut être équivalente à l'interruption.

  • Si vous utilisez curlopt_returntransfer , vous ne pouvez plus utiliser curl_exec () pour obtenir les données restantes après une pause, et vous devez utiliser Curl_Multi ou Streaming.

  • Les données peuvent toujours être dans le tampon après une pause, vous pouvez donc toujours voir le rappel WriteFunction appelé une fois.

Résumer

CURL_PAUSE () fournit à PHP un contrôle granulaire plus fin du comportement de transmission HTTP, adapté aux scénarios avancés où le contrôle dynamique du flux de données est requis, en particulier dans le téléchargement de fichiers, le traitement des médias en streaming, le contrôle des tâches multi-thread, etc.

Lorsque vous l'utilisez, vous devez combiner l'environnement de rappel d'écriture et Curl_Multi pour gérer de manière flexible l'état de transmission. La maîtriser peut donner à votre logique de transmission réseau de flexibilité et de contrôle sans précédent.