Потребовалось сделать пользователям сайта возможность аплоадить mp3-файлы. Поскольку речь идет о файлах размером 5-10 MB, а скорость соединения у юзеров неизвестно какое, не помешало бы прикрутить и прогресс-бар. Кроме того, хотелось бы получить достаточно простое решение (т.к. и сам сайт простой на банальном php, да и я не веб-разработчик). И еще чтобы все это вертелось на lighttpd :).
Если бы у нас был Apache, а PHP работал бы как его модуль, то проблема легко решалась бы через расширение php5-uploadprogress. Пример в комлекте с этим расширением заводится с пол-оборота, все просто и понятно. Другой вариант - APC + json. Но у нас lighttpd и PHP в режиме fastcgi, и эти решения для него не подходят.
У lighttpd есть свой mod_uploadprogress, но он доступен только в версии 1.5, которая пока еще в разработке и в портах ее нет. Более того, представленное демо этого модуляна домашней страничке lighttpd вообще не работает :). Примеры, которые там можно скачать, с собранным вручную lighttpd 1.5 у меня тоже не пошли. Возможно что-то изменили в текущей svn-сборке (раз даже демка на сайте не работает), и эти примеры уже не актуальны. А может быть и руки у меня кривые :).
Тем не менее, решение все-таки было найдено. На странице описания mod_uploadprogress упомяналось про патч для версии 1.4.x, который правда ведет себя несколько иначе, но вроде бы уже полгода как стабилен.
Итак, начнем. Менее месяца назад в lighttpd была найдена серьезная уязвимость, поэтому обязательно обновляем порты. После этого выполняем следующие действия:
# cd /usr/ports/www/lighttpd/
# make patch
# cd work/lighttpd-1.4.*/
Рабочий пример прогресс-бара удалось найти тут. В нем используется только html + javascript (JQuery). Признаком того что модуль вообще работает, должны быть следующие повторяющиемся с определенным интервалом строчки в error.log:
Если при этом не работает прогресс-бар, то здесь уже необходимо работать над совместимостью браузера и java-скриптов. В дальнейшем, чтобы не засорять лог, вывод этой информации можно отключить в конфиге lighttpd, исправив строчку:
upload-progress.debug = "disable"
Вроде бы не сложно. Но в условиях нехватки информации и отсутствии рабочих примеров - далось не легко. Поэтому решил оформить статью.