Maison  >  Article  >  développement back-end  >  Amélioration de l'efficacité : partage des compétences de développement pour le téléchargement HTTP asynchrone PHP de plusieurs fichiers

Amélioration de l'efficacité : partage des compétences de développement pour le téléchargement HTTP asynchrone PHP de plusieurs fichiers

WBOY
WBOYoriginal
2023-09-12 12:34:531026parcourir

效率提升:PHP 异步 HTTP 下载多个文件的开发技巧分享

Amélioration de l'efficacité : partage de conseils de développement pour le téléchargement HTTP asynchrone PHP de plusieurs fichiers

Dans les applications Internet modernes, le téléchargement de fichiers est une exigence très courante. Cependant, lorsqu'un grand nombre de fichiers doivent être téléchargés, la méthode de téléchargement synchrone traditionnelle est souvent inefficace, ce qui oblige les utilisateurs à attendre longtemps et réduit l'expérience utilisateur. Cet article présentera une technique de développement permettant d'utiliser le HTTP asynchrone PHP pour télécharger plusieurs fichiers afin d'améliorer l'efficacité du téléchargement et l'expérience utilisateur.

  1. Principe du téléchargement HTTP asynchrone
    La méthode de téléchargement synchrone traditionnelle consiste à télécharger les fichiers un par un et à attendre que le fichier précédent soit téléchargé avant de télécharger le fichier suivant. Les téléchargements HTTP asynchrones peuvent lancer plusieurs requêtes en même temps, exploitant pleinement la bande passante du réseau et améliorant considérablement la vitesse de téléchargement. La bibliothèque d'extensions cURL peut être utilisée en PHP pour implémenter des requêtes HTTP asynchrones.
  2. Utilisez cURL pour implémenter le téléchargement HTTP asynchrone
    Tout d'abord, assurez-vous que la bibliothèque d'extensions cURL est installée sur votre serveur. En PHP, les requêtes HTTP asynchrones peuvent être implémentées via le code suivant :
$urls = array(
  'http://example.com/file1.zip',
  'http://example.com/file2.zip',
  'http://example.com/file3.zip',
  // 添加更多文件链接
);

$mh = curl_multi_init();
$handles = array();

foreach ($urls as $url) {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_multi_add_handle($mh, $ch);
  $handles[] = $ch;
}

$running = null;
do {
  curl_multi_exec($mh, $running);
} while ($running > 0);

foreach ($handles as $ch) {
  curl_multi_remove_handle($mh, $ch);
  curl_close($ch);
}

curl_multi_close($mh);

Le code ci-dessus définit d'abord le lien du fichier qui doit être téléchargé, puis initialise un handle de multitraitement cURL. Parcourez les liens de fichiers, en créant un handle cURL pour chaque lien et en l'ajoutant au handle multitraitement. Par la suite, toutes les requêtes sont exécutées en appelant la fonction curl_multi_exec() jusqu'à ce qu'il n'y ait plus aucune requête en cours d'exécution. Enfin, nettoyez les ressources et fermez les handles cURL et les handles multitraitement. curl_multi_exec() 函数来执行所有请求,直到没有请求在运行为止。最后,清理资源,关闭 cURL 句柄和多处理句柄。

  1. 处理下载结果
    在上述的异步 HTTP 下载代码中,无论是成功还是失败,下载的结果都会被忽略。为了更好地处理下载结果,可以通过 curl_multi_info_read() 函数来获取每个请求的信息。下面是一个示例代码:
$completed = 0;
do {
  $mh = curl_multi_init();
  $handles = array();

  foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
  }

  $running = null;
  do {
    curl_multi_exec($mh, $running);
    $info = curl_multi_info_read($mh);
    if ($info !== false) {
      // 处理下载结果
      $completed++;
      $handle = $info['handle'];
      // ...
    }
  } while ($running > 0);

  foreach ($handles as $ch) {
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
  }

  curl_multi_close($mh);
} while ($completed < count($urls));

以上代码中,在每次执行异步 HTTP 请求后,使用 curl_multi_info_read() 函数检查是否有请求已经完成。如果有完成的请求,可以从返回的信息中获取相关的下载结果信息,并进行相应处理。通过记录已完成的请求数量,可以判断是否所有请求都已经完成。

  1. 添加错误处理
    在实际使用中,可能会出现网络连接错误或服务器响应错误等异常情况。为了处理这些异常,可以在每个请求的设置中添加相应的错误处理代码,以保证下载的稳定性和可靠性。
foreach ($urls as $url) {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  // 添加错误处理
  curl_setopt($ch, CURLOPT_FAILONERROR, true);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
  curl_setopt($ch, CURLOPT_TIMEOUT, 30);

  curl_multi_add_handle($mh, $ch);
  $handles[] = $ch;
}

在上述代码中,通过设置 CURLOPT_FAILONERROR 选项为 true,可以在请求出错时抛出异常。同时,通过设置合理的 CURLOPT_CONNECTTIMEOUTCURLOPT_TIMEOUT

    Traitement des résultats du téléchargement

    Dans le code de téléchargement HTTP asynchrone ci-dessus, les résultats du téléchargement seront ignorés, quel que soit le succès ou l'échec. Afin de mieux gérer les résultats du téléchargement, vous pouvez obtenir les informations de chaque requête via la fonction curl_multi_info_read(). Voici un exemple de code :

    rrreee🎜Dans le code ci-dessus, après l'exécution de chaque requête HTTP asynchrone, la fonction curl_multi_info_read() est utilisée pour vérifier si une requête a été terminée. S'il existe une demande terminée, les informations pertinentes sur le résultat du téléchargement peuvent être obtenues à partir des informations renvoyées et traitées en conséquence. En enregistrant le nombre de demandes terminées, vous pouvez déterminer si toutes les demandes ont été complétées. 🎜
      🎜Ajouter la gestion des erreurs🎜En utilisation réelle, des situations anormales telles que des erreurs de connexion réseau ou des erreurs de réponse du serveur peuvent survenir. Afin de gérer ces exceptions, vous pouvez ajouter le code de gestion des erreurs correspondant dans les paramètres de chaque requête pour garantir la stabilité et la fiabilité du téléchargement. 🎜🎜rrreee🎜Dans le code ci-dessus, en définissant l'option CURLOPT_FAILONERROR sur true, vous pouvez lever une exception lorsque la requête échoue. Dans le même temps, en définissant des options CURLOPT_CONNECTTIMEOUT et CURLOPT_TIMEOUT raisonnables, vous pouvez définir la connexion et demander un délai d'attente pour éviter les échecs de téléchargement causés par le délai d'attente. 🎜🎜Résumé🎜La technique d'utilisation du HTTP asynchrone PHP pour télécharger plusieurs fichiers peut considérablement améliorer l'efficacité du téléchargement et l'expérience utilisateur. En utilisant correctement la bibliothèque d'extensions cURL, plusieurs requêtes HTTP peuvent être lancées simultanément pour maximiser l'utilisation de la bande passante du réseau. Dans le même temps, les situations anormales sont traitées de manière raisonnable pour garantir la stabilité et la fiabilité des téléchargements. Grâce à ces compétences en développement, nous pouvons gérer plus efficacement les exigences de téléchargement de grandes quantités de fichiers dans les projets réels. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn