#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-файл большего размера. Общий размер файла вряд ли изменится, но я обнаружил, что при передаче большого количества файлов через мою глобальную сеть это в любом случае происходит быстрее.
-Будет