Сократите использование процессора при загрузке файлов через HTTP - PullRequest
1 голос
/ 24 декабря 2011

Я создал скрипт, который загружает очень большие файлы из Интернета.

Что-то довольно простое:

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

Работает отлично, но этот скрипт использует 100% ЦП на моем сервере при загрузке около 10 МБ в секунду. Это нормально?

Это Intel Xeon Quad Core X3323 @ 2,50 ГГц.

P.S. На самом деле все немного сложнее, потому что мой скрипт сначала читает заголовки HTTP, но это не имеет значения.

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

В большинстве случаев не следует реализовывать HTTP с сокетами. Вместо этого используйте curl или просто fopen wrappers, например

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);
0 голосов
/ 24 декабря 2011

Нет, используя 100% CPU, просто делайте это ненормально.

Рассматривали ли вы использование stream-copy-to-stream() для обработки копии из одного файлового потока в другой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...