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