Рейтинг:2

Создал PHP из исходного кода с помощью пользовательских драйверов DataDirect ODBC, но не может автоматически запускаться с помощью systemd

флаг br

Мне нужно собрать PHP из исходного кода, чтобы использовать драйверы ODBC этого клиента. Я следил за этими проверками: https://www.progress.com/tutorials/odbc/using-php и все (включая драйвер ODBC) работает нормально, когда я вручную запускаю apache с помощью /usr/local/apache2/bin/apachectl начать Но когда я пытаюсь запустить apache с помощью systemd, драйверы ODBC больше не работают.

Я создал этот файл: /usr/lib/systemd/system/httpd.service

[Ед. изм]
Описание=Веб-сервер Apache
After=network.target remote-fs.target nss-lookup.target

[Оказание услуг]
Тип = разветвление
PIDFile=/usr/local/apache2/logs/httpd.pid
ExecStart=/usr/local/apache2/bin/apachectl старт
ExecStop=/usr/local/apache2/bin/apachectl изящная остановка
ExecReload=/usr/local/apache2/bin/apachectl изящный
PrivateTmp=истина
LimitNOFILE=бесконечность

[Установить]
WantedBy=многопользовательская.цель

Я получаю следующую ошибку в моем файле php при запуске apache с systemd:

odbc_connect (): ошибка SQL: [DataDirect] [ODBC lib] файл сообщения диспетчера драйверов не найден. Проверьте значение InstallDir в файле odbc.ini, состояние SQL IM002 в SQLConnect.

InstallDir правильно установлен в моем файле odbc.ini: введите описание изображения здесь

введите описание изображения здесь

Я не получаю эту ошибку при запуске apache с запуск apachectl вручную. Любое предложение о том, как это исправить?

Barry Ralphs avatar
флаг br
Я получил это, я не уверен, что с этим делать: `type=ANOM_ABEND msg=audit(1624733159.706:196): auid=1000 uid=48 gid=48 ses=1 pid=1589 comm="httpd" Reason="нарушение памяти" sig=11 type=ANOM_ABEND msg=audit(1624733159.706:197): auid=1000 uid=48 gid=48 ses=1 pid=1591 comm="httpd" Reason="нарушение памяти" sig=11 type=SERVICE_START msg=audit(1624733172.056:198): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=httpd comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? адрес=? терминал =? разрешение = успех'`
Michael Hampton avatar
флаг cz
Ну, это просто старый добрый сбой «Ошибка сегментации». Может быть, этот код не так уж надежен?
Barry Ralphs avatar
флаг br
Вы имеете в виду сборку/исходный код Apache или код PHP? Код PHP отлично работает при запуске Apache вручную.
Michael Hampton avatar
флаг cz
Это невозможно узнать, если у вас нет дампа ядра, который вы можете проанализировать.
ezra-s avatar
флаг ru
Вы компилируете odbc для PHP, а не для Apache, есть большая разница. Почему бы вам не попробовать и посмотреть, с какой конфигурацией вы пытаетесь запустить Apache впоследствии? В любом случае, вы пытались запустить php в php-fpm и использовать Apache для прокси-запросов к нему, не пытаясь использовать mod_php? Я думаю, что только это поможет вам лучше понять, чего вы пытаетесь достичь и в чем на самом деле заключается ваша проблема.
Barry Ralphs avatar
флаг br
Спасибо @ezra-s, хорошая мысль, я всегда смешиваю Apache и PHP вместе.Можете ли вы уточнить, что вы имеете в виду, проверяя, с какой конфигурацией вы пытаетесь запустить Apache? Как бы я это сделал? Мой PHPINFO() показывает: ' ' --with-zlib' ' --with-zip' ' --enable-mbstring' ' --enable-ssl' ' --prefix=/usr/local/php' ' --with-custom-odbc= /opt/Progress/DataDirect/Hybrid_Data_Pipeline_for_ODBC' `
Michael Hampton avatar
флаг cz
К сожалению, я просто сделал ошибку, не прочитав эту ссылку о драйвере ODBC до сих пор. Они серьезно? Среде, которую они указывают, 15 лет! Это совершенно не поддерживается. Есть ли какая-то особая причина, по которой вам нужно использовать этот конкретный (и, по-видимому, давно устаревший) драйвер ODBC?
Barry Ralphs avatar
флаг br
Спасибо @MichaelHampton, я не следил за частью сборки PHP5.1. Вместо этого я построил 7.4. Наш клиент использует бухгалтерское программное обеспечение Deltek Vision, размещенное в облаке Deltek. Судя по всему, Deltek поддерживает этот драйвер ODBC только для чтения данных из своего облака.
Michael Hampton avatar
флаг cz
Это определенно ограничивает ваши возможности. Я изучил это немного больше, и, видимо, этому конкретному учебнику 15 лет, программное обеспечение более или менее обновлено. Итак, немного изучив это сообщение, у меня есть подозрение по поводу проблемы. Как вы предоставили переменные среды ODBCINI и ODBCINIST?
Barry Ralphs avatar
флаг br
Спасибо, я заметил кое-что новое. Если я запускаю `sudo /usr/local/apache2/bin/apachectl` от своего имени, я все равно получаю указанную выше ошибку, но если я перехожу в root и запускаю `/usr/local/apache2/bin/apachectl`, все работает нормально. Это то, что заставляет меня думать, что это проблема с разрешениями. Можно ли как-то сказать systemd запустить apachectl с правами root?
Barry Ralphs avatar
флаг br
Re: ODBCINI и ODBCINST, у меня есть файл: `/etc/profile.d/odbc.sh`, который имеет: `ODBCINI=/opt/Progress/DataDirect/Hybrid_Data_Pipeline_for_ODBC/odbc.ini экспорт ODBCINI ODBCINST=/opt/Progress/DataDirect/Hybrid_Data_Pipeline_for_ODBC/odbcinst.ini экспортировать ODBCINST` sysytemd их не видит?
Barry Ralphs avatar
флаг br
Спасибо @MichaelHampton, я смог понять это на основе вашего намека на переменные среды.
Рейтинг:1
флаг br

Мне удалось решить мою проблему, добавив следующие строки в мой /usr/lib/systemd/system/httpd.service файл, под [Оказание услуг] раздел:

Environment="ODBCINST=/opt/Progress/DataDirect/Hybrid_Data_Pipeline_for_ODBC/odbcinst.ini" Environment="ODBC_HOME=/opt/Progress/DataDirect/Hybrid_Data_Pipeline_for_ODBC" Environment="ODBCINI=/opt/Progress/DataDirect/Hybrid_Data_Pipeline_for_ODBC/odbc.ini" Окружающая среда = "TZ = Америка/Лос-Анджелес"

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.