Общение php -> erlang

Аватар пользователя Алексей

Понадобилось мне устроить общение между php и erlang. Из всех двух доступных вариантов я выбрал peb (PHP-Erlang-Bridge). Ниже я подробненько опишу процесс компиляции модуля для php 5.3.* и 5.4.*. В первую очередь для себя, чтобы при настройке на продакшене не тратить время на грабельки ;о)

Шаг 1. Подготовка
Скачиваем исходные коды по ссылке выше, распаковываем.
Если у Вас php 5.4.* посмотрите в конец статьи, там описано что нужно сделать прежде чем приступать к компиляции.

$ wget http://mypeb.googlecode.com/files/peb-0.20b.tar.gz
$ tar xzvf peb-0.20b.tar.gz
$ cd peb-*

Шаг 2. Установка.
Если не стоит erlang:

$ sudo yum install erlang

Без него дальнейший процесс бесполезен, так как нам нужна библиотека erl_interface
Далее находим где в дистрибутиве собственно находится эта самая библиотека. Можно сделать поиск по файлу ei.h
Например у меня в CentOS 6 x64 это /usr/lib64/erlang/lib/erl_interface-3.7.5/

$ phpize
Если команда не найдена, то $ sudo yum install php-devel

$ ./configure CC="gcc -L/usr/lib64/erlang/lib/erl_interface-3.7.5/lib/ -I/usr/lib64/erlang/lib/erl_interface-3.7.5/include/" --enable-peb

Указываем явно местонахождение библиотеки. Конфигуратор её не видит. Ваш путь может отличаться от моего, посему перепроверьте.

Далее всё просто. Если при конфигурировании было всё верно указано, то:

$ make
$ sudo make install

После получения сообщения о том, что модуль скомпилирован, идём в каталог /etc/php.d/ и сщздаём там файл peb.ini. В файле нужно указать extension=peb.so, чтобы наше расширение подхватилось php автоматически.

И последний шаг - рестарт httpd или php-fpm. Что у Вас настроено.

Но всё это касалось только установки на php 5.3.*

PHP 5.4.*

Для того, чтобы всё завелось на php 5.4.* необходимо провести сеанс шаманства с файлом peb.c
Строки 300-301:

list_entry * le ;
list_entry * newle;

заменить на:

zend_rsrc_list_entry * le ;
zend_rsrc_list_entry * newle;

Строка 371:

newle = pemalloc(sizeof(list_entry),persistent);

заменить на:

newle = pemalloc(sizeof(zend_rsrc_list_entry),persistent);

И строка 374:

zend_hash_update(&EG(persistent_list), key, key_len+1, newle,sizeof(list_entry), NULL );

заменить на:

zend_hash_update(&EG(persistent_list), key, key_len+1, newle,sizeof(zend_rsrc_list_entry), NULL );

А далее уже всё как для php 5.3.*

Tags: