1

好的,所以我在PIL上遇到了一个尚未解决的早期问题。其他人遇到了这个问题,并通过删除旧的 JPEG 库取得了成功。但是,我不能在我的机器上真正做到这一点,因为它是 RHEL 并且很多东西都依赖于 libjpeg 和 libjpeg-devel(当我尝试 yum remove libjpeg 只是为了查看时,总共有 252 个包删除!)

我在 /usr/local/lib 中安装了 jpeg-8。它被python正确使用,但不是被apache使用。以下是来自 lsof 的列表:

COMMAND     PID      USER   FD      TYPE             DEVICE     SIZE       NODE NAME
httpd     xxxxx      root  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
python    xxxxx    jordan  DEL       REG              253,3             xxxxx63 /usr/local/lib/libjpeg.so.8.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0

所以,这就是我想知道的。鉴于我无法卸载 libjpeg-6b,有什么办法可以强制apache 改用 libjpeg-8?

好的,最近的运行lsof显示 apache 现在也在加载 libjpeg.so.8.0.0但仍然遇到错误,这表明它仍在使用 62 版本。有没有办法让 8 版本优先?

更新#1

ldd对 lib64/modules 中的所有模块运行时没有引用 libjpeg。在 PIL 的 _imaging.so 文件上运行ldd表明它正在使用新版本的 libjpeg。我很确定我的系统上只有一个版本的 PIL——我已经进行了非常彻底的搜索。

有谁知道哪些与 httpd 或 python 相关的程序或模块可能会加载 libjpeg?我知道有些东西正在通过 apache 加载它,因为它显示在lsof.

4

1 回答 1

1

有一种方法,但由于它是 jpeg 库的不同版本,因此您可能会破坏首先加载旧库的任何内容。

问题可能是您正在将 PHP 加载到同一个 Apache 安装中,并且它正在预加载一个 PHP 扩展模块,该模块依赖于旧版本的 jpeg 库。因为 PHP 优先于 Python 所做的事情,所以你被错误的库困住了。

因此,请尝试禁用 mod_php,以免将其加载到 Apache 中。如果你的问题消失了,你就知道是这样。如果它确实有效并且您不需要 PHP,则将其永久禁用。如果您确实需要 PHP,则改为在 fastcgi 下使用 PHP,这样可以避免 PHP 被加载到 Apache 进程本身。或者,您将需要更新/重建 PHP 以使用相同的 jpeg 版本。

现在让黑客预加载不同版本的 jpeg 库,但这可能不起作用或导致以后出现问题。这个 hack 是为了改变 Apache 的初始化脚本,使其设置:

LD_PRELOAD=/some/path/libjpeg.so.8.0.0
export LD_PRELOAD

这告诉操作系统在执行任何操作之前将该库预加载到进程地址空间中。

顺便说一句,如果它是 PHP,那么您没有使用 ldd 找到它的原因是 PHP 扩展模块安装在与 Apache 模块所在的目录不同的目录中。

于 2010-02-02T23:21:28.090 回答