У меня возникла задача, которую я хз как решить. Есть сайт файлообменника. На главной странице main.php - форма загрузки файла. Сайт поддерживает несколько разных серверов. Нужно рандомно(или нет - не важно) перенаправлять форму с главной страницы файла на скрипт upload.php лежащий на этих серверах. На данный момент решил задачу по-варварски: методами PHP при генерации главной страницы просто вписываю в ACTION формы загрузки адрес нужного сервака. Но это хреново, т.к. любой чел, просмотревший код, может сделать такую форму у себя и грузить все по одной и той же ссылке (на один сервер). Хотелось бы сделать перенаправление на нужный скрипт методами ПХП на стороне сервера. Пример: Main.php отправляет данные формы на select.php в select.php происходит выбор сервера и header("Location: нужныйсервер/upload.php"); upload.php на одном из серверов принимает форму. но естественно header("Location:..."); просто перенаправляет юзера на страницу, не передавая этой странице post-данные главной формы. Пробовал разные заголовки: header("HTTP/1.1 301 Moved Permanently"); header("HTTP/1.1 303 See other"); и тп. ничо не помогает. Если это невозможно, то объясните мне плиз, как на сайте imageshack.us это сделано. У них главная форма обращается ACTION="post.imageshack.us" а файл картинки впоследствии оказывается на img14.imageshack.us/блаблабла.jpg
это как минимум 1. лишний трафик (двойной) 2. лишнее время ожидания для юзера (двойное) не думаю что они стали бы так делать оО к тому же, судя по логам wireshark у меня при загрузке файла идет обмен TCP-трафиком с каким-то айпишником, который даже не пингуется. Вот это сомнения вызывает.
Вполне логичный вопрос. Возможно, при заходе на страницу рандомно определяется сервер, куда будет загружен файл и открывается страница загрузки этого сервера через iframe.
то есть мы кагбе на основном сайте, видим УРЛ основного сайта, а во фрейме 100х100% открыта страница другого сервака? Идея интересная, но не катит) Ибо <form action="http://post.imageshack.us"> явно указан путь главного сервака, а не относительный путь скрипта)
А почему-бы и не сделать? Тем более, если сервера стоят в одном ЦОДе, то там с временем ожидания проблем нету... (если сразу перенаправлять трафик на нужный сервер) А вообще заставил задуматься.. Это можно реализовать кучей различных способов...
Я имел ввиду немного другое, но это не важно. Значит главный сервер закачивает файл на рандомный сервер. Dmit3Y, ага, по usb проводочкам файлы перекидывать
А вообще есть у меня мысль: 1) перед отправкой формы, на основном сервере генерируется ключ специальный (на основе данных сессии или еще чего-нибудь). Ключ добавляется в бд Скрипт возвращает адрес сервера и ключ. 2) Во время загрузки клиент отправляет методом POST ключ и файл. Сервер принимает файл и удаляет ключ из базы. Немного бред..Но я бы делал так. + предусмотреть защиту, чтобы ключ нельзя было получить простой имитацией запроса к серверу... UPD: Возможно совсем не бред... http://vk.com/developers.php?oid=-1&p=photos.getUploadServer Как видите, здесь при получении адреса сервера, в адресе присутствует ключ и прочие параметры...
Кластеры рулят =) Все это дело у imageshack реализовано самим вэб сервом, подобно и у многих посещаемых порталов: facebook, vk, youtube. Копай в эту сторону, если есть желание ^_^
Кластеры рулят =) Копай в эту сторону Насколько я понимаю, при использовании кластеров нет явного разделения по серверам (img14.imageshack.us / img15.imageshack.us / ...) я в своем проекте буду использовать именно разные серверы (даже физически расположенные в разных странах). вот отсюда и задача как-то организовать загрузку файла С ОДНОЙ формы по РАЗНЫМ серверам, не указывая при этом явно в action формы на какой сервер идет загрузка. то есть идеально было бы так: #main.html <form action="select.php"> <input type=file name=blabla> </form> #select.php <?php //выбор сервера из списка //пусть даже рандомно, не важно //перенаправление на скрипт upload.php лежащий на выбранном сервере ?> #upload.php <?php //загрузка файла и сохранение его на серв ?> можно конечно извратиться и, как было предложено, загружать данные сначала на основной сервер, а потом сокетами копировать файл на сервер-хранитель, но это опять же 1. лишняя нагрузка на основной сервер (главный сервер вообще ниче не должен кроме сайта обрабатывать в идеале) 2. лишнй расход трафика (2х) 3. лишнее время ожидания юзером (2х)
Как вариант подключить все хранилища к главному серверу (примонтировать c NFS или gvfs + ftp) напирмер: /home/user/storage/1 /home/user/storage/2 /home/user/storage/3 /home/user/storage/4 /home/user/storage/5 При получении файла php скриптом, сохранять в одну из этих папок. Т.е. сохранять сразу на сервер. UPD: Тогда запрос нужно будет на стороне клиента сразу отправлять на нужный сервер. Я о способе реализации чуть выше писал. Если хочешь скрыто, то в любом случае будет задействован основной сервер.
пасиба, идея насчет примонтировать заинтереосвала наверное буду делать так же как и щас - варварски менять action во всяком случае depositfiles так делает и ничо, живет...
Еще можно на каждом сервере хранить свой загрузчик. При доступе к сайту рандомно выбирается сервер и разворачивается iframe на все окно браузера. А там уже загружается через загрузчик определенного сервера.