PHPで複数の接続と進行状況を表示するダウンロードマネージャーとしてのCURL

StackOverflow https://stackoverflow.com/questions/1613926

  •  06-07-2019
  •  | 
  •  

質問

PHPのCURL拡張機能を使用して何らかのダウンロードマネージャーを作成したかったので、CURLが考えているこれらの2つの機能を実装できるかどうかを考えていました。

1)通常のデスクトップアプリケーションのダウンロードマネージャーと同じように、複数の接続またはマルチパートのダウンロード。

2)ダウンロードの進行状況を常に画面上で更新します(テキストまたはグラフィカル、重要ではありません)。

CURL for PHPはこれを許可しますか?もしそうなら、いくつかのヒントを提供するように注意してください?

役に立ちましたか?

解決

curl_multi_exec()のようなcurl_multi_xyz()関数を使用すると、複数のリクエストを同時に処理できます。また、ダウンロードする場合は、 CURLOPT_RANGE もご覧ください。同じファイルの複数のセグメントを並行して。 また、 CURLOPT_READFUNCTION および< href = "http://docs.php.net/function.curl-setopt" rel = "nofollow noreferrer"> CURLOPT_WRITEFUNCTION を使用すると、何らかの進捗データを送信できますクライアント。

他のヒント

すべての「PHPはマルチタスクには向いていません」評論家:

一歩下がって、LAMP環境を使用している場合は、すばらしいマルチスレッドフレームワークを自由に使用できると考えてください。この基本アーキテクチャを活用してください-つまり、Apacheはマルチスレッドマネージャです-そしてそれは非常に良いものです。

この環境で動作するようにPHPをセットアップするのは非常に簡単です。

  
      
  1. max_execution_time = 0に設定すると、スクリプトを無制限に実行できます
  2.   
  3. ignore_user_abort = trueに設定すると、スクリプトが   クライアントが中断しました
  4.   

軽量のシングルタスクREST Webサービスを設計します。キュー型システムなどで、返されるときに気にしないように設計します。キューへの書き込みはスレッドセーフであり、いくつかの基本的なOSレベルのミューテックスで行われた場合、キューからの削除はスレッドセーフです。

&quot; forking&quot; Webサービスはファイルを開くのと同じくらい簡単です:

fclose(fopen(&quot; http://somewebservice....php?a1 = v1&amp; a2 = v2&amp; ....&quot;)); // Webサービスを起動して続行...

このアプローチはマルチスレッドであるだけでなく、本質的に分散されています。 Webサービスは、ローカルまたは世界中に配置できます。 PHPは確かに気にしません。

基本的なシステムの場合、あなたを阻む唯一のものは、apacheが許可するスレッドの数です。それ以外の場合、コードはロードバランシングと、高度なApache実装が提供する他のすべての巧妙なトリックを利用する準備ができています。

開発者が「マルチスレッド」と考えると、頻繁に「OMGはフォークとexec、待機、PIDを処理する必要がある」と考えています。そして、そのようにシステムを設計する場合、その通りです。非常に複雑になります。戻って、指定されたものを使用します。ディレクトリにアクセスできましたか?ブーム-キューがあります。 Webコールを発行できますか?ブーム-マルチスレッド(分散)アプリがあります。ここで、アプリの指示に従ってコンセプトをマージします。

PHPはマルチスレッドではありません。複数のファイル呼び出しまたは分岐によって強制的に実行しようとすると、結果は通常最適ではありません。私はこれに反対することを提案しますが、js、php(おそらくcurlではなく、カスタムphp ファイルストリーム)、およびロングポーリング

それは可能です。curl_multi_init()を見てください。

いいえ、そうではありません。ダウンロードマネージャーがダウンロードを処理するクラスを5回呼び出すため、つまり、PHPクラスインスタンスであるため、これは不可能です。

これはクラス呼び出しのサンプルです:

$tr = new teConnections();
$data = $tr->downloadManager(array('http', 'host', path', 'login', 'pass', 'port'), 'file name, compression, streaming); 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top