Прогресс при upload-е 1-го файла но одновременно несколькими пользователями

Gancherya

Новичок
Прогресс при upload-е 1-го файла но одновременно несколькими пользователями

Я прочитал не одни десяток сообщений на данную тему и просьба модераторов не говорить, что ответов на этот вопрос куча и не удалять этот вопрос. А вопрос вот какой.

Пользователю предоставляется возможность залить файл на сервер. При этом необходимо отображать прогресс заливки. Прогресс реализован с помощью AJAX и основан на определении размера временного файла на сервере. Проблем нет, если только один человек заливает файл. Но если одновременно несколько пользователей заливают файл на сервер, то этих временных файлов тоже несколько. И тут уж не разобраться какой временный файл относится к какому пользователю. Поэтому и определить прогресс корректно не получается. Кто сталкивался с подобным плиз хелп.
 

Gancherya

Новичок
Автор оригинала: StUV
может быть как раз с этим и стоит разобраться ?
Я ж об этом. Имя папки для временных файлов известно - оно указывается в php.ini. А вот как определить имя временного файла для конкретного юзера, если их одновременно несколько в папке?
 

StUV

Rotaredom
чесно, не занимался этим
но, думаю стоит копнуть в сторону ответа на вопрос - как пхп "узнает" - какому процессу какой файл отдать после закачки (т.е. как определяется tmpname для конкретного процесса)?
посмотри исходники + почитай rfc по http...

-~{}~ 01.05.08 02:53:

http://www.faqs.org/rfcs/rfc1867.html
http://www.faqs.org/rfcs/rfc2616.html

почитай, подумай - если что-нить получится раньше, чем кто-нибудь тебе ответит готовым решением - делись инфой ;)

-~{}~ 01.05.08 02:59:

вот здесь еще можно поковыряться
http://commons.apache.org/fileupload/

в общем инфы достаточно, лишь бы время было =)

+
в доках по последней ссылке объясняются принципы приложений управления аплоадом
а если еще и с java все ок - то быстро разберешься
 

Gancherya

Новичок
StUV-y:
Спасибо за ссылки. Почитал. К сожалению, ответ так и не вырисовался :(. Копаю дальше.

Alexandre:
Автор оригинала: Alexandre
использовать уже готовые скрипты,
а не изобретать велосипед
Почему в настоящее время поисковики становятся все менее пригодны для поиска информации? Да потому что информации слишком много и никто не контролирует ее качество. Все постят решения и не всегда факт, что эти решения работают. Я перебрал с sourceforge.net множество решений. И лишь с 10-го я нашел более-менее работающее решение. Это решение содержит только php- и js-скрипты - никаких cgi, что меня очень радует. Но вот возникла проблема и я ее описал. К сожалению, решения этой проблемы пока никто дать не может. Описание проблемы в начале темы. В двух словах - "Как во время загрузки файла на сервер (а не после ее окончания с помощью $_FILES['userfile']['tmp_name']) узнать имя загружаемого на сервер файла? Ведь если два пользователя одновременно грузят файл с помощью моего сайта на сервер, то во временном каталоге на сервере создается два временных файла и невозможно сказать, какой временный файл соответствует какому пользователю."
 

TutanXamoN

Новичок
Почему в настоящее время поисковики становятся все менее пригодны для поиска информации? Да потому что информации слишком много и никто не контролирует ее качество. Все постят решения и не всегда факт, что эти решения работают. Я перебрал с sourceforge.net множество решений. И лишь с 10-го я нашел более-менее работающее решение.
http://bash.org.ru/quote/396331
 

dimagolov

Новичок
На чистом PHP без патчей и дополнительных модулей это не решается. Вот есть решение, которое пользует APC как wrapper для php во время закачки файла, как по мне наиболее здоровое и идеологически правильное.
 

alekciy

Новичок
Автор оригинала: Gancherya
Описание проблемы в начале темы. В двух словах - "Как во время загрузки файла на сервер (а не после ее окончания с помощью $_FILES['userfile']['tmp_name']) узнать имя загружаемого на сервер файла?
PHP интерпретатор начнет отработку логики твоего скрипта только когда полностью получить файл на сервер. И изменить это нельзя, так уж создатели языка сделали. Поэтому реализовывать на PHP прес индикатор закачки представляется задачей довольно не простой, поэтому лучше такие вещи реализовывать другими языками.
 

StUV

Rotaredom
На чистом PHP без патчей и дополнительных модулей это не решается.
да ну ?
а среврайтить определенные запросы на локальный пхп-демон парсящий заголовки ? ;)

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

Gancherya

Новичок
Автор оригинала: StUV
да ну ?
а среврайтить определенные запросы на локальный пхп-демон парсящий заголовки ? ;)
Уважаемый StuV. Пока это лишь слова. Я был бы очень благодарен, если вы кинете пару линков или еще лучше приведете инструкции как это делать. Пока единственным разумным решением для загрузки файлов на сервер мне видется использование сторонних расширений или писать их самому, а не использовать стандартные средства php.
 

StUV

Rotaredom
Уважаемый Gancherya, на этой же странице рядом есть флейм про клиент-серверное приложение на пхп - там куча ссылок на необходимую информацию

копипастить это все сюда - не вижу особого смысла
 

alekciy

Новичок
Gancherya
Думаю, тебе вот это поможет: What's new in PHP V5.2, Part 5: Tracking file upload progress . Хоть и на инглише, но все с примера и с пояснениями.

-~{}~ 03.05.08 17:02:

StUV
А что, PHP демон как то по другому обрабатывает поступающие запросы?
Хотя для начала стоило бы определиться, что мы понимает под "демон/даемон". Как показывает практика обсуждений даже на этот форуме люди вкладывают разный смысл в этот термин.
 

Gancherya

Новичок
Всем огромное спасибо. Я таки добился своего - отображения прогресса при заливке файла на сервер. Как описывалось выше, проблема была в том, что в php нет возможности определить имя временного файла во временной директории в процессе заливки, а можно только по ее окончании. Я воспользовался расширением apc, вышедши на него через ссылку от alekciy за что ему отдельный сенкс :) Оказывается есть таки возможность получать размер переданного содержимого на сервер с помощью этой apc. Не буду описывать, как это работает - эта инфа есть по ссылке постом выше. Главное, что это работает, хотя в сети полно инфы, что там баги и прочая хрень. Пока на них не натолкнулся. Тестировал под виндой. Завтра потещу на линуксе.
 

alekciy

Новичок
Gancherya
Спасибо нужно сказать shaelf-у который и кинул мне такой отличный линк.

А о APC первым упомянул dimagolov, но остался не понятым. Имхо, линк не удачный, инфа в нем скудная особенно для первого, ознакомительного раза.

Alexandre тоже дал хорошую подборку линков, есть что выбрать. Меня лично mod_upload_progress заинтерисовал.
 

kode

never knows best
есть решение не через APC - самому обрабатывать аплоад вручную через CGI (я давно выкладывал рабочий пример) - плюс такого метода в том что можно обрабатывать файлы любой величины
 

iSlayter

Новичок
kode, а по-подробнее можно, про доступный для обработки размер файлов через apc? тестировал до 100Mb, работает. Таки приложение может себя повести неадекватно?

Причины и критический размер огласите, пожалуйста.
 

alekciy

Новичок
berkut
шо собсна аж пипец логично. нужно обрабатывать полностью полученый запрос, а не его кусок
Наверное это логично. Только вот зачем загружать канал закачкой файла, сохранением его на диск в temp директорию только за тем, что бы запустив PHP скрипт увидеть, что upload_max_filesize превышен, записать эту инфу на клиент/в_лог и отрубиться? А не проще ли было бы при получении Content-Length превышающем upload_max_filesize сразу скинуть клиента с соединения? Ведь в ходе upload занимаются системные ресурсы и как потом окажется в ходе запуска PHP скрипта занимаются зря.

Чисто умозрительно обратную сторону медали я вижу. Если бы PHP скрипт запускался при получении первый байт с клиента, Content-Length не превышал бы upload_max_filesize то скрипту пришлось бы висеть в ОЗУ все время upload-а, что для медленного клиента чревато вылетом в timeout. Да и ресурсы расходуются сильно. Получаеться, что создатели языка из двух зол выбрали меньшее?

Значит выходит в итоге, что бы сразу отвадить клиентов с upload-ом большим, чем upload_max_filesize (для разгрузки канала), нужно привлекать апач с его LimitRequestBody равным upload_max_filesize-у? Теоретически вроде как получается и волки ситы, и овцы целы....
 
Сверху