如何使用Oracle Instant Client在Ubuntu 18.04 LTS中使用PHP-FPM
我正在使用
https://launchpad.net/~ondrej/+archive/ubuntu/php提供的最新PHP软件包.
当我构建并安装OCI8扩展时,一切看起来都是有序的,但是尽管在PHP-FPM配置中启用了扩展,但它的存在并没有反映在phpinfo()的输出中. 以下Gist详细介绍了我用于配置,构建和安装OCI8 PHP扩展的确切过程: https://gist.github.com/cbj4074/fa761f60b6f8db431539d76ebfba828e 完全相同的流程和配置在Ubuntu 16.04 LTS上工作得非常好,所以看起来在Ubuntu 18.04 LTS上有一些根本的区别,无论是操作系统还是有问题的PHP包. 作为一个重要的(我怀疑与此问题相关)背景信息,在Ubuntu 18.04 LTS上,扩展无法在开箱即用的CLI环境中加载,错误如下:
我这样解决了这个问题: # echo 'LD_LIBRARY_PATH="/opt/oracle/instantclient_12_2"' >> /etc/environment 我认为将LD_LIBRARY_PATH添加到PHP-FPM环境配置可能会解决那里的等效问题: # echo "env['LD_LIBRARY_PATH'] = /opt/oracle/instantclient_12_2" >> /etc/php/7.2/fpm/pool.d/www.conf # systemctl restart php7.2-fpm 这确实会导致指定的LD_LIBRARY_PATH值反映在phpinfo()的环境部分(通过PHP-FPM NGINX呈现并从浏览器请求)和PHP变量部分,如$_SERVER [‘LD_LIBRARY_PATH’ ]. 奇怪的是,即使PHP-FPM的日志记录设置为调试,我也没有看到我在CLI中遇到的libmql1.so错误的任何痕迹. OCI8扩展无法以静默方式加载. display_startup_errors =在PHP-FPM的有效php.ini中也是. 我选择查看OCI8扩展是否在Apache中,在同一台服务器上运行,并且确实如此,只要我将导出LD_LIBRARY_PATH = / opt / oracle / instantclient_12_2添加到/ etc / apache2 / envvars;在absense中,Apache在创业时抱怨:
Ubuntu 16.04 LTS上没有必要使用LD_LIBRARY_PATH进行这项业务,并且根据我在此处的观察以及有关https://stackoverflow.com/a/45242468/1772379的评论,这些内容在Ubuntu 17.10和Ubuntu 18.04 LTS中发生了变化. 有没有其他人在Ubuntu 18.04 LTS上试过这个,特别是? 我在两个不同的Vagrant VM上尝试了这个,laravel / homestead box 6.0.0和ubuntu / bionic64 box v20180509.0.0,两者的行为相同. 任何其他想法将非常感谢! 编辑1: I asked about this issue on the package maintainer’s GitHub tracker他提出问题源于在编译时未能设置适当的RPATH. 我在答复中解释说我正在设定一个合适的值,但问题仍然存在. 我确实注意到一个有趣的细节,即Ubuntu 18.04上的编译扩展使用RUNPATH(而不是在Ubuntu 16.04中使用的RPATH).如果PHP-FPM忽略RUNPATH,并且只查找RPATH,它将解释此行为. 编辑2: 这个仍然开放的报告看起来像是引入观察到的行为的优秀候选人: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=859732 (通过 use RPATH but not RUNPATH?评论发现) 编辑3: 在评论者的建议下,我重新检查了在构建扩展之前更新ld配置并解决了问题!我之前尝试过这个,但是必须忽略构建尝试之间的某些事情: # echo /opt/oracle/instantclient_12_2 > /etc/ld.so.conf.d/oracle-instantclient.conf # ldconfig 我仍然不知道为什么LD_LIBRARY_PATH在这个实例中不能正常工作,但是将Instant Client库路径添加到链接器配置似乎是一种更好的方法. 编辑4: 我在之前的编辑中说过,修改ldconfig构成了一种更好的方法,但后来意识到(根据评论者的好建议)这样做会导致不良的库冲突,因为这些影响是系统范围的. 事后看来,通过LD_LIBRARY_PATH将它们限制在执行环境中,最小化运行时库链接修改的“附带损害”是有意义的.因此,我有动力确定为什么这不适用于Ubuntu 18.04 LTS. 我觉得我已经确定PHP-FPM守护进程忽略了Ubuntu上的LD_LIBRARY_PATH(并且至少已经有Ubuntu 16.04 LTS;请参阅注释以获得解释). ld.so(8)联机帮助页指出(与搜索运行时库路径的顺序有关):
到目前为止,我想不出任何其他可以忽略这条路径的原因.在安全执行模式中,同一文档说: Secure-execution mode For security reasons,the effects of some environment variables are voided or modified if the dynamic linker determines that the binary should be run in secure-execution mode. (For details,see the discussion of individual environment variables below.) A binary is exe |