ホームページ  >  記事  >  バックエンド開発  >  効率化:複数ファイルのPHP非同期HTTPダウンロードの開発スキルの共有

効率化:複数ファイルのPHP非同期HTTPダウンロードの開発スキルの共有

WBOY
WBOYオリジナル
2023-09-12 12:34:53974ブラウズ

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

効率の向上: 複数ファイルの PHP 非同期 HTTP ダウンロードのための開発スキルの共有

現代のインターネット アプリケーションでは、ファイルのダウンロードは非常に一般的な要件です。ただし、大量のファイルをダウンロードする必要がある場合、従来の同期ダウンロード方法は非効率であることが多く、ユーザーが長時間待たされ、ユーザー エクスペリエンスが低下します。この記事では、PHP 非同期 HTTP を使用して複数のファイルをダウンロードし、ダウンロードの効率とユーザー エクスペリエンスを向上させる開発テクニックを紹介します。

  1. 非同期 HTTP ダウンロードの原理
    従来の同期ダウンロード方法では、ファイルを 1 つずつダウンロードし、前のファイルがダウンロードされるのを待ってから次のファイルをダウンロードします。非同期 HTTP ダウンロードでは、複数のリクエストを同時に開始できるため、ネットワーク帯域幅が最大限に活用され、ダウンロード速度が大幅に向上します。 PHP で cURL 拡張ライブラリを使用すると、非同期 HTTP リクエストを実装できます。
  2. cURL を使用して非同期 HTTP ダウンロードを実装する
    まず、サーバーに cURL 拡張ライブラリがインストールされていることを確認します。 PHP では、非同期 HTTP リクエストは次のコードを通じて実装できます。
$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);

上記のコードは、まずダウンロードする必要があるファイル リンクを定義し、次に cURL マルチプロセッシング ハンドルを初期化します。ファイル リンクをループし、リンクごとに cURL ハンドルを作成し、それをマルチプロセッシング ハンドルに追加します。その後、実行中のリクエストがなくなるまで、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_CONNECTTIMEOUT および CURLOPT_TIMEOUT オプションを設定することで、接続と要求のタイムアウトを設定して、タイムアウトによるダウンロードの失敗を回避できます。

概要
PHP 非同期 HTTP を使用して複数のファイルをダウンロードする手法により、ダウンロードの効率とユーザー エクスペリエンスが大幅に向上します。 cURL 拡張ライブラリを適切に使用すると、複数の HTTP リクエストを同時に開始して、ネットワーク帯域幅の使用を最大化できます。同時に、ダウンロードの安定性と信頼性を確保するために、異常な状況が合理的に処理されます。これらの開発スキルにより、実際のプロジェクトで大量のファイルのダウンロード要件をより効率的に処理できるようになります。

以上が効率化:複数ファイルのPHP非同期HTTPダウンロードの開発スキルの共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。