вторник, 23 октября 2012 г.

Handlersocket клиенты для PHP

У меня долго не хватало времени написать этот пост, но поскольку сегодня у нас в офисе внезапно вырубилось электричество у меня неожиданно образовалось парочка свободных часов и я решил посвятить его написанию своего гневного обзора HS клиентов для PHP. Итак начнем.

1. php-handlersocket (http://code.google.com/p/php-handlersocket/) Во многих статьях по HS рекомендуют именно этот экстеншен. Я тоже его до поры до времени использовал. Ровно до тех пор пока дело не дошло до нагрузочного тестирования.   По сути в рамках этого проекта существуют две разные реализации клиента hsclient and native. Одна из которых(hsclient) вообще не работает(за что ей большое человеческое спасибо). Она просто вызывает segmentation fault при обращении к соответсвующим функциям. На то чтобы разбиратся с ней я убил всего пол дня - после сравнительно непродолжительного секса с участвием strace я  понял что дело это гиблое и решил скомпилировать этот же модуль но с использованием native реализации. Эта реализация оказалась гораздо коварнее - она очень хорошо работает в ситуации когда и MySQL и веб сервер находятся на одной машине - то есть на машине разработчика и на тестовым сервере. Но как только дело дошло до нагрузочного тестирования - и MySQL сервер оказался на другом физическом сервере и в другом сегменте LAN (возможно это тоже сыграло свою роль) я заметил проблемы. Примерно 10% запросов к странице заканчивались 500 ошибкой. Смотрю в логи - PHP ругается что в записях получаемых через HandlerSocket нехватает полей. В базе все поля в наличии - а Handler Socket читает их не до конца в некоторые рандомные моменты времени. Причем только при большом количестве одновременных соединений. С помощью tcpdump я сдампил все пакеты между MySQL сервером и выяснил что нужные данные всетаки приходят в полном объеме - но Handler Socket их не читает. На этом мое терпение кончилось и я решил отказатся от этого разширения. Посмотрев на его страницу внимтельнее я обнаружил большое количество баг репортов - но ни один из них так и не был отвечен с апреля месяца. Очевидно что данное разширение не поддерживается больше - так что если вы не хотите внезапно переписывать весь проект на другой экстеншен перед релизом - не стоит с ним связыватся.

2. Следующим на очереди Net_HandlerSocket (http://openpear.org/package/Net_HandlerSocket). После непродолжительных  попыток заставить его работать я понял что эта возьня не стоит свечь.  Плагин очень давно не обновлялся, генерирует кучу варнингов и вообще не содержит тестов.

3. HSPHP (https://github.com/tz-lom/HSPHP) - единственный работающий кандидат. Да это не модуль PHP поэтому он будет работать гарантировано медленнее чем первый клиент, но хотябы работает.  Плюч ко всему архитектура этого выглядит наиболее продуманной среди всех вариантов. Сразу видно людей знакомых с пэттернами проектирования.

воскресенье, 12 августа 2012 г.

Взбесило

Сегодня наткнулся на лучшую реализацию кэширования которая только может быть возможна:
https://github.com/Idol-IT/iwi

Пример кода - как этот чудо алгоритм должен был использоватся:


Yii::import('ext.iwi.Iwi');
$picture = new Iwi('images/sample.jpg');
$picture->resize(100,100, Iwi::NONE);
echo $picture->cache();
Вроде все классно, взяли картинку, сжали - закэшировали. Но господа веселые, цель кэширования - это не просто складывать барахлишко в кэш, но хотябы пытаться использовать его. Ну авторы забыли - подумаеш - с кем не бывает - подумал я и полез в код искать метод для проверки кэша. Благо документации нет практически никакой кроме этого README файла. 
Оказалось что не напрасно. Потому что метода для проверки кэша у них в принципе нет. А нахера он нужен. Главное же закэшировать а не брать из кэша.
Посидел -подумал как брать из кэша. Оказалось что никак. Нужно для каждой комбинации действий хранить закэшированный URL. Короче я решил что - в топку эту поделку, это как раз тот случай когда проще выкинуть и написать самому что тебе надо, чем с этим гавно разгребатся.

пятница, 10 августа 2012 г.

Хозяйке на заметку

Несколько полезных ссылок - напочитать.
http://dtrace.org/blogs/brendan/ - много полезного про исследования производительности систем
http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html - шпаргалка по базовым утилитам
http://www.markleith.co.uk/ очень полезный блог по MySQL оптимизации
http://www.percona.tv/mysql-conference/using-mysql-5-5-performance-schema использование perfomance schema в MySQL

четверг, 14 июня 2012 г.

Иерархия статических страниц на Magento

Нашел наконецто модуль для организации иерархии статических страниц в Magento. Низкий поклон автору за его работу - потому как модуль абсолютно бесплатный.
Подробнее о нем - http://www.johannreinke.com/en/2012/01/10/magento-cms-pages-in-a-tree-structure/
В добавок ко всему он выложил его в удобном для всех разумных существ виде - а именно как репозиторий на гитхабе, чем избавил всех от необходимости иметь секс с magento connect.
В общем этот модуль - must have для любого магенто магазина. 

воскресенье, 13 мая 2012 г.

Балансировка HTTP запросов

Сегодня восполнил свой пробел в области балансировки HTTP траффика. Оказывается что кроме round robin DNS, Nginx и HAProxy еще существует такая замечательная вещь как LVS. Для себя решил что нужно будет обязательно попробовать LVS как только переедем на собственные сервера.
Настройка LVS на русском языке - очень полезная статья про установку LVS на хабре
Practical Load Balancing by Peter Membrey, Eelco Plugge, and Dawid House   - книжка про балансировку нагрузки написанная на очень простом языке. Довольно многословная книжка, даже для специалиста среднего уровня - пол книжки можно пропустить. Не понимаю зачем  требовалось объяснять основы TCP/IP и HTTP в книге, посвященной балансировки нагрузки. Мне всегда казалось что люди занимающиеся балансировкой нагрузки - четко представляют себе как работают данные протоколы.  Но если пропустить весь словесный понос - то можно дочитать до подробного описания установки LVS и кое-какую информацию по оптимизации Nginx.

Пока гуглил на тему влияния worker_cpu_affinity на производительность Nginx наткнулся на http://tengine.taobao.org/ - китайский форк Nginx в котором привязка воркеров к процессорам делается автоматически.

суббота, 12 мая 2012 г.

Github Issues 2.0

На этой неделе зашел потыкать палочкой issues  на github и был очень приятно удивлен. Если раньше они годились только для code review и как мелкие заметки самому себе - то сейчас они прямотаки преобразились. Теперь в принципе там есть все необходимое для базового управления задачами. Это конечно ни разу не Jira  но для управления задачами на уровне небольших групп программистов - самое то. Интеграция с репозиториями - гораздо лучше чем в Jira, одно только закрытие задач при коммите чего стоит. Многие возразят что для Jira тоже есть плагины связывающие задачи и коммиты в репозиторий - но эти плагины так написаны, что лучше бы уж и не брались.  На прошлом месте работы мы пытались использовать один из подобных плагинов - примерно с месяц промучались пока не выяснили что этот плагин делает запрос к репозиторию на каждый показ страницы с задачей - поэтому у нас то репозиторий становился "задумчивым", то сервер самой Jira. Исходя из этого github issues 2.0 - самое то для управления задачами внутри команды программистов. Полное описание возможностей github issues 2.0 можно посмотреть здесь

      

пятница, 4 мая 2012 г.

Magento-баг в аутентификации

Сегодня наткнулся на весьма досадную багу в системе аутентификации магенты. Если сессия протухает и клиент сразу же пытается залогинится - логин не работает. То есть клиента перенаправляют на страницу логина, он вводит корректные логина/парол - нажимает отправить -  и его опять перенаправляют на эту же страницу. Молча. Никакого сообщения об ошибке или успешности логина. После продолжительного шаманства выяснились некоторые детали: 
1. Проблема существует только в клиентской части - в админке таже самая последовательность действи не воспроизводит проблему. 
2. При каждой попытке session ID меняется. 
3. При удалении всех кук проблема также пропадает.
Из второго пункта можно сделать вывод что при каждой попытке заводится новая сессия, а старая соответсвенно теряется. После некоторой медитации над заголовками запросов я попробовал отключить флаг - "HTTP only" в настройках сессии - и угадал. После установки этого флага в "No", все заработало.