PHP FTP загружает тысячи файлов

#php #arrays #upload #ftp #buffer

#php #массивы #загрузка #ftp #буфер

Вопрос:

Я написал небольшой класс FTP, который я использовал для перемещения файлов с локального сервера на удаленный сервер. Это делается путем сопоставления массива локальных файлов с массивом файлов на удаленном сервере. Если файл существует на удаленном сервере, он не будет утруждать себя его загрузкой.

Скрипт отлично работает для небольших объемов файлов, но я заметил, что на локальном сервере может быть более 3000 файлов изображений для передачи, это, похоже, приводит к сбою скрипта и передаче только 100 или около того.

Как я могу изменить скрипт для обработки потенциально тысяч файлов передачи изображений?

Ответ №1:

Запускайте cron чаще и ограничьте загрузку скрипта 80 изображениями за один запуск.

Ответ №2:

Может случиться так, что выполнение скрипта займет слишком много времени (это не относится к командной строке php), если это произойдет, ваш скрипт будет остановлен веб-сервером. Вы можете изменить настройки php, чтобы исправить это, но это не очень хорошо масштабируется (потому что у вашего браузера в конечном итоге тоже истечет время ожидания). Возможно, запуск скрипта из командной строки (называемый cli php) будет работать.

Мне кажется, что вы реализуете что-то, что уже существует. Вам следует взглянуть на rsync (для Linux), если у вас есть контроль над обоими серверами.

Комментарии:

1. Нет, у меня нет контроля над обоими серверами, и, к сожалению, у меня нет возможности командной строки. Скрипт будет выполняться на основе задания Cron.

2. Я добавил set_time_limit(0); и скрипт, похоже, все еще останавливается после примерно 100 загрузок.

Ответ №3:

Если проблема связана с php или временем ожидания браузера, вы можете создать файл (пример ниже) и выполнить его cron или вызвать из браузера.

 <?
echo "Running cli syncfiles.php";
system("amp;php syncfiles.php"); // amp; pushes file to background processing on linux 
?>
  

Если у вас возникла проблема из-за того, что ftp ограничивает ваши соединения или ограничивает ваши одновременные загрузки в течение x промежутков времени, то вы, вероятно, можете добавить в код какие-то таймеры.

 <?
$counter=0;
for($i=0;$i<$numftpfiles;$i  )
{
   syncfile($i); // this represents your sync code
   usleep(250000); // sleep for 1/4 second
   $count  ;
   if($count>50)
   {
     usleep(30000000); // sleep for 30 seconds
     $count=0;
   }
}
?>
  

Ответ №4:

Вы могли бы сначала заархивировать их на php http://www.php.net/manual/en/book.zip.php

Затем загрузите один zip-файл большего размера. Общий размер файла вряд ли изменится, но я обнаружил, что при передаче большого количества файлов через мою глобальную сеть это в любом случае происходит быстрее.

-Будет