Архив категории ‘Web-dev’

Perl CGI: How to asynchronously upload multiple files

Monday, March 14th, 2016

If you pass by then just pass by.

Alexey Ivanov «Dormitory-on-Blood»

async

This is a quite frequently used control in the modern web UIs. The user just selects file or files as usual but then he has no need to submit the form and wait for the page to reload. The files are uploaded immediately by Ajax and the result can be seen immediately too.

jQuery makes this task trivial from the frontend point of view but the server side is not so clear. Especially if you use Perl. So I will try eliminate the lack of information with this small post.

(more…)

Метки: ,
Категория: Perl, Web-dev | 2 Комментариев »


Varnish: кэширование с учётом cookies

Tuesday, August 28th, 2012

— Думает, думает, – проворчал Муравей. — Что бы стало в лесу, если б все думали.

Сергей Козлов «Ёжик в тумане»

Возникла задача поднять кэширующий прокси-сервер. Но не простой прокси-сервер, а такой, который сможет кэшировать страницы в зависимости от определённой куки, определённым образом влияющей на отображение страницы.

Вариантов решения скорее всего здесь может быть много, но я смотрел в сторону varnish, с которым раньше приходилось работать и который мне чрезвычайно симпатичен. Главным же препятствием казалось то, что varnish по умолчанию не кэширует страницы, содержащие куки – раньше никогда этого и не требовалось, а куки и вовсе вырезались. Но решение нашлось. Varnish не подвёл.

(more…)

Метки:
Категория: Varnish, Web-dev | 1 Комментарий »


XHProf: профилирование PHP

Friday, April 27th, 2012

Черную кошку в темной комнате искать бесполезно, особенно если ее там нет, а черного бультерьера – небезопасно, особенно если он там есть.

Народная мудрость

Если приходится иметь дело с web-приложениями, написанными на php, то надо быть готовым разбираться с тем, почему приложение работает медленно, откуда растут ноги у тормозов, почему растёт использование системных ресурсов при увеличении нагрузки и так далее. Тут очень пригодятся инструменты, позволяющие собрать кое-какую статистику о различных аспектах работы приложения.

Особую прелесть приобретает этот процесс, если ты не являешься автором приложения, и оно представляет для тебя просто большой закрытый чёрный ящик. Тогда профилирование приложения без тщательного исследования кода позволит проделать в чёрном ящике дырочку для нашего любопытного взгляда.

(more…)

Метки: , ,
Категория: Drupal, Nginx, PHP, Web-dev | Нет комментариев »


Отправка сообщений в Jabber через web

Tuesday, April 17th, 2012

— Мне сказали — умный человек.
— Ну мало ли что про человека болтают!

— «Тот самый Мюнхгаузен»


Эта краткая заметка посвящена отправке сообщений по протоколу XMPP с помощью Perl. В данном случае это будет не простой Perl-скрипт, а cgi-сценарий под веб-сервером, хотя суть и не меняется. Фактически и не заметка это будет, а просто набор рабочего кода, который может пригодиться в будущем. Если пригодится кому-то кроме меня самого, то вообще прекрасно.

(more…)

Метки: , ,
Категория: Perl, Web-dev | Нет комментариев »


Drupal: остаёмся без Apache. Nginx + php_fpm

Friday, March 16th, 2012

Конечно, лучший индеец – это мёртвый индеец.

— Харуки Мураками «Охота на овец»

No Apache
Связка вида Apache + nginx всегда была для меня чем-то самим собой разумеющимся. Nginx отлично раздаёт статику, но не имеет поддержки php, perl, ajp и ещё многого нужного. Так бы и продолжалось дальше, но в какой-то момент я всё таки решил выкинуть одно звено из этой цепочки. И слабым звеном был признан Apache, не столько потому, что для работы сайта на Drupal он оказался совсем необязательным, а скорее из желания поэкспериментировать.

Целью эксперимента при этом вовсе не является желание ускорить работу сайта. Это всё-таки не Perl, где при переходе на FastCGI появляется изрядная прибавка в скорости выполнения, щедро оплачиваемая необходимостью переписывать код для совместимости с FastCGI. Но зато мы должны получить большую нагрузоустойчивость и меньший расход оперативной памяти сервера.

(more…)

Метки: , ,
Категория: Drupal, Nginx, Web-dev | 2 Комментариев »


Sphinx, часть 3. Real-Time индексы

Monday, November 8th, 2010

— Мы забрели в зону с сильным магическим индексом, — объяснил он, — Когда-то давно здесь образовалось мощное магическое поле.
— Вот именно, — ответил проходящий мимо куст.

— Терри Пратчетт «Цвет Волшебства»

Минувшим летом команда Андрея Аксёнова осчастливила комьюнити новой версией Sphinx за нумером 1.10-beta. Среди прочих полезных нововведений вроде строковых атрибутов и многопоточного поиска была фича, название которой заставило моё сердце биться быстрей – RT-индексы. При более подробном изучении документации возбуждение поугасло, ибо ожидания мои, видимо, были сильно завышенными. Но тем не менее шаг вперёд сделан. И какой шаг! Это то, чего старому Сфинксу очень не хватало, отчего до сих пор в некоторых задачах приходилось пользоваться старым-добрым, но сильно тормознутым LIKE.

Итак, мы получили быстрый поиск по индексу, обновляющемуся в реальном режиме времени. Но кармические законы вселенной подсказывают, что необходимо при этом что-то и отдать и от чего-то отказаться. А отказаться придётся от префиксов и инфиксов (будем надеяться на будущие версии), от MVA-атрибутов (аналогично), а также подготовиться к тому, что индекс обновлять нам придется вручную. Последний пункт означает, что при добавлении записи в базу надо сделать INSERT в индекс, при удалении из базы – DELETE из индекса, а при изменении записи в таблице – REPLACE всё в тот же индекс. Неудобно, но за всё надо платить. Раньше в такой ситуации пришлось бы переиндексировать весь индекс целиком или хотя бы дельту.

Посмотрим более детально.

(more…)

Метки: , ,
Категория: MySQL, Web-dev | 3 Комментариев »


Редирект после запроса HTTP POST

Thursday, July 15th, 2010

Протокол HTTP подразумевает выполнение редиректа на новую страницу после обработки данных, полученных от пользователя методом POST. Само собой, это не обязательно. А на страницах, где методом POST отправляется некоторый поисковый запрос, это вообще ни к чему. Нужен он лишь в случаях, когда отправленные данные где-то на сервере сохраняются – тогда редирект позволяет избежать двойной отправки данных при перезагрузке страницы по F5 или при возврате на неё.
Если следовать протоколу, то согласно RFC 2616 сервер на запрос POST должен отвечать статусом 303 See Other, так как обычный для редиректа статус 302 Found должен использоваться по стандарту только для запросов GET или HEAD. Единственным подводным камнем можно считать то, что существуют юзер-агенты, не понимающие стандарта HTTP/1.1 и, следовательно, не знающие статуса 303. Впрочем, я склонен думать, что это раритет и ориентироваться на него не стоит. Тем более, что получение статуса 302 в ответ на POST-запрос может заставить некоторые браузеры, свято блюдущие букву стандарта, выдать пользователю предупреждение.
Вот как реализую редирект я.
(more…)

Метки: ,
Категория: Perl, Web-dev | Нет комментариев »


Nginx, часть 1: Начало

Wednesday, June 30th, 2010

— Не знал, что на небесах никуда без этого? Пойми, на небесах только и говорят, что о море. Как оно бесконечно прекрасно… О закате, который они видели…О том, как солнце, погружаясь в волны, стало алым как кровь. И почувствовали, что море впитало энергию светила в себя, и солнце было укрощено, и огонь уже догорал в глубине. А ты?… Что ты им скажешь? Ведь ты ни разу не был на море. Там наверху тебя окрестят лохом…

— «Достучаться до небес»

nginxНекоторые статистические данные показывают нам, что Nginx – это второй по популярности web-сервер в сети, держащий что-то около 35% рынка. Но мы-то с вами знаем, что на самом деле статистика эта собирается элементарным парсингом http-заголовков Server в ответах от серверов, и из этих 35% львиная доля Nginx’ов – это всего-навсего прокси-серверы, перекидывающие всю “нестатику” (удивительное дело!) спрятанному в бэк-энд Apache. Но стоит отметить, что как прокси-серверу Nginx’у практически нет равных (если, конечно, вам не хочется, например пообщаться с Tomcat’ом в бэк-энде по AJP13 – тут уж Nginx сядет в лужу), поэтому разберёмся с ним поближе.

В первой небольшой заметке по Nginx посмотрим, как Nginx поставить фронт-эндом перед Апачем и научить его отдавать статичный контент самостоятельно, оставив Апачу лишь разбираться с cgi. Преимущества такой схемы лежат на поверхности: мы разгрузим Apache за счет статики, а также за счет отсутствия необходимости поддерживать тред во время получения запроса и отправки ответа по медленному каналу. Плюс к этому, Nginx считается более легким и быстрым, чем Apache с его префорками, и скорее всего сможет дать выигрыш по скорости отдачи статичных элементов.

(more…)

Метки:
Категория: Linux, Nginx, Web-dev | Нет комментариев »


Делаем новостной календарь

Wednesday, June 2nd, 2010

— Рейхсфюрер, сейчас весна сорок пятого, а не осень сорок первого.
— Благодарю за напоминание, Вальтер. Я, представьте, каждый день заглядываю в календарь. По утрам.
— «17 мгновений весны»

Одной из стандартных фич на любом веб-портале является календарь новостей, позволяющий быстро выбрать новости за определённый день. Вот и я заинтересовался этой штукой и разобрался, как её реализовать. Как выяснилось, для этого потребуются лишь небольшие знания JavaScript, а также плагин jQuery-UI для фреймворка jQuery.
Что конкретно мы хотим получить? Мы хотим симпатичный календарик на сайдбаре страницы с новостями. Он должен выделять дни, за которые есть новости и давать пользователю кликать только на них. Он должен подгружать информацию о днях с новостями за каждый новый месяц, открываемый пользователем, а также сохранять в кэше уже подгруженную информацию. Да и хватит, пожалуй… Само собой, клик на дате в календаре должен вызывать переход на страницу с новостями за выбранный день.

(more…)

Метки: , , ,
Категория: Web-dev | 8 Комментариев »


Работа с сессиями в Perl

Monday, May 24th, 2010

Механизм сессий позволяет производить аутентификацию пользователей и сохранять некоторые данные между сеансами работы каждого пользователя в Web. Этот метод обладает рядом преимуществ перед вариантом с хранением всей пользовательской информации в cookies, потому как при этом все данные хранятся на сервере, а от пользователя необходимо получать только индентификатор сессии.

В Perl работу с сессиями обеспечивает модуль CGI::Session. Он позволяет сохранять данные о сессиях в файлах или в базе данных. Подерживаются в том числе такие вещи, как DB2 или SQLite. Нас же интересует в основном MySQL (CGI::Session::Driver::mysql).

(more…)

Метки: ,
Категория: MySQL, Perl, Web-dev | 6 Комментариев »