PHP
Короткий ответ такой: я перешел с PHP на Ruby on Rails, потому что Rails позволяет мне делать все, что я делал на PHP, и получать от этого больше удовольствия. А я не представляю себе программирования без удовольствия. читать дальше →
Демоны на PHP
Disclaimer: вы можете сказать, что PHP – это Personal Homepage Preprocessor (устаревшая расшифровка, кстати), что писать демоны на PHP неэффективно, что есть c/c++/perl/erlang, но не напрягайтесь. Я и так это знаю.
Но вот незадача – кто портирует ваш Zend/Cake/Symfony/CodeIgniter на все эти замечательные и труЪ-полноценные языки?
Так что, читаем дальше. Или идем портировать. То есть, вы идете, а я остаюсь. Кстати, буду безмерно благодарен. Удачи!
читать дальше →
Предыстория
Есть кеш страниц, организованный по принципу 404-й. То есть – если страница лежит в кеше, она отдается сервером без участия PHP; если ее там нет – по обработчику 404-й ошибки вызывается MainController сайта, который генерирует страницу, кладет ее в кеш и отдает клиенту.
Кроме того, страницы экспайрятся по каким-то событиям. Неважно, каким. Важно, что экспайрятся, и время от времени их нужно повторно генерировать. Это решается удалением из кеша заэкспайренной страницы, после чего при запросе страницы снова вызывается PHP.
Проблема
Если в то время, пока страница генерируется скриптом, запросить ее еще раз, будет запущен еще один экземпляр скрипта и он тоже займется страницей. А при следующем запросе – еще один. И еще. В общем, race condition и в целом неправильная ситуация.
Задача
Устранить race condition с минимальным использованием PHP (предположим, что запуск и инициализация фреймворка на PHP – дорогостоящая операция).
Решение
Суть в том, что сервер каким-то образом должен понять, что страница уже генерируется, и новый скрипт не запускать. Но каким? Углубляться в настройки nginx, который стоит на продакшн, желания нет.
Первая попытка — при запуске PHP ставить флажок «занимаюсь этой страницей», а при следующем запуске – его проверять, и если флажок стоит, то просто подождать. Плохо. Это избавляет нас от лишнего прогона скрипта, но поток PHP все равно занят.
Вторая попытка — при запуске PHP немедленно записывать в кеш пустую страницу. Плохо. Кто-то ее увидит и расстроится. Так что пустая страница проблемы не решает.
Третья попытка (и последняя)
Экспайренные страницы не удаляются из кеша, а переименовываются – например, к ним приписывается суффикс «.old». Таким образом, при обращении к странице будет вызван PHP. А PHP, увидев, что есть старый (хоть какой-то) экземпляр этой страницы, немедленно переименует ее обратно – чтобы работал кеш – а уже после этого сгенерирует новую страницу и положит ее на место устаревшей.
Бинго! PHP запускается не чаще, чем в исходной постановке задачи, а кеш стал надежнее и эффективнее.
Реальность сурова — каким бы тщательным не было тестирование, на продакшне всегда будут ошибки. Одно из положительных изменений, связанных с переездом на VPS — я получил полноценный лог.
Стыдно, но на StudLife за три дня скопилось четверть гигабайта лога (куда его девал предыдущий хостер, интересно?). Надо было что-то делать, при том, что руками такой объем информации обработать не просто сложно — это нереально.
Что ж, лень, как всегда, двигатель прогресса. Написал анализатор лога. Что он умеет: читать дальше →
Не знаю, насколько это очевидно, но 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 за исправление.
О самомотивации
Довольно странно зарабатывать на жизнь программированием на PHP и не иметь желания (или возможности) получить аттестат профпригодности – в университете таких не дают, да и уровень не тот. Быть сертифицированным специалистом и себе приятно, и, разумеется, выделяет из серой массы пыхыпышников, которых в отрасли как собак нерезаных.
читать дальше →
Рассматривая примеры генерации XML-выгрузок от различных украинских маркетов (не буду никого смущать прямыми ссылками), удивлен тем, что многие используют обыкновенную шаблонную методику, вроде: читать дальше →
Отладка PHP-скриптов определенно недостаточно освещена в интернете. Потому многие, очень многие довольствуются print_r-ками. Очевидный недостаток такого способа – нельзя отладить AJAX, SOAP-сервисы, генераторы картинок и вообще скрипты, не отдающие непосредственно HTML-документов.
Javascript-разработчики используют для отладки Firebug. Как я им всегда завидовал. Лепота – выделенная консоль, net-монитор, отладчик, и все это в любимом браузере.
Так вот, нашел такое расширение Firebug – FirePHP. Оно позволяет выводить информацию в консоль Firebug непосредственно из PHP. Делается это довольно простым вызовом:
читать дальше →
На этих выходных занимаюсь уборкой, в т.ч. и на компьютере. Уборка связана с кучей повторяющихся действий – хочется их автоматизировать и уйти пить пиво. Однако…
У *никсоидов есть shell-скрипты и Perl. Завидую.
У пользователей Windows есть BAT-скрипты, js-скрипты и vbs-скрипты. У первых не хватает гибкости, а Javascript или VBScript учить смысла нет.
Но ведь у меня есть PHP с его колоссальными возможностями. А PHP5 можно использовать через Command Line Interface, короче, вызывать скрипты без сервера, с командной строки. Выглядит это где-то так:
>php.exe script.php
Коряво и ненативно. Я расскажу, как можно довести PHP-скриптинг под Windows до такого же удобства, что и BAT. Вру – до такого же, что и shell-скрипты. Линуксоиды обзавидуются!
читать дальше →
Сегодня на работе разбирался с PHPшным сборщиком мусора. Обнаружилась одна жутко неприятная вещь, которая называется recursive reference memory leak – объекты с перекрестными ссылками не удаляются из памяти.
Как известно, объекты PHP 5 реализуются через механизм smart-pointer. Понимание этого механизма вообще нужно для адекватной работы с объектами, так что изложу вкратце. Осторожно, мнение выходца из C++. :)
читать дальше →