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 просраться кирпичами популяризация такой замечательной СУБД среди веб-разработчиков!

blog comments powered by Disqus