在 AIX7.1 上通过 Apache 使用 PHP 连接到 DB2
Posted
技术标签:
【中文标题】在 AIX7.1 上通过 Apache 使用 PHP 连接到 DB2【英文标题】:Connecting to DB2 with PHP via Apache on AIX7.1 【发布时间】:2014-08-16 11:14:36 【问题描述】:我正在尝试理解此消息的含义!我试过用谷歌搜索它,但找不到任何有用的东西。
我正在尝试在 php.ini
中包含 2 个 php 扩展,db2_ibm.so
和 pdo_ibm.so
(我已经编辑了 <?php phpinfo() ?>
中显示的 php.ini 文件)。
在 PHP cli 版本中,使用命令 php -m
,我可以看到模块正在正确加载。我可以看到版本 ibm_db2 1.9.1 和 pdo_ibm 1.3.2
但是,当我尝试通过 Apache 执行相同操作时,它无法连接。我继续查看 Apache 错误日志,发现以下内容。
对于 db2_ibm.so,我收到以下错误:
PHP Warning: PHP Startup: Unable to load dynamic library
'/opt/freeware/lib/php/modules/ibm_db2_5.2.1.so'
- rtld: 0712-001 Symbol executor_globals was referenced
from module /opt/freeware/lib/php/modules/ibm_db2_5.2.1.so(),
but a runtime definition of the symbol was not found.
in Unknown on line 0
对于 pdo_ibm.so:
PHP Warning: PHP Startup: pdo_ibm: Unable to initialize module
Module compiled with module API=20060613, debug=0, thread-safety=0
PHP compiled with module API=20060613, debug=0, thread-safety=1
These options need to match in Unknown on line 0
我可以理解定义 PATH 存在一些问题,但不确定如何解决该问题。
我的系统上安装了以下版本 (AIX 7.1):
PHP 5.2.17 Apache 2.2.16 DB2 9.7.4我已经从 RPM 包中安装了 Apache 和 PHP。
[我选择旧版本的 PHP 和 Apache 的原因是因为 DB2 Client 中的扩展文件 ibm_db2.so
和 pdo_ibm.so
仅与较低版本的 PHP 兼容。 ]
由于我被困在这里好几天了,请尽快提出一些解决方案。非常感谢!
【问题讨论】:
【参考方案1】:查找 Apache 的 httpd 进程的 pid:
ps -ef | grep httpd
您可能会看到一组。在我的例子中,一个有 init (1) 的父级,其他的有第一个的父级。我会选择具有 init 父级的那个,但出于教育目的,您可能想选择所有这些。然后做:
ps eww <pid>
其中 pid 是第一个 ps 的进程 ID(第 2 列)之一。 (父进程id是第三列。)
该命令显示 Apache 的环境。然后对你的 shell 做同样的事情:
ps eww $$
希望您会发现有意义的差异。我要做的是弄乱 shell 的环境并运行 php -m 直到你得到 Apache 发生的错误。这将为您提供 Apache 环境中导致问题的具体内容。然后使用 Apache 的命令来修正环境。
所有这些都是针对简单的情况,您可以使用 ps 查看环境中的差异并追踪差异并能够纠正它。在更顽固的情况下,您将需要“包装” php.ini。事实上,您可能会发现这种方法更简单。
我不知道细节,但 Apapche 正在以某种方式启动 php。让我们假设它正在使用各种参数调用 /some/specific/path/php。
创建目录:/some/specific/path/.orig 将 php 移入 .orig 创建一个 shell 脚本(一定要对其执行 chmod +x )并在脚本中执行以下操作:
#!/bin/ksh
date >> /tmp/php.log
env >> /tmp/php.log
echo "args = $@" >> tmp/php.log
exec /some/specific/path/.orig/php "$@"
将该脚本作为 /some/specific/path/php
您可以根据需要向脚本添加更多调试。您首先想看看您是否真的可以从命令行执行 Apache 正在执行的相同命令。因此,从日志文件中挖掘出参数并执行相同的命令。您可能需要替换命令的各个部分。这一步可能太难了,不值得,但由于错误,我担心 Apache 和您的 shell 环境之间并没有真正的区别,但确实设置不正确。从 shell 中执行完全相同的命令将证明它在 shell 和 Apache 环境中是不同的。
然后,与第一种调试方式一样,跟踪两种环境中的不同之处。调试脚本甚至可以在执行 exec 作为临时解决方案之前“修复”它。
如果您记得,请将您发现的内容作为评论发回。我很好奇是什么导致了这个错误。
像往常一样……
祝你好运!
【讨论】:
另外,看看***.com/questions/3271798/… ...它并没有真正的帮助,但您的一个模块似乎需要重新编译。我想它仍然可能是一个环境,其中一种方法正在拾取一组库,而另一种正在拾取另一组......也许...... 我已经尝试了第一个选项,即使 Apache 和 shell 的PATH
相同,看看 php -m
是否给出类似于 Apache 错误的内容。你猜怎么了!没有改变。现在我找不到 /some/specific/path/php.有什么命令可以查找吗?我还在寻找。谢谢
是 libphp5.so 模块的路径吗?
哦。我敢打赌,包装它是行不通的。对不起。是否设置了 LIBPATH 并且在任何一种情况下都相同吗?在这种情况下,这比 PATH 重要得多。
另一个建议:看看 perzl.org 上的人(我假设你得到了所有这些包)是否可以提供帮助。您还可以查看 db2 是否具有其库的线程版本(或线程安全版本)。正如我所说,我认为这不是路径问题,而是简单的 php -m 与 Apache 所做的不同。以上是关于在 AIX7.1 上通过 Apache 使用 PHP 连接到 DB2的主要内容,如果未能解决你的问题,请参考以下文章