Не подключаются Dynamic Extensions

alekciy

Новичок
Не подключаются Dynamic Extensions

PHP: 5.2.5.
ОС: FreeBSD 6.2.
Веб сервер: Apache 2.2.3.


Из портов поставил PHP и Apache, все установило и работает без проблем. Однако расширения совершенно нехотят загружаться.

К примеру из порта /usr/ports/graphics/php5-exif ставлю exif расширение. Инсталлируется без проблем. Модуль располагается в /usr/local/lib/php/20060613/exif.so. Он там точно есть, я вижу его в файловой системе. В extension_dir = /usr/local/lib/php/20060613 , в /usr/local/etc/php.ini (файл конфига точно этот, т.к. при изменении в нем параметров в phpinfo() видно что параметр изменился) прописано extension=exif.so. Все равно не грузиться. Пытался поставить другие расширения результат тот же. Компилиться, инсталируется, в конфигах все прописанно, модули есть, но в скрипты валяться в фатал обоснованием на undefined function.

Вот сижу и даже не знаю, что теперь делать и даже идей нет.
Код:
# pkg_info | grep php
php5-5.2.5_1        PHP Scripting Language
php5-exif-5.2.5_1   The exif shared extension for php
php5-fpm-5.2.5      PHP Scripting Language with FastCGI Process Manager
php5-sysvsem-5.2.5_1 The sysvsem shared extension for php
php5-sysvshm-5.2.5_1 The sysvshm shared extension for php
-~{}~ 04.02.08 04:08:

Да, кстати. extension_dir = "/usr/local/lib/php/20060613" пришлось задать вручную, т.к. phpinfo() показало дефолтное значение extension_dir = "/usr/local/lib/php/20060613-zts"
 

dimagolov

Новичок
/usr/local/etc/php/extentions.ini

каменты в php.ini для того, чтобы их читать (там только виндовые прописываются).
 

fixxxer

К.О.
Партнер клуба
>>дефолтное значение extension_dir = "/usr/local/lib/php/20060613-zts"

похоже что php у тебя собран с thread safety а extensions без. исправлением extension_dir не обойдешься ;)
хотя мог и старвый ини остаться
вобщем смотри error log
 

alekciy

Новичок
itprog
Конечно. И даже комп перегружал.

dimagolov
Я знаю, что только виндовые. Я сам руками прописал в /usr/local/etc/php.ini . В /usr/local/etc/php/extentions.ini директивы на загрузку этих расширей прописались в ходе инсталяции этих расширений из порта. И все равно не пашет.

fixxxer
Я посколько с компилил Apache с worker-ом, то видимо да. А error log какой? Для скриптов юзающих эти функции понятное дело идет undefined function, а инсталяция прошла без ошибок. В /var/log/php-error.log пусто.
 

tony2001

TeaM PHPClub
апачевский error_log, конечно.
и да, тебе надо собирать PHP с thread safety.
 

alekciy

Новичок
fixxxer
Нет, ошибся я. Смотрел /var/log/php-error.log и там действительно к существующим записям (не связанными с этой проблемой) ни чего не добавлялось. Но мне тут подумалось, что может просто не идет запись в лог, размер файла там или еще чего. Короче перенаправил в другой файл, перезагрузился и оп!
Код:
[05-Feb-2008 00:31:43] PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php
[05-Feb-2008 00:31:43] PHP Warning:  PHP Startup: sysvsem: Unable to initialize module
Module compiled with module API=20060613, debug=0, thread-safety=0
PHP    compiled with module API=20060613, debug=0, thread-safety=1
These options need to match
 in Unknown on line 0
[05-Feb-2008 00:31:43] PHP Warning:  PHP Startup: sysvshm: Unable to initialize module
Module compiled with module API=20060613, debug=0, thread-safety=0
PHP    compiled with module API=20060613, debug=0, thread-safety=1
These options need to match
 in Unknown on line 0
[05-Feb-2008 00:31:43] PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php
Что, как я уже понимаю, указываем нам на не соотвествие thread-safety для sysvsem и sysvshm. Странно, что такие вещи не определяются в порте автоматически. Значит нужно перекомпилировать модули.
 

tony2001

TeaM PHPClub
ну да, всё верно.
сам PHP собран с zts enabled, а модули - с zts disabled.

>Module compiled with module API=20060613, debug=0, thread-safety=0
>PHP compiled with module API=20060613, debug=0, thread-safety=1
 

alekciy

Новичок
Большое всем спасибо за помощь!

Действительно, почему то расширения собирались без thread-safety enable. Я то думал, уж если собрался PHP из порта, то расширения должны так же автоматом правильно подхватываться.

Решил тем, что в /usr/ports/lang/php5/Makefile в секцию CONFIGURE_ARGS добавил --enable-roxen-zts .


А вообще странно, что эта опция не по умолчанию. Вроде как режим более экономный к ресурсам. По крайней мере теперь у меня Апач ОЗУ жрет значительно меньше (хотя конечно понятно, что режим более опасен, умрет дочерный процесс, умрут и все коннекты обрабатываемые им). Или это все пока в стадии тестирования и не стабильно поэтому не по дефолту?

-~{}~ 05.02.08 23:14:

Прикол, опять не работают... В логе Апача голяк, а в логи пхп

Код:
[05-Feb-2008 23:24:34] PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php
[05-Feb-2008 23:24:34] PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php
Не грузиться типа и все тут. А установил только 2 модуля sysvsem и sysvshm, и варингов как раз два ))))

Здается мне, что дело в php5-fpm. Пока его не поставил все работало.

-~{}~ 06.02.08 00:55:

Кстати при сборке всех модулей постоянно появляется:
Код:
php5-fpm-5.2.5: "/usr/ports/devel/autoconf-wrapper" non-existent -- dependency list incomplete
Как я пониманию не найдена требуемая зависимость. autoconf я обновлял с 2.59 до 2.61. Кстати это ситуация видимо не как не влияет на сборку. Потому как модуль и с ней бывает подключается, и с ней же бывает не подключается. Возможно только и влияет на то, что thread-safety режим автоматически для модулей не определился.

-~{}~ 06.02.08 01:28:

Все, однозначно выяснил, что дело в php5-fpm пакете. После установки этого пакета перестают подключаться расширения которые добавляются из портов после него.

-~{}~ 06.02.08 02:11:

Вот что выдал при попытке установить php5-exif после установки, а потом удаления php5-fpm:
Код:
pc-2# cd ../../graphics/php5-exif
pc-2# make install
===>  Installing for php5-exif-5.2.5_1
===>   php5-exif-5.2.5_1 depends on file: /usr/local/include/php/main/php.h - not found
===>    Verifying install for /usr/local/include/php/main/php.h in /usr/ports/lang/php5
===>  Installing for php5-5.2.5_1
===>   php5-5.2.5_1 depends on file: /usr/local/sbin/apxs - found
===>   php5-5.2.5_1 depends on file: /usr/local/sbin/apxs - found
===>   php5-5.2.5_1 depends on executable in : pkg-config - found
===>   php5-5.2.5_1 depends on shared library: xml2.5 - found
===>   Generating temporary packing list
===>  Checking if lang/php5 already installed
===>   php5-5.2.5_1 is already installed
      You may wish to ``make deinstall'' and install this port again
      by ``make reinstall'' to upgrade it properly.
      If you really wish to overwrite the old port of lang/php5
      without deleting it first, set the variable "FORCE_PKG_REGISTER"
      in your environment or the "make install" command line.
*** Error code 1

Stop in /usr/ports/lang/php5.
*** Error code 1

Stop in /usr/ports/graphics/php5-exif.
Пишет php5-5.2.5_1 is already installed это это не так, что видно из вывода pkg_info. Если же сделать make reinstall, то php5-exif инсталируется, но не работает.

В логе php видим:

[06-Feb-2008 02:11:35] PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/20060613-zts/exif.so' - Cannot open "/usr/local/lib/php/20060613-zts/exif.so" in Unknown on line 0

Ситуацию можно исправить только полной переустановкой PHP. Если php-fpm не ставить, расширения подключается без проблем.

Расширения, с которыми PHP был сразу скомпилированн (у меня это --enable-sysvsem' '--enable-sysvshm' ) работают в любом случае.

Тут либо дело в том, что php5-fpm как то некорректно работает с PHP собраным с Thread Safety (на форумах встречал предупреждение, что сторонние разработки могу в этом режиме работать не корректно), либо же как то повлияла опция --disable-cgi, хотя сомнительно, ведь FastGCI опция в enable.
 

alekciy

Новичок
tony2001
Плюнул на Thread Safety пересобрал без него.
Возникла только одно непонимание. Компилировался PHP с --enable-sysvsem --enable-sysvshm. И все нормально прошло, при запуске phpinfo() как модуль Апача поддежка расширей видна.

Однако FastCGI через nginx выдает, что данные расширения не подключены! Получается, что php-cgi собрался без IPC хотя в Makefile было указанно собирать с этим расширением. Модуль апача то собрался с ними.

Выходит, что для cgi должны быть какие другие опции или другой Makefile?
 

tony2001

TeaM PHPClub
>Плюнул на Thread Safety пересобрал без него.
неясно зачем он вообще был нужен в FastCGI/CGI.

>Компилировался PHP с --enable-sysvsem --enable-sysvshm. И все нормально
>прошло, при запуске phpinfo() как модуль Апача поддежка расширей видна.
>Однако FastCGI через nginx выдает, что данные расширения не подключены!

у вас какая-то каша в голове.
есть PHP как модуль Апача, есть PHP/FastCGI.
одновременно они не собираются и это два разных PHP.

>Получается, что php-cgi собрался без IPC хотя в Makefile было указанно
>собирать с этим расширением. Модуль апача то собрался с ними.

я так понимаю, что собиралось из портов, а значит автора порта и спрашивать надо.
как собирается из исходников я знаю, а порты перманентно переломаны/перепатчены до неузнаваемости.
 

alekciy

Новичок
tony2001
Просто сначала FastCGI/CGI не было, а был Апач активно жрущий ОЗУ. Возник вопрос как снизить потери. Возник worker из 2-ой ветки.

Нет, каши нет. Я понимаю, что два разных. Просто удивился, что при сборке из порта используются видимо разные Makefile. Сейчас вроде все работает, остались только мелки вопросы по nginx. Пойду дальше разбираться.
 

tony2001

TeaM PHPClub
я бы вообще не рекомендовал собирать критичные элементы системы из портов.
просто, надо понимать как и что там стоит, а не полагаться на неких виртуальных майнтейнеров портов, которые за вас всё решили.
 

alekciy

Новичок
tony2001
Т.е. для нестандартный задач лучше собирать из пакетов? Просто мне сама концепция портов навилась всегда. Просто удобно. Те порты что я использовал майнтенеры делали неплохо. Видимо для слабо железа все нужно пересобирать ручками...
 

fixxxer

К.О.
Партнер клуба
да надо просто смотреть внимательно какую конфигурацию делает порт
и помнить что если один раз его уже использовал, то выбранная конфигурация запоминается в /var/db/ports

ну и ручная сборка ничем не хуже, собственно. основная польза портов - автоматическая установка требуемых библиотек по базе зависимостей

в целом любой инструмент требует понимания, тупо жать "хочу пхп" не получится никогда, если хочется предсказуемого результата конечно.
 

tony2001

TeaM PHPClub
в том-то и проблема ИМО, что порты/пакеты/rpm/etc это "хочу пхп", т.е. понимание где-то теряется.
одно дело, когда это какой-нить libdbus, который используется в системе, работает и хрен бы с ним, а другое дело, когда это твой главный рабочий инструмент.
 
Сверху