Мой клиент хотел предложить пользователям возможность загрузки, но только после того, как они заполнили регистрационную форму (в основном имя и адрес электронной почты). Пользователю отправляется электронное письмо со ссылками на загружаемый контент. Ссылки содержат регистрационный хеш, уникальный для пакета, файла и пользователя, и они фактически переходят на страницу PHP, которая регистрирует каждую загрузку и выталкивает файл, записывая его в стандартный вывод (вместе с соответствующими заголовками. Это решение имеет присущие ему недостатки , но это то, как они хотели это сделать. Надо сказать, что я сильно их подтолкнул к 1.) ограничить размеры загружаемых файлов и 2.) подумать об использовании CDN (у них есть международные клиенты, но они размещены в США на 2 зеркальных серверах и балансировщик нагрузки, который использует липкие IP). В любом случае, это «работает для меня», но некоторые из их международных клиентов используют очень медленные соединения (скорость передачи данных ~ 60 кБ / с), а некоторые из этих файлов довольно большие (150 МБ). Поскольку это PHP-скрипт, который обслуживает эти файлы, он ограничен настройкой тайм-аута скрипта. Сначала я установил это значение на 300 секунд (5 минут), но этого было недостаточно для некоторых пользователей бета-версии. Затем я попытался вычислить время ожидания сценария на основе размера файла, разделенного на соединение со скоростью 100 Кбит / с, но некоторые из этих пользователей работают даже медленнее.
Теперь клиент хочет просто увеличить значение тайм-аута. Я не хочу удалять тайм-аут все вместе на случай, если скрипт каким-то образом попадет в бесконечный цикл. Я также не хочу произвольно увеличивать время ожидания для некоторой общей скорости соединения с наименьшим общим знаменателем (большинство людей загружают намного быстрее, чем 100 Кбит / с). И я также хочу иметь возможность сказать клиенту в какой-то момент: «Посмотрите, эти файлы слишком велики для такой обработки. Вы влияете на производительность остальной части веб-сайта с помощью этих 40-минутных подключений. Нам либо нужно переосмыслите, как они доставляются, или используйте файлы меньшего размера. "
Я имею в виду пару решений:
- CDN - переместите файлы в службу CDN, например Amazon или Google. Мы все еще можем регистрировать попытки загрузки через файл PHP, но затем перенаправить браузер в настоящий файл. Одним из недостатков этого является то, что пользователь может обойти сценарий и загрузить непосредственно из CDN, как только у него будет URL-адрес (который можно найти, просмотрев заголовки HTTP). Это неплохо, но нежелательно.
- Расширение фермы серверов - Расширение фермы серверов от 2 до 4+ серверов и удаление правила закрепления IP из балансировщика нагрузки. Недостаток: это серверы Windows, поэтому они дорогие. Нет никаких причин, по которым они не могут быть блоками Linux, но настройка всех новых блоков может занять больше времени, чем клиент.
- Настройка 2 новых серверов строго для обслуживания этих загрузок - В основном те же преимущества и недостатки, что и у # 2, за исключением того, что мы могли бы по крайней мере изолировать остальную часть веб-сайта от (и точно настроить новые серверы для ) этот конкретный процесс. Мы также можем довольно легко сделать эти Linux-боксы.
- Определение скорости подключения пользователей - Я имел в виду способ определения текущей скорости пользователя с помощью AJAX на целевой странице загрузки, чтобы определить, сколько времени занимает загрузка статического файла с известный размер файла, затем отправка этой информации на сервер и вычисление времени ожидания на основе этой информации. Это не идеально, но лучше, чем оценивать скорость соединения слишком высокую или слишком низкую. Я не уверен, как получить информацию о скорости обратно на сервер, поскольку в настоящее время мы используем заголовок перенаправления, отправляемый с сервера.
Скорее всего, # 1-3 будут отклонены или, по крайней мере, отодвинуты. Так 4 хорошо ли это делать, или есть что-то еще, что я не учел?
(Не стесняйтесь оспаривать оригинальное решение.)