시스템 서비스 장치에서 PHP 스크립트를 실행할 때 Oracle 인스턴트 클라이언트 모듈을 찾을 수 없습니다.

시스템 서비스 장치에서 PHP 스크립트를 실행할 때 Oracle 인스턴트 클라이언트 모듈을 찾을 수 없습니다.

데비안 서버는 표준 시스템 서비스 단위인 phpsessionclean과 함께 설치됩니다. 30분마다 호출되어 쉘 스크립트를 호출한 /usr/lib/php/sessionclean다음 cli SAPI를 사용하여 작은 인라인 PHP 스크립트를 호출합니다. 이 실행은 30분마다 다음 경고를 발행합니다.

PHP 경고: PHP 시작: 동적 라이브러리 '/usr/lib/php/20151012/oci8.so'를 로드할 수 없습니다. - libmql1.so: 공유 객체 파일을 열 수 없습니다. 행 0에 알 수 없는 파일이나 디렉터리가 없습니다.

또한 일반적으로 PHP 스크립트를 호출하는 cron 작업인 경우에는 그러한 경고가 발생하지 않습니다.

실행해 보면 oci8 모듈이 로드된 것을 확인할 수 있습니다 php -c <path to INI file> -m | grep oci8. LD_LIBRARY_PATHORACLE_HOME내부의 상대 경로를 설정해 보았지만 /usr/lib/php/sessionclean작동하지 않았습니다. 그러나 crontab 상단에서 이러한 환경 변수를 설정하지 않으면 crontab 작업을 통해서도 동일한 경고가 표시됩니다. 즉, PHP 스크립트가 systemd 메커니즘에서 실행될 때 Oracle 환경이 로드되지 않은 것으로 나타납니다.

내 질문: systemd에서 호출한 PHP 스크립트가 Oracle 환경을 인식하도록 하려면 어떻게 해야 합니까?

답변1

Mark Stolsburg의 제안에 따라 저는 그 독특한 라인을 추가했습니다.

ENVIRONMENT="LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2" "ORACLE_HOME=/opt/oracle/instantclient_12_2"

/lib/systemd/system/phpsessionclean.service[서비스] 섹션 으로 이동하여 서비스를 다시 로드합니다 systemctl reload phpsessionclean. 후속 실행에서는 이전에 표시된 경고가 생성되지 않습니다. 두 변수 중 하나만 정의하면 될 것 같은데 실험할 시간이 없습니다.

관련 정보