nixp.ru v3.0

25 января 2017,
среда,
02:23:40 MSK

DevOps с компанией «Флант»
Anarchist написал 9 октября 2006 года в 16:42 (994 просмотра) Ведет себя как мужчина; открыл 258 тем в форуме, оставил 4097 комментариев на сайте.

Задача:

Есть FreeBSD 6.1.

Надо построить web-сервер (Апач, особых альтернатив нет), с поддержкой php (в текущем приближении версии 5) и клиентом Оракл (сервер располагается физически на другой машине).

php-5.1.6 в текущей версии дерева портов,

неофициальный клиент для Оракл8 берётся там же (попутно на всякий случай поставил ещё порт oracle_odbc_driver).

В стандартно предусмотренном системой портов режиме php5 ставится без вопросов.

Но проблема в том, что эта конфигурация меня не устроивает.

При попытке же сконфигурировать с нужными опциями (модулем Апача 2.2.3, с поддержкой Ораклёвого клиента)

#./configure --with-openssl --enable-calendar --enable-mailparse --with-mod_charset --enable-ftp --with-oci8=/usr/local/oracle8-client/ --enable-safe-mode --enable-track_vars --enable-memory-limit --without-pear --with-xml --enable-trans-sid --enable-magic-qoutes --enable-url-includec --with-apache22 --without-mysql --enable-dbase --enable-sigchild --enable-force-cgi-redirect

Вылезает следующая ошибка:

/usr/local/oracle8-client//lib/libclntsh.a(sltst.o)(.text+0x196): In function `sltstcr':
: undefined reference to `pthread_create'
/usr/local/oracle8-client//lib/libclntsh.a(sltst.o)(.text+0x261): In function `sltstgetp':
: undefined reference to `pthread_getschedparam'
/usr/local/oracle8-client//lib/libclntsh.a(sltst.o)(.text+0x548): In function `sltstjn':
: undefined reference to `pthread_join'
/usr/local/oracle8-client//lib/libclntsh.a(sltst.o)(.text+0x639): In function `sltstkill':
: undefined reference to `pthread_kill'
/usr/local/oracle8-client//lib/libclntsh.a(sltst.o)(.text+0x755): In function `sltstsetp':
: undefined reference to `pthread_getschedparam'
/usr/local/oracle8-client//lib/libclntsh.a(sltst.o)(.text+0x7ba): In function `sltstsetp':
: undefined reference to `pthread_setschedparam'
/usr/local/oracle8-client//lib/libclntsh.a(sltst.o)(.text+0x7f6): In function `sltstspawn':
: undefined reference to `pthread_attr_init'
/usr/local/oracle8-client//lib/libclntsh.a(sltst.o)(.text+0x80e): In function `sltstspawn':
: undefined reference to `pthread_attr_setdetachstate'
/usr/local/oracle8-client//lib/libclntsh.a(sltst.o)(.text+0x826): In function `sltstspawn':
: undefined reference to `pthread_create'
/usr/local/oracle8-client//lib/libclntsh.a(sltst.o)(.text+0x8bb): In function `sltsttr':
: undefined reference to `pthread_exit'
/usr/local/oracle8-client//lib/libclntsh.a(sltsq.o)(.text+0x130): In function `SltsqSigFunc':
: undefined reference to `pthread_exit'
/usr/local/oracle8-client//lib/libclntsh.a(sepco.o)(.text+0x7d): In function `sepcoget_login':
: undefined reference to `cuserid'
/usr/local/oracle8-client//lib/libclntsh.a(sltspc.o)(.text+0x227): In function `sltspctimewait':
: undefined reference to `pthread_cond_timedwait'
/usr/local/oracle8-client//lib/libclntsh.a(sslts.o)(.text+0x3c): In function `ssltstraise':
: undefined reference to `pthread_kill'
*** Error code 1
Stop in /usr/ports/lang/php5/work/php-5.1.6.

Библиотека живёт в

/usr/src/lib/libpthread/

При попытке обращения к коллективному разуму ищется только эта статья.

Проблема в точности совпадает.

Все предложенные шаманства испробовал

Но решения в ней не даётся. :(

ЗЫ: Исходя состояния из дерева портов вариантов отличных от отката на php4 не будет?

ЗЗЫ: А вообще есть у меня такое подозрение, что с тех пор очень много чего изменилось, и я пытаюсь применить протухшие рецепты.

myst

а ты попробуй конфигурить не вручную, а теми настройками что есть в соотв. порте. посмотри его Makefile, там должно быть. Если нужных настроек там нет, то надо подумать.

Anarchist
myst
посмотри его Makefile, там должно быть. Если нужных настроек там нет, то надо подумать.

В смысле

make config

Естественно пробовал.

Первым делом.

Желаемая детализация настройки в нём не обозначена.

Из-за чего собственно полез в конфигуряние ручками.

myst

гм, я make config никогда не делал, я всегда делал make OPT_A=1 .. OPT_Z=1. Какие OPT_x за что отвечают я смотрел прямо в Makefile в директории порта.

Anarchist
myst
гм, я make config никогда не делал, я всегда делал make OPT_A=1 .. OPT_Z=1. Какие OPT_x за что отвечают я смотрел прямо в Makefile в директории порта.

Версию FreeBSD и порта для которого выполняется это условие в студию!

В /usr/ports/lang/php5/Makefile

Всякие

OPT_A ... OPT_Z

ОТСУТСТВУЮТ!!!

Изыскания показали, что я нашёл и установил другой порт с многообещающим названием:

php5-oci8

(клиент Оракла тоже стоит).

Сейчас думаю на предмет необходимости пересборки php5 с его поддержкой (или будет работать без этого?)…

myst

Anarchist, ты меня пугаешь…

Вот выдержка из /usr/ports/lang/php5/Makefile:

OPTIONS=      CLI "Build CLI version" on \
            CGI "Build CGI version" on \
            APACHE "Build Apache module" off \
            DEBUG "Enable debug" off \
            SUHOSIN "Enable Suhosin protection system" on \
            MULTIBYTE "Enable zend multibyte support" off \
            IPV6 "Enable ipv6 support" on \
            REDIRECT "Enable force-cgi-redirect support (CGI only)" off \
            DISCARD "Enable discard-path support (CGI only)" off \
            FASTCGI "Enable fastcgi support (CGI only)" on \
            PATHINFO "Enable path-info-check support (CGI only)" on

Какие могут быть вопросы? Ещё есть сомнения какие есть опции?! Или ты думал, что они так и называются OPT_A .. OPT_Z? :))

Anarchist
myst
Anarchist, ты меня пугаешь…

Вот выдержка из /usr/ports/lang/php5/Makefile:

OPTIONS=      CLI "Build CLI version" on \
            CGI "Build CGI version" on \
            APACHE "Build Apache module" off \
            DEBUG "Enable debug" off \
            SUHOSIN "Enable Suhosin protection system" on \
            MULTIBYTE "Enable zend multibyte support" off \
            IPV6 "Enable ipv6 support" on \
            REDIRECT "Enable force-cgi-redirect support (CGI only)" off \
            DISCARD "Enable discard-path support (CGI only)" off \
            FASTCGI "Enable fastcgi support (CGI only)" on \
            PATHINFO "Enable path-info-check support (CGI only)" on

Какие могут быть вопросы? Ещё есть сомнения какие есть опции?! Или ты думал, что они так и называются OPT_A .. OPT_Z? :))

Это ты меня пугаешь!

Вопросы?..

Теперь я понимаю претензии к Слакварщикам… low level должно использовать там, где он необходим.

Перечисленный же тобой список опций не является полным и редактируется по

make config
myst

Значит я тебе помочь не могу… :)) уж какой есть, извини. :))

Anarchist

Слегка продвинулся.

Расписывать решение буду после того как разберусь окончательно.

На данном этапе проблема в следующем:

...не ооочень длинная строчка (изъято цензурой)...
/usr/ports/databases/oracle8-client/work/oracle8-client//lib/libclntsh.a(sepco.o)(.text+0x7d): In function `sepcoget_login':
: [b]undefined reference to `cuserid[/b]'
*** Error code 1
Stop in /usr/ports/lang/php5/work/php-5.1.6.
*** Error code 1

Вскрытие показало, что:

1. Искомый файл живёт в /usr/src/lib/libcompat/4.4/

/usr/share/man/man3/cuserid.3.gz
/usr/share/man/cat3/cuserid.3.gz
/usr/src/lib/libcompat/4.4/cuserid.3
/usr/src/lib/libcompat/4.4/cuserid.c

2. Скрипт ./configure эту функцию не видит:

checking for cuserid... no

Вопрос: какое шаманское заклинание нужно произнести, чтобы скрипт ./configure подцепил эту функцию?

Вдруг кто подскажет?

myst

гм, а хидер и сама либа установлены?

Anarchist
myst
гм, а хидер и сама либа установлены?

В смысле заголовок?

Согласно

man cuserid

достаточно stdio.h

(правда после просмотра содержимого этого файла закрались некоторые сомнения)

И какая библиотека?

libcompat?

libcompat.a живёт в /usr/lib/ и в нём упоминается cuserid

myst

гм. а всё-таки сделай

fgrep -R 'cuserid' /usr/include
Anarchist
myst
гм. а всё-таки сделай

fgrep -R 'cuserid' /usr/include

Как и ожидалось (помнится проверял), команда:

grep -l cuserid /use/include/*

указывает на

/usr/include/stdio.h

myst

однако :)) забавно… может в ядро надо чего-нить вкомпилить? Там есть какие-то опции для совместимости с 4.3/4.4BSD…

Anarchist

Только в stdio.h лишь упоминание одной из констрант этой функции.

Само определение в /usr/src/lib/libcompat/4.4/cuserid.c

myst
однако :)) забавно… может в ядро надо чего-нить вкомпилить? Там есть какие-то опции для совместимости с 4.3/4.4BSD…

Handbook читал.

Конфиг GENERIC’а тоже.

Всё это есть.

Ничего перекомпиллять не надо.

Хотя есть некоторые сомнения относительно /boot/loader.conf

На всякий случай поставил порт /usr/ports/misc/compat4x/.

Видимого эффекта тоже не возымело.

Anarchist

Вскрытие показало, что в руководстве по функции cuserid таки не наврали.

Действительно определение этой функции присутствует в библиотеке libcompat.

Но там забыли указать, что важна не только эта опция, но и её положение в командной строке.

Тестовый пример:

cc -o conftest -lcompat conftest.c
/var/tmp//ccWouZsJ.o(.text+0x22): In function `main':
: undefined reference to `cuserid'
/var/tmp//ccWouZsJ.o(.data+0x0): undefined reference to `cuserid'

Но

cc -o conftest conftest.c -lcompat

Использование GNU make не помогает.

Попытка слинковать библиотеки перед компилляцией — тоже (правда ошибки при этом вылезают другие, момент, честно говоря не идентифицирован).

Anarchist

Проблема с сборкой вылечилась с помощью заклинания

export LDFLAGS="-lpthread -L/usr/local/oracle8-client/lib -lclntst8 -lcompat -lm"

FreeBSD 6.1, gcc-3.4.4.

myst

Anarchist, респект и уважуха за дневник. Бум знать о граблях.

Anarchist
myst
Anarchist, респект и уважуха за дневник. Бум знать о граблях.

Это ещё не конец.

Anarchist

http://www.nixp.ru/articles/freebsd_apache_php_oracle

Правда пока надо учесть выявленные опечатки (перечислены здесь).

Anarchist

По здравом размышлении пришёл к выводу, что в статье пропущен один раздел.

А именно:

Предварительная проверка.

(вставить перед описанием проверки работоспособности)

Файл: check.php

Из одной строчки.

<?phpinfo();?>

После чего открывается любимым браузером страница check.php и анализируется содержимое.

А именно:

В секции

Configuration

Ищется раздел

oci8

Факт его наличия говорит о том, что PHP о существовании СУБД Оракл осведомлён.

В моём случае число строк этого раздела по сравнению с исходной системой возросло.

В моём случае содержание раздела следующее:

1. Базовый модуль.

OCI8 Support enabled

Revision $Revision: 1.269.2.18 $

Active Persistent Connections 0

Active Connections 0

Oracle Version 8.1

Compile-time ORACLE_HOME /usr/local/oracle8-client

Libraries Used no value

Temporary Lob support enabled

Collections support enabled

В исходной версии третья-четвёртая и две последние строки отсутствуют.

И полностью отсутствующий в исходной версии (правда не совсем понятно за счёт особенностей версии PHP или за счёт клиента) раздел:

Directive Local Value Master Value

oci8.default_prefetch 10 10

oci8.max_persistent -1 -1

oci8.old_oci_close_semantics 0 0

oci8.persistent_timeout -1 -1

oci8.ping_interval 60 60

oci8.privileged_connect Off Off

oci8.statement_cache_size 20 20

(при переносе я бы просил доработать форматирование до читаемого)

Anarchist

В процессе эксплуатации выяснился ещё один интересный момент:

При просмотре в СУБД Oracle информации об открытых сессиях (насколько я понял, представление v$session) в трёх полях (machine, program, module) пишется хуйня.

Предварительный поиск в Сети ответа на вопрос как задать правильные (в идеале: желаемые, т.е. произвольные) значения этих полей результата не дал.

Есть мнение, что сие — фича библиотеки и придётся смириться.

Но не хотелось бы.

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.