Category Archives: PHP

Новый подход к тестированию Zend Framework/Doctrine приложения: пусть тестируют пользователи!

Когда проект растет, то, как правило, растет и его кодовая база, количество модулей, да и число программистов, вовлечённых в проект. Постепенно от закачки файлов по ftp (если такое было 🙂 команда переходит к Subversion/Git репозитарию, тикет-системам и начинает использовать инструменты для увеличения производительности совместной работы.

Сложный код, плавающие баги и инсайт

Мы три дня ловили баг. Есть такая противная категория ошибок – плавающие баги.  Гейзенбаг (англ. Heisenbug) — термин, используемый в программировании для описания программной ошибки, которая исчезает или меняет свои свойства при попытке её обнаружения. Это слово, в отличие от слова «баг», в русском языке практически не используется. Не полностью идентичный, но достаточно близкий по значению русскоязычный термин — «плавающая ошибка». Примером могут являться ошибки, которые проявляются в окончательном варианте программы (релизе),

PHP & APC & SVN не работающая инвалидация кэша при операциях с Subversion

Премия “грабли дня” сегодня присуждаются php-расширению “APC”. Вкратце, APC это байт-код кэшер, который кэширует операцию преобразования php скрипта в байт-код, позволяя каждый раз не загружать код заново из файла, а по-быстрому доставать из сегмента shared memory. Ещё одно преимущество в том, что сегмент памяти шарится между процессами php, и когда на сайт заходит вторйо пользователь, то он идёт уже “на всё готовенькое”.

Автосжатие в php-memcached после 20 000 символов при выключенном сжатии

После переезда на новый сервер, мы запустили сайт. Грузился он конечно очень быстро, но хотелось ещё быстрее. Посмотрели, а у нас выключено страничное кэширование. После включения начал вылезать мистический баг…

Хранение сессий в Memory Storage Engine и переполнение кучи (heap)

Сегодня речь порйдёт об интересных граблях с авторизацией на сайте. Хранение сессий у нас реализовано в БД, с помощью Zend_Session_SaveHandler_DbTable. Это очень удобно, т.к. быстрее чем хранение в виде файлов, и нагляднее. Так вот, сегодня при авторизации вдруг стало выдаваться сообщение: Error: Zend_Session is currently marked as read-only. Также очень часто вылетала вот эта ошибка: Exception thrown without a stack frame in Unknown on line 0

Введение в HandlerSocket: описание протокола и расширения php-handlersocket

Сейчас на волне популярности различных NoSQL решений создана интересная разработка – плагин для MySQL, реализущий NoSQL доступ к нему, представленный 20 октября 2010г Yoshinori Matsunobu.  В этой заметке я рассмотрю сам протокол, а также его реализацию в php-расширении php-handlersocket.

Интеграция Zend_Cache_Frontend_Page, Nginx и Memcached или 1000 запросов в секунду

Сколько грузится ваш движок? Я имею в виду число врмя генерации скрипта? 0,5 0,6 или может быть аж целую секунду? 🙂 Наш вот срабатывает за 0,8. После последних оптимизаций (см. предыдущие статьи) стал отрабатывать за 0,5. Это примерно 2 запроса в секунду. Хотите раскажу, как довести это число до 1000*?

DQL to Raw SQL

Я довольно давно работаю с Doctrine ORM, и очень часто при отладке необходимо посмотреть, какой именно SQL запрос получается из DQL запроса. Для этого раньше я использовал $dql->getSqlQuery() вместе с $dql->getParams(). Первая команда отображает SQL-запрос плейсхолдерами (“?”) вместо переменных, а вторая собственно отображает массив переменных. Приходится смотреть туда-сюда, чтобы сопоставить их. Ладно если запрос маленький, а если большой – то это быстро утомляет.

Подключение PHP-FPM и Memcached к Nginx

На продакшен сервере у нас связка Nginx (отдает статику) + Apache (отдает динамику) + mod_php. Задумали отказаться от Apache, а заодно и подключить PHP в режиме FastCGI с помощью php-fpm, т.к. исследование показало прирост скорости.