Position actuelle: Accueil> Derniers articles> Quelle est la méthode de traitement de la façon dont la fonction Curl_Multi_Add_Handle est appliquée aux tâches de téléchargement et de téléchargement?

Quelle est la méthode de traitement de la façon dont la fonction Curl_Multi_Add_Handle est appliquée aux tâches de téléchargement et de téléchargement?

M66 2025-06-22

Quelle est la méthode de traitement de la façon dont la fonction Curl_Multi_Add_Handle est appliquée aux tâches de téléchargement et de téléchargement?

CURL_MULTI_ADD_HANDLE est l'une des fonctions clés de l'interface Curl Multi lors de la gestion de plusieurs requêtes HTTP simultanées dans PHP. Il nous permet de rejoindre une seule manche en boucle à une session à plusieurs plis, permettant ainsi un traitement simultané non bloquant. Ce mécanisme est très utile pour les scénarios de téléchargement et de téléchargement où les fichiers volumineux doivent être traités.

1. Méthode de traitement pour télécharger des tâches en morceaux

L'idée de base du téléchargement de blocs est de diviser un grand fichier en plusieurs petits morceaux, puis de télécharger ces petites pièces simultanément. L'utilisation de curl_multi_add_handle peut considérablement améliorer l'efficacité du téléchargement.

Exemple de flux:

  1. Diviser les fichiers volumineux en plusieurs petits morceaux de fichiers (peut être sorti manuellement avec Fread () ).

  2. Créez une demande de boucle indépendante pour chaque bloc (en utilisant la méthode de put ou de post).

  3. Ajoutez ces poignées de demande au gestionnaire multi-mains créé par Curl_Multi_Init () .

  4. Utilisez curl_multi_exec () pour générer toutes les demandes de téléchargement à exécuter simultanément.

Exemple de code simple:

 <span><span><span class="hljs-variable">$multiHandle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();
</span><span><span class="hljs-variable">$chunkFiles</span></span><span> = [</span><span><span class="hljs-string">'chunk1.bin'</span></span><span>, </span><span><span class="hljs-string">'chunk2.bin'</span></span><span>, </span><span><span class="hljs-string">'chunk3.bin'</span></span><span>]; </span><span><span class="hljs-comment">// Exemple de fichier de blocage</span></span><span>
</span><span><span class="hljs-variable">$curlHandles</span></span><span> = [];

</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$chunkFiles</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$index</span></span><span> =&gt; </span><span><span class="hljs-variable">$file</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-string">'https://example.com/upload_chunk'</span></span><span>);
    </span><span><span class="hljs-variable">$fileData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$file</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_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_POSTFIELDS, </span><span><span class="hljs-variable">$fileData</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_HTTPHEADER, [
        </span><span><span class="hljs-string">'Content-Type: application/octet-stream'</span></span><span>,
        </span><span><span class="hljs-string">'Content-Length: '</span></span><span> . </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$fileData</span></span><span>),
        </span><span><span class="hljs-string">'X-Chunk-Index: '</span></span><span> . </span><span><span class="hljs-variable">$index</span></span><span>
    ]);

    </span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>, </span><span><span class="hljs-variable">$ch</span></span><span>);
    </span><span><span class="hljs-variable">$curlHandles</span></span><span>[] = </span><span><span class="hljs-variable">$ch</span></span><span>;
}

</span><span><span class="hljs-comment">// Effectuer toutes les tâches de téléchargement</span></span><span>
</span><span><span class="hljs-variable">$running</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-keyword">do</span></span><span> {
    </span><span><span class="hljs-title function_ invoke__">curl_multi_exec</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>, </span><span><span class="hljs-variable">$running</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">curl_multi_select</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>);
} </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$running</span></span><span> &gt; </span><span><span class="hljs-number">0</span></span><span>);

</span><span><span class="hljs-comment">// Nettoyer les ressources</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$curlHandles</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$ch</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</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__">curl_multi_close</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>);
</span></span>

2. Comment gérer les tâches de téléchargement des blocs

Pour les téléchargements de blocs, le même mécanisme s'applique. En définissant l'en-tête de plage , nous pouvons demander un intervalle d'octets spécifique du fichier, en téléchargeant ainsi simultanément différentes parties de l'ensemble du fichier, puis en fusionnant ces pièces.

Description de l'étape:

  1. Obtient la taille totale du fichier cible.

  2. Divisez-le en plusieurs segments, par exemple 1 Mo par segment.

  3. Construisez une demande de curl avec l'en-tête de plage pour chaque segment.

  4. Utilisez CURL_MULTI_ADD_HANDLE pour ajouter une session multi-manche pour un téléchargement simultané.

  5. Fusionner les résultats de téléchargement dans l'ordre.

Exemple de code bref:

 <span><span><span class="hljs-variable">$url</span></span><span> = </span><span><span class="hljs-string">'https://example.com/largefile.zip'</span></span><span>;
</span><span><span class="hljs-variable">$fileSize</span></span><span> = </span><span><span class="hljs-number">10000000</span></span><span>; </span><span><span class="hljs-comment">// Supposer que la taille du fichier est10MB</span></span><span>
</span><span><span class="hljs-variable">$chunkSize</span></span><span> = </span><span><span class="hljs-number">1000000</span></span><span>;  </span><span><span class="hljs-comment">// Chaque pièce1MB</span></span><span>
</span><span><span class="hljs-variable">$multiHandle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();
</span><span><span class="hljs-variable">$curlHandles</span></span><span> = [];
</span><span><span class="hljs-variable">$results</span></span><span> = [];

</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$start</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$start</span></span><span> &lt; </span><span><span class="hljs-variable">$fileSize</span></span><span>; </span><span><span class="hljs-variable">$start</span></span><span> += </span><span><span class="hljs-variable">$chunkSize</span></span><span>) {
    </span><span><span class="hljs-variable">$end</span></span><span> = </span><span><span class="hljs-title function_ invoke__">min</span></span><span>(</span><span><span class="hljs-variable">$start</span></span><span> + </span><span><span class="hljs-variable">$chunkSize</span></span><span> - </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-variable">$fileSize</span></span><span> - </span><span><span class="hljs-number">1</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_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_RANGE, </span><span><span class="hljs-string">"<span class="hljs-subst">$start</span></span></span><span>-</span><span><span class="hljs-subst">$end</span></span><span>");

    </span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>, </span><span><span class="hljs-variable">$ch</span></span><span>);
    </span><span><span class="hljs-variable">$curlHandles</span></span><span>[] = </span><span><span class="hljs-variable">$ch</span></span><span>;
}

</span><span><span class="hljs-comment">// Effectuez toutes les tâches de téléchargement</span></span><span>
</span><span><span class="hljs-variable">$running</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-keyword">do</span></span><span> {
    </span><span><span class="hljs-title function_ invoke__">curl_multi_exec</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>, </span><span><span class="hljs-variable">$running</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">curl_multi_select</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>);
} </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$running</span></span><span> &gt; </span><span><span class="hljs-number">0</span></span><span>);

</span><span><span class="hljs-comment">// Collectez les résultats et fusionnez</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$curlHandles</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$ch</span></span><span>) {
    </span><span><span class="hljs-variable">$results</span></span><span>[] = </span><span><span class="hljs-title function_ invoke__">curl_multi_getcontent</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</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__">curl_multi_close</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>);

</span><span><span class="hljs-comment">// Écrivez dans le fichier complet</span></span><span>
</span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-string">'merged_file.zip'</span></span><span>, </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-variable">$results</span></span><span>));
</span></span>

3. Choses à noter

  1. Limitation des connexions : Trop de concurrence peut amener le serveur à refuser les connexions. Il est recommandé de contrôler le nombre de concurrenances (comme le traitement 5 à chaque fois).

  2. Gestion des erreurs : utilisez curl_error () et curl_multi_info_read () pour vérifier l'état de chaque demande.

  3. Paramètre de délai d'expiration : il est recommandé de définir Curlopt_timeout pour empêcher les demandes individuelles de rester coincés dans l'ensemble du processus.

Résumer

CURL_MULTI_ADD_HANDLE est l'un des outils de base pour construire des demandes HTTP simultanées. Grâce à la combinaison de stratégies de section, le téléchargement et le téléchargement de tâches de fichiers volumineux peuvent être gérés efficacement. L'organisation raisonnable des demandes, le contrôle simultanée et la gestion des erreurs sont des facteurs importants qui doivent être pris en compte dans les applications pratiques. Il peut considérablement améliorer les performances et la fiabilité des communications du réseau PHP.