Эта тема на forum.dklab.ru


Валерий: Загрузка изображений на сервер с "маленьким" timeo
Добрый день.

Проблема:
Файлы загружаются на сервер через php-скрипт, где с ними далее что-то делается imagecopyresampled'ом.

Таймаут Apache = 300 секунд. Админ отказывается делать больше.

Некоторые картинки занимают по несколько мегабайт и
при медленном коннекте просто не успевают пройти за 5 минут.

Что можно сделать, поставить на определенную операцию (скрипт) больший таймаут, или как-нибудь разбивать картинки на несколько загружаемых частей, чтобы они загружались полностью и не бились, при том же timeout'e Apache в 300sec?

Извините, вопрос, наверное, не совсем по php, но очень хочется получить полезный совет.

Спасибо.
Валерий.
Дмитрий Эсс:
Валерий:
А что сложного в том, чтобы просто разбить файл на части?
Валерий:
(Если я Вас правильно понял)
Картинки загружают пользователи, им нет никакой радости разбивать файл на части ;) Тем более, я плохо понимаю, как его склеивать обратно...
Дмитрий Котеров:
300 секунд — это очень много. Пользователи вряд ли согласятся столько ждать.
По\ро какой timeout Вы говорите? max_execution_time?
Валерий:
Нет.
Просто если у пользователя картинка занимает 2048kb, а скорость закачки 3kb/sec, за время, пока сервер держит соединение успеет закачаться только 1500kb, и картинка побьется (не докачается 548kb, больше четверти картинки). Я хочу узнать как можно обойти timeout, чтобы пользователь мог поддерживать соединение с сервером более 5 минут?

Может быть, бывают какие-то хитрости?

Настройки Apache:
Max Requests Per Child: 100 - Keep Alive: on - Max Per Connection: 100
Timeouts Connection: 300 - Keep-Alive: 5
Дмитрий Котеров:
Ага. Значит, речь о настройке Timeout у Apache. Но тогда дело не в ней. Вот выдержка из документации:

The TimeOut directive currently defines the amount of time Apache will wait for three things:

- The total amount of time it takes to receive a GET request.
- The amount of time between receipt of TCP packets on a POST or PUT request.
- The amount of time between ACKs on transmissions of TCP packets in responses.

We plan on making these separately configurable at some point down the road. The timer used to default to 1200 before 1.2, but has been lowered to 300 which is still far more than necessary in most situations. It is not set any lower by default because there may still be odd places in the code where the timer is not reset when a packet is sent.

Вы точно уверены, что картинку не удается закачать именно из-за тайм-аута?
Валерий:
Думаю, да.
А какие могут быть еще часто распространенные варианты?

Я пробовал, на быстрых выделенных линиях бкз проблем закачиваются любые картинки, а на простом dial-up'е сколько-то времени загружается картинка, и потом все прирывается и она оказывается на сервере битой (время по моим подсчетам примерно 300 секунд, поэтому я и думаю именно на timeout).
Дмитрий Эсс:
Валерий:
Я неправильно понял задачу.
Валерий:
Валерий:
Я неправильно понял задачу.

Значит, я ее сначала неправильно преподнес.
Валерий:
В итоге, если эта проблема возникает из-за timeout'а, окольными путями ее никак обойти нельзя. Единственное решение - увеличение timeout'а?
Ренат Ибрагимов aka MpaK:
может сделать так, что пользователь заливает по фтп, а потом уже запускает твой скрипт, который уже проходит по каталогу и делает ресайз?
Валерий:
может сделать так, что пользователь заливает по фтп, а потом уже запускает твой скрипт, который уже проходит по каталогу и делает ресайз?

Это слишком сложно... не в плане техническом, а для пользователя.

Они должны выбрать файл, нажать на кнопочку - что будет дальше, не их проблема...
Дмитрий Котеров:
Вообще, странно все это больно. Не должен Timeout у Apache влиять на время закачки POST-данных. Либо у хостера стоит какой-то ручной прибиватель чересчур долго работающих апачей, либо я ничего не понимаю.

Что касается выхода — да, вероятно, другого способа нет. Однако с FTP не так все плохо, как кажется. Если на странице сделать редирект, например, на

ftp://user:password@site.com/temp_upload_dir/

то пользователь сможет закачать файл на сервер, просто перетащив его мышью в окно браузера. Конечно, если хостер не даст отдельного FTP-аккаунта, отличного от сайтового, такой вариант не очень удобен...
Валерий:
Спасибо всем большое за помощь.

Если все-таки как следует с этим разберусь, обязательно напишу здесь, в чем было дело.
bæv:
Файлы загружаются на сервер через php-скрипт

Может, всё-таки, дело не в Апаче, а в настройках php? Посмотрите, что у Вас стоит в max_execution_time, в memory_limit и в upload_max_filesize (особенно -- последний, там "по умолчанию" обычно 2М стоит).
Ренат Ибрагимов aka MpaK:
сталкивались с такой же проблемой, сошлись все же на том, что это при отправке данных с компьютера пользователя идет тормоз...

решили маленьким клиентом (на Delphi), пользователь выбирает одной кнопкой и шлет файл на фтп... :)

не плохой вариант и что Дмитрий предложил, только пользователь все равно ошибется в написании, то @ не туда поставит, то еще что пропустит и т.п.
bæv:
ftp://user:password@site.com/temp_upload_dir/

Кстати, после установки последних патчей к IE6 такой номер (логин:пароль в адресной строке) больше не проходит.
(типа, "из соображений безопасности")
Дмитрий Котеров:
Вот это здорово... Это же стандарт. Как же они — игнорируют его теперь?

пользователь все равно ошибется в написании
А Вы не заставляйте его это писать. Дайте просто ссылку.
bæv:
Вот это здорово... Это же стандарт. Как же они — игнорируют его теперь?

Если честно, я сам не проверял, хотя патчи и поставил.

А информация -- из "Компьютерры" #6(530).
Валерий:
Файлы загружаются на сервер через php-скрипт

Может, всё-таки, дело не в Апаче, а в настройках php? Посмотрите, что у Вас стоит в max_execution_time, в memory_limit и в upload_max_filesize (особенно -- последний, там "по умолчанию" обычно 2М стоит).

max_execution_time 30
memory_limit 31M
upload_max_filesize 2M

Дело точно не в upload_max_filesize'e, при долгой зарузке бились картинки и намного меньше.

Memory Limit, по мне, стоит более чем неслабый.

Единственное, может дело в max_execution_time. Но я так понимаю, в него не входит время загрузки post-данных на сервер?
bæv:
Но я так понимаю, в него не входит время загрузки post-данных на сервер?

Насколько я понимаю, как-раз таки входит: если загрузка ведётся скриптом, и выполнение скрипта прерывается из-за превышения допустимого времени -- что с загружаемыми данными будет?..
Дмитрий Эсс:
http://php.net/manual/en/features.file-upload.common-pitfalls.php
Дмитрий Эсс:
Там max_execution_time присутствует.
Валерий:
Но я так понимаю, в него не входит время загрузки post-данных на сервер?

Насколько я понимаю, как-раз таки входит: если загрузка ведётся скриптом, и выполнение скрипта прерывается из-за превышения допустимого времени -- что с загружаемыми данными будет?..

Но я без проблем загружал на 31200 диалапе картинки по 600kb=200sec в лучшем случае, и сервер все воспринимает без проблем, догружает их до конца, обрабатывает тройку-четверку секунд и выдает положительный ответ об окончании операции. Это точно (насколько я понимаю), противоречит 30 секундам max_execution_time.

Наверное, я в чем-то заблуждаюсь?
Валерий:
Там max_execution_time присутствует.

Note: max_execution_time only affects the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such ... time taken by the file upload process, etc. is not included when determining the maximum time that the script has been running.

Т.е., если я все правильно понял, upload_time не включается в max_execution_time
Дмитрий Эсс:
Валерий:
Попробуйте увеличить все возможные показатели с http://php.net/manual/en/features.file-upload.common-pitfalls.php , такое чувство, что это нам надо решить проблему. Экспериментируйте.
Дмитрий Котеров:
Поговорите с хостером. Напишите ему письмо, попросите объяснить, почему картинки бьются и нет ли у них специфичных программ, которые убивают Apache, если ое чересчур долго проводит в idle. Давите на него, пока он не ответит четко: есть у него дополнительные программы или же нет. А то так можно долго гадать на кофейной гуще.
Дмитрий Эсс:
Зачем тогда повашему было писать про max_execution_time в наиболее частых проблемах с закачкой фалов?
If max_execution_time is set too small, script execution may be exceeded by the value. Make sure you set max_execution_time large enough.
Валерий:
Валерий:
Попробуйте увеличить все возможные показатели с http://php.net/manual/en/features.file-upload.common-pitfalls.php , такое чувство, что это нам надо решить проблему. Экспериментируйте.

Дмитрий, я (наверное, к счастью, а не к сожалению) не админ сервера, и поэтому сам ничего менять не могу.
И на сервере лежит не один мой сайт, поэтому прекрасно понимаю админа, который не хочет ставить большие значения параметров, отвечающих за ресурсы.
А то кто-нибудь обязательно забавы ради запустить цикл $i++ от 1 до гугола (10 в 100 степени) ;)
bæv:
Попробуйте увеличить все возможные показатели

Кстати, Валерий, а что у Вас в post_max_size стоит?
Валерий:
Зачем тогда повашему было писать про max_execution_time в наиболее частых проблемах с закачкой фалов?


Да, это верно...
Спасибо за помощь, еще сам попробую поразбираться.
bæv:
не админ сервера

А .htaccess Вы править можете?
Дмитрий Эсс:
Валерий:
Смотрим табличку тут http://php.net/ini_set и функцию http://php.net/set_time_limit .
Валерий:

post_max_size стоит 8M.
Этого вполне достаточно.

В .htaccess могу, но, думаю, не более, чем всякие ErrorDocument и DirectoryIndex.

В phpinfo() мои права на htaccess где-нибудь пишутся?
bæv:
Смотрим табличку

Эта тема на forum.dklab.ru