Отправка больших файлов по HTTP

У меня есть клиент PHP, который запрашивает файл XML через HTTP (т.е. загружает файл XML через URL-адрес). На данный момент размер XML-файла составляет всего несколько КБ. Проблема, которую я могу предвидеть, заключается в том, что XML станет размером в несколько мегабайт или гигабайт. Я знаю, что это огромный вопрос и, вероятно, существует множество решений, но какие идеи у вас есть для передачи этих данных клиенту?

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
4 961
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Gallery2, которая позволяет загружать фотографии через http, позволяет настроить несколько параметров php, post_max_size и upload_max_filesize, чтобы разрешить загрузку большего размера. Возможно, вы захотите изучить это.

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

У браузеров не должно быть проблем, я использовал HTTP для загрузки файла размером 3 ГБ в одно из моих приложений в прошлом. Это заняло большую часть дня, но в конце концов добралось до цели.

Ady 29.10.2008 21:49

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

Спасибо за ответы. Я не упомянул, что передача файла должна быть относительно быстрой (максимум несколько минут, это вообще возможно?). Запрошенный XML будет анализироваться и вставляться в базу данных каждую ночь. XML может быть тем же, что и накануне вечером, или другим. Одно из предложенных решений - заархивировать XML-файл и затем передать его. Таким образом, есть два основных требования: 1. он должен быть относительно быстрым; 2. он должен минимизировать количество операций записи в базу данных.

Одно из предложенных решений - заархивировать XML-файл и затем передать его. но это удовлетворяет только (1)

Есть другие идеи?

Сначала вы сказали, что XML может вырасти до гигабайт, а теперь говорите «максимум несколько минут». Вы не можете сделать и то, и другое.

Paul Tomblin 30.10.2008 00:06
Ответ принят как подходящий

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

кроме того, можно ли просто отправить уже существующий сегмент XML, а не весь файл?

Отправка сегментов была бы хорошей идеей, и это определенно осуществимо.

CoolGravatar 29.10.2008 23:01

отлично, я бы посоветовал хешировать весь файл на обоих концах и сравнивать хеши перед началом передачи. если есть обновления, просто отправьте сегмент (сжатый, как упомянуто), а затем соедините его на «клиенте». если вы не привязаны к XML, возможно, более легкое решение (json?) может быть лучше

Owen 30.10.2008 00:15

Учитывая, что XML создается динамически с вашим PHP, самое простое, что я могу придумать, - это обеспечить автоматическую gzip-архивировку файла веб-сервером, как описано здесь, он предлагает общий подход PHP и решение для Apache httpd.

Кроме того, наличие браузера (что еще может быть PHP-клиентом?) Выполнять такую ​​работу каждую ночь, так как синхронизация данных звучит так, будто где-то еще должно быть гораздо более простое решение.

И, конечно же, в какой-то момент передача «большого количества» данных займет «много» времени ...

"что еще может быть PHP-клиентом?" Другой сервер - вроде soapclient = P

Peter Bailey 30.10.2008 00:22

Работая локально, php сможет загружать файлы через интерфейс командной строки, который можно добавить как задание cron.

nickf 30.10.2008 03:53

Есть ли какие-нибудь алгоритмы, которые я мог бы применить для сжатия XML? Как большие файлы, такие как MP3, загружаются за считанные секунды?

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

Owen 30.10.2008 00:13

MP3-файлы не имеют размера в несколько ГБ

Shinhan 30.10.2008 11:40

PHP получение ГБ данных займет много времени и накладных расходов. Еще более заметны изъяны.

Я бы отправил назначение сценарию оболочки (wget с простым отловом ошибок), которого не беспокоит время выполнения, и в случае сбоя, возможно, даже можно было бы повторить попытку по собственному усмотрению.

У меня нет опыта в этом, но, хотя можно использовать exec () или что-то подобное, они, к сожалению, работают модально.

Вызов скрипта с **./test.sh &** заставляет его работать в фоновом режиме и решает эту проблему, я полагаю. Скрипт может легко позволить вашему PHP забрать его резервную копию через wget `http://yoursite.com/continue-xml-stuff.php?id=1049381023&status=0´. Идентификатор может быть именем файла, если вам не нужно восстанавливать потерянные запросы. Статус будет указывать на то, как сценарий закончил обработку запроса.

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

Поскольку я не знаю подробностей вашей ситуации, я задам вопрос. Просто для аргументации, должен ли это быть HTTP? FTP намного лучше подходит для передачи больших объемов данных и может быть легко автоматизирован с помощью PHP или Perl.

Это не обязательно должен быть HTTP. Это был первоначальный план, но я могу использовать любой протокол ... FTP может работать. Однако я экспериментирую со сжатием XML, а затем отправляю его по HTTP.

CoolGravatar 30.10.2008 04:40

Проблема в том, что он синхронизирует два набора данных. Проблема полностью искажена.

Вам необходимо: а) вести дифференциальный журнал изменений в наборе данных A, чтобы вы могли отправить этот журнал в набор данных B, или б) сохранить две копии набора данных (прошлые ночи и текущий набор данных), а затем сравнить их, чтобы вы затем можно отправить дифференциальный журнал из A в B.

Добро пожаловать в мир репликации.

Проблема с (а) заключается в том, что он потенциально инвазивен для всего вашего кода, хотя, если вы используете СУБД, вы могли бы сделать некоторое ведение журнала через триггеры базы данных, чтобы отслеживать вставки / обновления / удаления и записывать информацию таблицу, а затем экспортируйте соответствующие строки как свой дифференциальный журнал. Но это тоже может быть неприятно.

Проблема с (b) заключается во всем «сравнении базы данных» сразу. Штраф за 100 рядов. Плохо для 10 ^ 9 рядов. Противно мерзко.

На самом деле все это может быть неприятно. Репликация неприятна.

Лучший план - изучить «настоящую» систему репликации, разработанную для конкретных баз данных, которые вы используете (при условии, что вы работаете с базой данных). Что-то, что, возможно, отправляет записи журнала базы данных для синхронизации, а не пытается откатить свои собственные.

Большинство современных СУБД имеют системы репликации.

Если вы используете Apache, вы также можете рассмотреть Apache mod_gzip. Это должно позволить вам автоматически сжимать файл, и распаковка также должна происходить автоматически, если обе стороны принимают сжатие gzip.

Другие вопросы по теме