2011-12-24 6 views
1

インターネットから非常に大きなファイルをダウンロードするスクリプトを作成しました。HTTP経由でファイルをダウンロード中にCPU使用率を減らす

非常に簡単な何か:

<?php 
$source = fsockopen(…); // http 
$destination = fopen(…,'wb'); // file 
while (!feof($source)) 
{ 
    fwrite($destination,fread($source,4096)); 
} 
fclose($source); 
fclose($destination); 
?> 

それは素晴らしい作品が、毎秒約10メガバイトをダウンロードするときに、このスクリプトは私のサーバー上で100%のCPUを使用しています。それは普通ですか?

インテルXeonクアッドコアX3323 @ 2.50 GHzです。

P.S.スクリプトはHTTPヘッダーを最初に読み込むため、実際は少し複雑ですが、問題はありません。

答えて

1

ほとんどの場合、最初にソケットでHTTPを実装すべきではありません。あなたは、あなた自身のソケット処理を行うことを主張読むために何もない場合freadは空の文字列を返すことに注意している場合代わりに、しかし、

copy("http://example.net/", "example.html"); 

ようcurlまたは単にのfopenラッパーを使用します。ソケットがノンブロッキングモードの場合、freadはただちに''を返します。 socket_set_blockに電話して、ソケットをブロッキングモードに戻すことができます。

<?php 
$source = fsockopen(…); // http 
$destination = fopen(…,'wb'); // file 
socket_set_block($source); 
stream_copy_to_stream($source, $destination); 
fclose($source); 
fclose($destination); 
+0

OPが明示的に非ブロック化していない限り、ソケットはデフォルトでブロックされませんか? – Alnitak

+0

@Alnitakはい。しかし、OPは多くのコードを残しておらず、そこには 'socket_set_nonblock'があるかもしれません。ソケットがブロックされている場合、ループは100%CPUを発生させません。 – phihag

0

いいえ、100%CPUを使用するだけで正常ではありません。

を使用して、1つのファイルストリームから別のファイルストリームへのコピーを処理することを検討しましたか?

+0

@phihag oops - thanks - corrected。 – Alnitak

関連する問題