我创建了一个从互联网上下载非常大的文件的脚本。
非常简单:
<?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头,但这并不重要。
答案 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()
来处理从一个文件流到另一个文件流的副本?