加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用Oracle Instant Client在Ubuntu 18.04 LTS中使用PHP-FPM

发布时间:2020-12-12 13:15:12 所属栏目:百科 来源:网络整理
导读:我正在使用 https://launchpad.net/~ondrej/+archive/ubuntu/php提供的最新PHP软件包. 当我构建并安装OCI8扩展时,一切看起来都是有序的,但是尽管在PHP-FPM配置中启用了扩展,但它的存在并没有反映在phpinfo()的输出中. 以下Gist详细介绍了我用于配置,构建和安
我正在使用 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环境中加载,错误如下:

PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php/20160303/oci8.so’ – libmql1.so: cannot open shared object file: No such file or directory in Unknown on line 0

我这样解决了这个问题:

# 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在创业时抱怨:

PHP Warning: PHP Startup: Unable to load dynamic library ‘oci8.so’ (tried: /usr/lib/php/20170718/oci8.so (libmql1.so: cannot open shared object file: No such file or directory),/usr/lib/php/20170718/oci8.so.so (/usr/lib/php/20170718/oci8.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

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)联机帮助页指出(与搜索运行时库路径的顺序有关):

Using the environment variable LD_LIBRARY_PATH (unless the executable is being run in secure-execution mode; see below). [sic] in which case it is ignored.

到目前为止,我想不出任何其他可以忽略这条路径的原因.在安全执行模式中,同一文档说:

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                        

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读