通过HTTP下载文件时减少CPU使用率

时间:2011-12-24 12:30:25

标签: php sockets

我创建了一个从互联网上下载非常大的文件的脚本。

非常简单:

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

它工作得很好但是这个脚本在我的服务器上使用100%CPU,每秒下载大约10 MB。这是正常的吗?

这是Intel Xeon四核X3323 @ 2.50 GHz。

P.S。事实上它有点复杂,因为我的脚本首先读取HTTP头,但这并不重要。

2 个答案:

答案 0 :(得分:1)

在大多数情况下,您不应该首先使用套接字实现HTTP。相反,使用curl或简单地打开包装器,如

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

但是,如果您坚持自己进行套接字处理,请注意fread如果没有任何内容可读,则返回空字符串。如果您的套接字处于非阻塞模式,则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);

答案 1 :(得分:0)

不,使用100%CPU只是这样做是不正常的。

您是否考虑过使用stream-copy-to-stream()来处理从一个文件流到另一个文件流的副本?