2010/12/28

Денвер для Линукс

Зачекаутил дед свн-ку - притянулась репка большая-пребольшая...
Опосля стал дед репку комитить: комитит-комитит, не может смёрджить. Позвал дед на помощь бабку-тимлида. Бабка за дедку, дедка в репку: мёрджат-комитят, вымёрджить не могут.
Позвала бабка внучку-практикантку. А Внучка что может сказать? Она этого свна не нюхала ещё, совсем зелёная. Спряталась за бабку, бабка за дедку, дедка снова за репку: стирают-переписывают, не могут закомитить.
Кликнула внучка Жучку из соседнего отдела. Жучка давай отпираться, мол, не трогали мы вашу репку, нафиг оно нам сдалось, у нас у самих недавно новый свн запилили, потому что в старом бардак, до сих не разобрались.
Кликнула Жучка кошку Машку в свидетели. А что Машка? Машка две недели в отпуске была и ничего ни за какие репы не знает.
Кликнула Машка мышку-файтера... Извините, это из другой сказки.
Кликнула Машка мышку-менеджера, потому что дело к вечеру и никого вообще не осталось, только дизайнеры укуреные чертей гоняют, но с них спрос маленький, а позвать кого-то надо, потому что ну ваааще край!
А сколько мышку ни кликай, она всё равно в угол смотрит. Потому что она только что от дизайнеров, а у них там ха-ра-шоооо =;) Они все хором давай её врубать в тему, что, мол, мы эту репку качнули, потом комитить надо, свн говорит: мёрдж! ну мы согласные, конечно, а он в отказ: не могу мёрдж, потому что какая-то скотина комитнула раньше, а кто это был уже ни разу не понятно. Мышка в это дело, понятно, не врубается, но откуда-то из нирваны им отвечает: апдейтнитесь, чуваки, полегчает =;)
Пипл удивился, но апдейтнулся. Потом мигом копию резервную сверху накатил и пошёл комит! Вытянули репку!


Это был эпиграф. С середины меня немного занесло, признаю. Но пост из одной строки про страшное вуду мод_реврайта вроде бы и не пост.
Сегодняшнее вуду я назвал "денвер для линукса". Лежит здесь http://code.google.com/p/angry/source/browse/#svn%2Ftags%2FDenwer4Linux
Ясно, что никакой это не денвер, это .htaccess, который ищет субдомены по подкаталогам. Без участия скриптового "роутера".
Однажды мне стало совсем лень на каждый тестовый проект заводить отдельный вхост и перегружать апач - в результате получилось это. Можно использовать как на виндовс, так и на линукс, не требует изменения hosts, желательны вайлдкард-настройки днс и апача. И не используйте это на продакшене. Хотя у меня оно трудится не только на девелоперской машине, но и на домашнем серверочке и на внешнем вдс. Сама сборка старая и многократно обкатанная, просто выложил только сейчас.

энжой!
=;)

зы: использование представленных скриптов исключительно на ваш страх и риск

2010/12/24

PostgreSQL, PL/PHP, Debian

Как всем известно (обожаю этот оборот ;) ), PostgreSQL - самая мощная из ныне существующих свободнораспространяемых баз данных...

Попробуем другое вступление. Всё началось когда, собирая хоть сколько-нибудь рабочий вариант web-API Storage::ETC, дело подошло к середине. Выяснилось, что замечательные функции _delete() и _update() на PL/PGSQL, написанные некоторое время назад, взлетать не хотят и сыпят ошибками. После некоторых сомнений они были заменены в коде на аналогичные обычные запросы, но осадочек остался. И тут я вспомнил про PL\PHP!

Скачать его можно запросто с командпромпта https://public.commandprompt.com/projects/plphp/wiki
Посмотрев в суперинформативные доки, можно обнаружить известные рекомендации: ./configure && make && make install
Вы могли догадаться по ходу сюжета, что сейчас появятся грабли. Пожалуйста:

Грабли раз. Первое сообщение говорит, что для плпхп нужен PHP SAPI embed. То есть, идём на php.net/downloads, качаем, компилим.
Полуграбли два: необходимо вовремя вспомнить, что мы крутые веб-разработчики, и Server API Apache Handler у нас уже поставлен, а пых работает только с одним апи. Следовательно, необходимо компилить отдельную копию.

Минимально необходимые опции ./configure --enable-embed --prefix=~/php-embed - префикс определяет тот каталог, куда будет ставится копия. Капитан Очевидность подсказывает, что лучше было б ставить в /usr/local, но этот пилотаж для бородатых одминов; если голова холодна - sudo вам в твёрдые руки.

Так как мы крутые веб-разрабы, то опции вроде --enable-libxml --with-pcre-regex --with-curl --with-xsl кажутся естественными. По той же самой причине у нас не стоят *-dev пакеты, которые предоставляют эти библиотеки. Их придётся ставить. Более-менее полный перечень граблей по ссылке >> http://vijaylad.com/?p=42 Почти все библиотеки в *buntu ставятся в через apt-get install lib%name%-dev, разве что курл выделился своим libcurl4-gnutls-dev.
Предупреждая полуграбли три: выключите весь sqlite, его собирать - ещё два часа потерять и не включайте safe-mode от зенда.
(Чисто по приколу подключите mysql и pdo ;) - дальше увидите, зачем)

Если не забыли указать --prefix, то make && make install поставит красиво в ~/php-embed. Можно переходить к компиляции самого plphp. Попробовали? Правда ведь, вкусно, как Орбит - Свежие грабли?

Не помню, какие именно вылезают первыми, но они обескураживают.
Я не сразу нашёл хаутушку с процессом установки. Весьма доходчиво он изложен в презентации от (ВНЕЗАПНО!) группы разработчиков. Хотя на сайте - ни слова. Установка PL\PHP и примеры использования http://www.slideshare.net/xzilla/intro-to-plphp-oscon2007-presentation
Процесс установки - с 20-го слайда, с 32-го - грабли.

./configure --with-php=~/php-embed --prefix=~/pl-php
Здесь также я заюзал префикс, на всякий случай; всё равно библиотека переставится сама ближе к постгре.
make && sudo make install - заметьте sudo, оно для разрешения записи со-шника в либы постгри.

Ничего, что дальше командами?
sudo su postgres -c psql
INSERT INTO pg_pltemplate VALUES ('plphpu','f','f','plphp_call_handler','plphp_validator','$libdir/plphp',null); - проверяйте структуру таблицы! различается в разных версиях.
Заметьте ещё две штуки: plphpu - unsafe php, $libdir/plphp - путь к библиотеке.

После CREATE LANGUAGE plphpu; идут последние грабли: plphp.so не может найти libphp5.so . Воспользуемся приведённым советом и сообразим софтлинк на libphp5.so. НО! не к апачу, как показано в презентации, а к свежесобранному - зря, что ли, делали?
ln -sf ~/php-embed/lib/libphp5.so /usr/lib/
Ещё раз CREATE LANGUAGE plphpu;

Всё. Радуемся.

CREATE FUNCTION php_rock(text)
RETURNS text
LANGUAGE plphpu
STRICT
AS $$
$ret = 'PHP ROCK YOU, %' . $args[0] . '%!';
return $ret;
$$;

SELECT php_rock('username');

энжой!
=;)

зы: ах да, зачем надо было компилить мускуль, пдо и т.д.: посмотрите презентацию дальше - запрос мускуля из постгри через встроенный пхп доставляет неслабый батхёрт поначалу фрустрирует.

зы2: ПОЛЬЗА??? польза в том, что через js-сокеты можно будет запрашивать view напрямую из базы модели и скинуть контроллер бизнес-логику инсайд. Как нам и говорит методика MMVC.
И заставить mysql просраться кирпичами популяризация такой замечательной СУБД среди веб-разработчиков!