PHP

Почему я перешел с PHP на Ruby on Rails? 17 июля 09

Короткий ответ такой: я перешел с PHP на Ruby on Rails, потому что Rails позволяет мне делать все, что я делал на PHP, и получать от этого больше удовольствия. А я не представляю себе программирования без удовольствия. читать дальше →

Многопроцессовые демоны на PHP 20 сентября 08

Демоны на PHP

Disclaimer: вы можете сказать, что PHP – это Personal Homepage Preprocessor (устаревшая расшифровка, кстати), что писать демоны на PHP неэффективно, что есть c/c++/perl/erlang, но не напрягайтесь. Я и так это знаю.

Но вот незадача – кто портирует ваш Zend/Cake/Symfony/CodeIgniter на все эти замечательные и труЪ-полноценные языки?

Так что, читаем дальше. Или идем портировать. То есть, вы идете, а я остаюсь. Кстати, буду безмерно благодарен. Удачи!
читать дальше →

Read-From, Write-Through: улучшаем кеш страниц 19 сентября 08

Предыстория

Есть кеш страниц, организованный по принципу 404-й. То есть – если страница лежит в кеше, она отдается сервером без участия PHP; если ее там нет – по обработчику 404-й ошибки вызывается MainController сайта, который генерирует страницу, кладет ее в кеш и отдает клиенту.

Кроме того, страницы экспайрятся по каким-то событиям. Неважно, каким. Важно, что экспайрятся, и время от времени их нужно повторно генерировать. Это решается удалением из кеша заэкспайренной страницы, после чего при запросе страницы снова вызывается PHP.

Проблема

Если в то время, пока страница генерируется скриптом, запросить ее еще раз, будет запущен еще один экземпляр скрипта и он тоже займется страницей. А при следующем запросе – еще один. И еще. В общем, race condition и в целом неправильная ситуация.

Задача

Устранить race condition с минимальным использованием PHP (предположим, что запуск и инициализация фреймворка на PHP – дорогостоящая операция).

Решение

Суть в том, что сервер каким-то образом должен понять, что страница уже генерируется, и новый скрипт не запускать. Но каким? Углубляться в настройки nginx, который стоит на продакшн, желания нет.

Первая попытка — при запуске PHP ставить флажок «занимаюсь этой страницей», а при следующем запуске – его проверять, и если флажок стоит, то просто подождать. Плохо. Это избавляет нас от лишнего прогона скрипта, но поток PHP все равно занят.

Вторая попытка — при запуске PHP немедленно записывать в кеш пустую страницу. Плохо. Кто-то ее увидит и расстроится. Так что пустая страница проблемы не решает.

Третья попытка (и последняя)

Экспайренные страницы не удаляются из кеша, а переименовываются – например, к ним приписывается суффикс «.old». Таким образом, при обращении к странице будет вызван PHP. А PHP, увидев, что есть старый (хоть какой-то) экземпляр этой страницы, немедленно переименует ее обратно – чтобы работал кеш – а уже после этого сгенерирует новую страницу и положит ее на место устаревшей.

Бинго! PHP запускается не чаще, чем в исходной постановке задачи, а кеш стал надежнее и эффективнее.

Jenkins – Анализатор лога ошибок Apache 25 августа 08

Реальность сурова — каким бы тщательным не было тестирование, на продакшне всегда будут ошибки. Одно из положительных изменений, связанных с переездом на VPS — я получил полноценный лог.

Стыдно, но на StudLife за три дня скопилось четверть гигабайта лога (куда его девал предыдущий хостер, интересно?). Надо было что-то делать, при том, что руками такой объем информации обработать не просто сложно — это нереально.

Что ж, лень, как всегда, двигатель прогресса. Написал анализатор лога. Что он умеет: читать дальше →

Задерка между итерациями 30 июля 08

Не знаю, насколько это очевидно, но sleep можно поместить в условие окончания цикла: эта функция всегда возвращает 0 либо FALSE, а, как известно, x||0 == x

do {
  $result = mysql_query('...');
  $task = mysql_fetch_assoc($result);
  mysql_free_result($result);
} while (!($task || sleep(1)));

Так-то!
UPD: спасибо Alex за исправление.

Как я Zend-сертификацию проходил 26 июля 08

О самомотивации

Довольно странно зарабатывать на жизнь программированием на PHP и не иметь желания (или возможности) получить аттестат профпригодности – в университете таких не дают, да и уровень не тот. Быть сертифицированным специалистом и себе приятно, и, разумеется, выделяет из серой массы пыхыпышников, которых в отрасли как собак нерезаных.
читать дальше →

Генерация XML в PHP 14 июля 08

Рассматривая примеры генерации XML-выгрузок от различных украинских маркетов (не буду никого смущать прямыми ссылками), удивлен тем, что многие используют обыкновенную шаблонную методику, вроде: читать дальше →

Отладка PHP средствами Firebug 4 июля 08

FirePHPОтладка PHP-скриптов определенно недостаточно освещена в интернете. Потому многие, очень многие довольствуются print_r-ками. Очевидный недостаток такого способа – нельзя отладить AJAX, SOAP-сервисы, генераторы картинок и вообще скрипты, не отдающие непосредственно HTML-документов.

Javascript-разработчики используют для отладки Firebug. Как я им всегда завидовал. Лепота – выделенная консоль, net-монитор, отладчик, и все это в любимом браузере.

Так вот, нашел такое расширение Firebug – FirePHP. Оно позволяет выводить информацию в консоль Firebug непосредственно из PHP. Делается это довольно простым вызовом:
читать дальше →

PHP5 как скриптовый язык для Windows 22 марта 08

На этих выходных занимаюсь уборкой, в т.ч. и на компьютере. Уборка связана с кучей повторяющихся действий – хочется их автоматизировать и уйти пить пиво. Однако…

У *никсоидов есть shell-скрипты и Perl. Завидую.
У пользователей Windows есть BAT-скрипты, js-скрипты и vbs-скрипты. У первых не хватает гибкости, а Javascript или VBScript учить смысла нет.

Но ведь у меня есть PHP с его колоссальными возможностями. А PHP5 можно использовать через Command Line Interface, короче, вызывать скрипты без сервера, с командной строки. Выглядит это где-то так:

>php.exe script.php

Коряво и ненативно. Я расскажу, как можно довести PHP-скриптинг под Windows до такого же удобства, что и BAT. Вру – до такого же, что и shell-скрипты. Линуксоиды обзавидуются!
читать дальше →

Сборщик мусора в PHP 5 18 марта 08

Сегодня на работе разбирался с PHPшным сборщиком мусора. Обнаружилась одна жутко неприятная вещь, которая называется recursive reference memory leak – объекты с перекрестными ссылками не удаляются из памяти.

Как известно, объекты PHP 5 реализуются через механизм smart-pointer. Понимание этого механизма вообще нужно для адекватной работы с объектами, так что изложу вкратце. Осторожно, мнение выходца из C++. :)
читать дальше →