4

私は PHP ファイル (サイトの機能) を持っています。これにより、ユーザーは別のサイトのアカウントからデータをインポートできます。
また、彼がデータをインポートするたびに、そこからたくさんの画像をコピーする必要があります。
たとえば、500 個の写真、それぞれ 300 ~ 500Kb が最小です。この数は、1 人のユーザーに対して 2000 枚の画像になると簡単に予想できます。

各写真の手順は次のとおりです。

  • 画像の URL を取得する
  • URL から画像を作成 (imagecreatefromjpeg などを使用)
  • サーバーに保存します(imagejpeg、imagepngなどの関数を使用)

このコードの実行にはすでに非常に長い時間がかかります (8 分以上)。
大量のデータがあることは承知していますが、別の方法でそれを行う方法はありますか?
バックグラウンドでコピーを実行したり、多くの写真を同時にコピーしたりできます。
このために特別に設計されたテクノロジーがあるかどうか知りたいだけですが、私はそれについて知りません.
または、画像の処理を一部の画像ホスティング サーバーに外注し、サムネイルのみを保持する以外に方法はありません。

ありがとう。

4

4 に答える 4

3

ここに行くべき情報はあまりありません。どのOSが使用されていますか?ソースサイトはどのくらい「リモート」ですか?画像はすでにどのような形式になっていますか?

他のサイトがリモート(つまり、別のホスティング会社)である場合、発生する主な問題は、ソースサーバーがデータをマシンにパイプダウンできる速度です。

ただし、大きな問題の1つは、「現在、画像はどのような形式になっているのか」ということです。画像がすでにJPEGである場合は、取得してから再度JPEGに変換すると、品質が低下します(わずかではありますが)。より良い方法は、画像ファイルを直接コピーすることです。これにより、PHPアプリがJPEGを再エンコードするのにかかる時間がなくなります。自問してみてください-本当に画像を変換する必要がありますか?

wget使用可能なOSコマンドによっては、転送を処理するアプリケーション( Linuxなど)を呼び出す方がよいでしょう。私は以前wget、リモートサーバーからローカルサーバーにファイルを取得していましたが、実行するのはそれほど難しくありません。

覚えておいてください-転送の手順が多ければ多いほど、転送にかかる時間が長くなります。現時点では、次のようになっています。

  • 検索
  • 変換
  • 書き込み

すべてPHPによって処理されます(おそらく最も遅いものから最も速いものへ)

ソースホストは、顧客にアーカイブまたはエクスポート機能を提供しますか?もしそうなら、それを利用してファイルをまとめて転送できますか?

PHPを可能な限り活用することで、プロセスがより迅速になります。システム関数(たとえば、、、など)を呼び出すとwgetftp処理sshimagemagickさらに高速になります(PHPおよびApache以外) 。

于 2012-09-12T12:16:50.687 に答える
1

スレッド化は明らかな答えのようです...

https://github.com/krakjoe/pthreads

私は、PHP にはスレッド化の可能性がないと言っている何百人もの人々の海の 1 つの声です... スレッド化を行うために curl に目を向ける現在の傾向は単に貧弱であり、宣伝するのはさらに悪いことに、そのようなことのオーバーヘッドは恐ろしいに違いありません...

PHP には常にマルチスレッド用のツールがありましたが、マルチスレッド Web サーバーをサポートしていなかったため、それらがなければ現在のツールはありませんでした。それは言語の設計目標ではないというだけであり、ユーザーランドスレッドをPHPに持ち込むためのこれまでの外部の取り組みは使用できず、Googleコードには存在しませんでした...次のプロジェクトのためにPHPにスレッドが必要です.私が持っているスレッド...そしてあなた、そして他のみんな、それは世界/ウェブへの私の贈り物です、楽しんでください:)

于 2012-09-13T19:32:48.953 に答える
0

これは、インターネット ($url パラメーター) からサーバー上のローカル ファイル ($file_path パラメーター) にファイルをダウンロードするために使用できる PHP 関数です。

function download_file($url, $file_path) {
   $out = fopen($file_path, 'wb');
   if ($out == FALSE){
      print "File not opened<br>";
      exit;
   }

   $ch = curl_init();
   curl_setopt($ch, CURLOPT_FILE, $out);
   curl_setopt($ch, CURLOPT_HEADER, 0);
   curl_setopt($ch, CURLOPT_URL, $url);   
   curl_exec($ch);
   //echo "<br>Error is : ".curl_error ( $ch);
   curl_close($ch);
   fclose($out);
}

次のように呼び出すことができます。

$url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/Iss030e015472_Edit.jpg/352px-Iss030e015472_Edit.jpg';
download_file($url,'/var/www/www.mysite.com/public_html/images/image_user1.jpg');

ファイルを保存するフォルダーに、Apache ユーザーの書き込み権限があることを確認してください。また、これが機能するために cURL php 拡張機能がロードされていることを確認してください。

この関数は、アプローチよりもはるかに高速である必要がありますimagecreatefromjpeg。試してみて、それでも遅いと感じる場合は、ガブリエルが提案したように、 curl_multi_initと並行して複数のリクエストを実行するキューを実装することで改善できます。

于 2012-09-12T12:33:33.323 に答える
0
  1. 画像のインポートを処理するためのある種のキューを設定します。この方法では、ユーザーは待機せず、スクリプトはタイムアウトしません。

  2. curl_multi_init()で並列リクエストを実行してみてください

于 2012-09-12T12:03:09.647 に答える