Одновременная загрузка изображений php

284
07 марта 2017, 17:46

Есть метод которы подключается к удаленному ftp Где находится 1000 файлов. Он отдает запрос на загрузку и поочереди загружает их. Но время выполнения скрипта равно примерно часу и серсер после лимита времени убивает выполнение скрипта. Вопрос, можно ли как то загрузить непрерывно изоброжения? Как это правильно делается , подскажите пожалуйста

Answer 1

Убрать ограничение времени можно функцией set_time_limit
Если скрипт запускается из браузера, не лишено смысла также игнорировать потерю соединения с клиентом: ignore_user_abort

ignore_user_abort(true);
set_time_limit(0);
Answer 2

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

К сожалению, от скрипта в цикле и постоянного его выполнения это Вас не избавит, но поднимет производительность и надежность архитектурного решения по скачиванию большого количества файлов.

Пусть у вас есть сервер очередей (например, RabbitMQ), и есть 3 скрипта:

  1. Скрипт выполняющий получение всех названий файлов на сервере
  2. Скрипт выполняющий загрузку файлов с сервера
  3. Скрипт выполняющий обработку файлов, загруженных с сервера.

Вы создаете очередь, называете ее files_download, на эту очередь вешаете консьюмера (скрипт, выполняющий задания из очереди и постоянно ее проверяющий). Раз в n-времени, запускаете свой скрипт по cron, который будет получать список файлов c сервера (ftp_nlist) и формировать его на основе какого-то алгоритма (что скачивать, что нет), далее, отправляете n-заданий (n - количество файлов) в очередь files_download, и качаете их с помощью скрипта который уже следит за очередью по одному.

Задания в очередь ставятся чаще всего со всей нужной информацией на основе JSON, предположим задание на скачивание будет выглядеть примерно вот так:

{"file": "ftp://my.server.com/file1.pdf"}

Можно добавлять дополнительные параметры, если они требуются скрипту.

Далее, по необходимости, после скачивания файла ставится задание на его обработку в другую очередь (files_processing) и выполняются какие-то другие сложные действия по конвертации и т.д.

Плюс данного решения в том, что вы никогда не потеряете файлы которые нужно скачать, можете повесить на очередь хоть 50 консьюмеров и качать в 50 потоков с разных серверов (все ограничено только клиентской и серверной пропускной способностью и количеством возможных коннектов) не поднимая многопоточность на уровне PHP, все будет контролировать очередь сообщений обеспечивая надежное выполнение заданий.

READ ALSO
Почему вывод не работает?

Почему вывод не работает?

Здравствуйте, странно то если делаю выводи с ограничением по id тогда выводит, а с email почему то нетВот код:

268
Как вывести дату с MySQL в PHP?

Как вывести дату с MySQL в PHP?

Как с MySQL в php вывести дату если она имеет вот такой вид 14878812143994 ?

288
Не записываются COOKIE

Не записываются COOKIE

Добрый вечерПытаюсь записать в куки значение

345