2009-10-23 8 views
7

PHP用のCURL拡張機能を使用してダウンロードマネージャを作成したいと思っていました。複数の接続と進行状況を表示するPHPのダウンロードマネージャーとしてのCURL

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

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

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

+4

PHPは、マルチタスクでは本当に良いではありません...あなたは何か他のものを使用するか、あなたはおそらく、いくつかの痛みのため;-) – jldupont

+0

とてもたくさんの署名され、検討すべきですたくさんの痛み! –

+0

@jldupont&Almosir:アーキテクチャの仕方によって異なります。固有の性質のWebサーバーを利用すると、並列、マルチスレッド、分散アプリケーションを構築するのが非常に簡単です。既に与えられているものを再エンジニアリングする必要はありません(PHPでも苦労しますが)。 – ChronoFish

答えて

0

curl_multi_exec()のようなcurl_multi_xyz()関数を使用すると、複数のリクエストを同時に処理することができます。同じファイルの複数のセグメンテーションを並行してダウンロードする場合は、CURLOPT_RANGEもご覧ください。 CURLOPT_READFUNCTIONCURLOPT_WRITEFUNCTIONで設定できるコールバック関数を使用すると、何らかの進捗データをクライアントに送信できます。

+0

それは本当ですが、同時にすべてのダウンロードを初期化する必要があります。私がダウンロードマネージャーを考えるとき、私は機能停止として、開始、追加、削除などを参照してください。カールはこれを自分で行うことはできませんでしたし、PHPもできませんでした。 –

1

PHPはマルチスレッドではなく、複数のファイル呼び出しやフォークなどで強制的に実行しようとすると、結果は通常最適ではありません。私は、この反対を示唆しているが、JSのミックスで、このような何かをすることは可能であろう、PHP(おそらくかかわらカールが、カスタムPHP file streamない)、およびlong polling

+0

ビジー状態のサイトで長いポーリングを行うと、利用可能なWebサーバーの接続数がすぐに消費されます。あまりPHP以外ではできません。 –

+0

私が言ったように、私はそれに反対して、それは準最適になるでしょう。しかし可能です;) –

0

それが可能だ、curl_multi_initに見てみましょう();

6

すべての批評家「PHPは、マルチタスクのための素晴らしいではありません」:を

バックステップを取り、あなたはLAMP環境にいる場合は、あなたの処分で素晴らしいマルチスレッドフレームワークを持っていることを考えます。この基本的なアーキテクチャーを、つまりApacheがマルチスレッド・マネージャーであるという利点を生かして活用してください。

この環境で動作するようにPHPを設定するのは非常に簡単です。スクリプトは、スクリプトが クライアントが

デザインの軽量シングルを中止された後でも実行できるように真indefinatly

  • セットはignore_user_abort =を実行できるようにする= 0

    1. 設定max_execution_timeは-task REST Webサービス。待ち行列型システムのように返ってきたときに気にしないように設計してください。キューへの書き込みはスレッドセーフであり、いくつかの基本的なOSレベルのミューテックスを使用すると、キューからの削除はスレッドセーフです。 Webサービスの「フォーク」

      は、ファイルを開くのと同じくらい簡単です:

      fclose(fopen("http://somewebservice....php?a1=v1&a2=v2&....")); // Launch a web service and continue...

      だけでなく、このアプローチは、マルチスレッド化され、それは本質的にも配布されています。ウェブサービスは、ローカルであってもよいし、世界中に位置していてもよい。 PHPは気にしません。

      基本的なシステムの場合、唯一のことは、Apacheが許すスレッドの数です。さもなければ、コードはロードバランシングとアドバンスドApacheの実装が提供しなければならない他のすばらしいトリックを利用する準備ができています。

      開発者が「マルチスレッド」と考えると、「OMG私はフォークとexecsとwaitsとPIDを処理する必要があります」と思うほどです。そのようにシステムを設計すれば、非常に複雑になります。与えられたものを使い戻してください。あなたはディレクトリにアクセスできますか?あなたは待ち行列を持っています。ウェブ通話はできますか? Boom - マルチスレッド(分散)アプリを持っています。今すぐあなたのアプリが指示するようにコンセプトをまとめてください。

  • +0

    マルチスレッドコメントはPHPに対応しています。スタックではありません。私はあなたに同意します。それは、PHP以外のものを使用するさまざまな方法で可能であると言った理由ですが、これはWebサービスの観点からは最適ではありません。 –

    +0

    バー、私はちょうど私が事故で投票したことを知った。私は投票を変更することができますので、あなたの答えを編集:) –

    +0

    どのように準最適?サーバーの負荷?彼は、どのような種類のオーバーヘッドパラレルWebサービスを作成するよりも、彼のCurlコールを長く待つことになります。もちろん、PHPだけではなく、ツールが使用されていなければ、それらを使用する必要があります。 "PHP"ソリューションをそれほど少なくしません。 – ChronoFish

    0

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

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

    $tr = new teConnections(); 
    $data = $tr->downloadManager(array('http', 'host', path', 'login', 'pass', 'port'), 'file name, compression, streaming); 
    
    関連する問題