Ad Discendum, Non Ad Docendum

Для того, чтобы учиться, а не для того, чтобы учить

PHP4+XSLT+ZendOptimizer

Posted by Денис Лозко Fri, 16 Feb 2007 13:04:00 GMT

Я уже писал, что мне приходят дайджесты fido7.ru.unix.bsd. Так вот очередная заинтиресовававшая меня тема: ”xslt+zend=core dump”.

Суть проблемы заключается в том, что если у вас с утра в гороскопе было сказано, что будут проблемы, а вы не признаете гороскоп, или же вы поставили не на ту сферическую лошадку в вакууме, или же просто так и в добавок ко всему у вас есть PHP4, использующий свой extension xslt вместе с ZendOptimizer (как cli так и апач с mod_php) , то у вас заимеется возможность поближе подружится с софтом, который “выпадает в корку”. Причем, действительно не понятно (во всяком случае мне и пока) по какой причине такое происходит.

У меня это было на одной из машин, находившихся в моей юриздикции.

Об помощи, я даже спрашивал у “знатоков” в PHPClub‘е…

Sergey A. Gribchenko также напоролся на эту проблему, о чем он не поленился написать в рассылку UAFUG‘а. К тому времени методом научного тыка я уже нашел один способ, как заставить апач работать и не выпадать в кору, чем там же и поделился.

Алгоритм весьма прост.

Для того, что бы запустить сам апач, коментируем в соответсвующем ini-файле (/usr/local/etc/php.ini и /usr/local/etc/php/extensions.ini) строчку о XSLT-модуле.

/usr/local/etc/php/extensions.ini:

1 extension=mysqli.so
2 extension=snmp.so
3 extension=mbstring.so
4 extension=mysql.so
5 extension=pcre.so
6 extension=xml.so
7 ;extension=xslt.so
8 extension=bz2.so
9 extension=mcrypt.so
10 extension=session.so
11 extension=zlib.so
12 extension=openssl.so
13 extension=tokenizer.so
14 extension=pdf.so
15 extension=gd.so
16 extension=ctype.so
17 extension=sqlite.so

Стартуем апач, снимаем коментарий, и делаем

# apachectl graceful
/usr/local/sbin/apachectl graceful: httpd gracefully restarted

В результете получаем работающий mod_php c XSLT и ZendOptimizer’ом.

Недостаток налицо: при старте системы сам апач так не подымется, и не каждый duty-андроид в состоянии понять, что надо сделать и зачем.

Впоследствии, применив повторно метод, придуманый выдающимся немецким математиком и врачом Гансом Фридрихом Тыком, был обнаружен еще один способ. Этот еще проще. Внимание, сейчас будет смешно.

Строчку c extension=xslt.so необходимо записать ДВАЖДЫ:

1 extension=mysqli.so
2 extension=snmp.so
3 extension=mbstring.so
4 extension=mysql.so
5 extension=pcre.so
6 extension=xml.so
7 extension=xslt.so
8 extension=xslt.so
9 extension=bz2.so
10 extension=mcrypt.so
11 extension=session.so
12 extension=zlib.so
13 extension=openssl.so
14 extension=tokenizer.so
15 extension=pdf.so
16 extension=gd.so
17 extension=ctype.so
18 extension=sqlite.so

В результате, конечно же, получим при старте кучу warning’ов наподобии этого:

> php -v
PHP Warning: Function registration failed - duplicate name - xslt_create in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_set_sax_handlers in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_set_scheme_handlers in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_set_error_handler in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_set_base in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_set_encoding in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_set_log in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_process in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_error in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_errno in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_free in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_set_object in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_setopt in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_getopt in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_backend_version in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_backend_name in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - xslt_backend_info in Unknown on line 0
PHP Warning: xslt: Unable to register functions, unable to load in Unknown on line 0
PHP 4.4.4 with Suhosin-Patch 0.9.6 (cli) (built: Dec 27 2006 12:51:47)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
    with Zend Extension Manager v1.0.8, Copyright (c) 2003-2005, by Zend Technologies
    with Zend Optimizer v2.5.10, Copyright (c) 1998-2005, by Zend Technologies

но зато работает, и стартует без проблем со стартом системы.

Единственная неувязочка - при обновлении самого textproc/php4-xslt, система стирает содержимое о модуле из extensions.ini, о чем заблаговременно позаботились разработчики bsd.php.mk. Лечится или вынесением одной из строчек в сам php.ini, или жешче: установкой флага schg на файл.

# ls -lo /usr/local/etc/php/extensions.ini
-rw-r–r– 1 root wheel - 306 Jan 8 20:47 /usr/local/etc/php/extensions.ini
# chflags noschg /usr/local/etc/php/extensions.ini
# ls -lo /usr/local/etc/php/extensions.ini
-rw-r–r– 1 root wheel schg 306 Jan 8 20:47 /usr/local/etc/php/extensions.ini

Главное об этом потом не забыть, когда чего нить досталять нужно.

Posted in , | 2 comments |