好的,所以我的earlier problem with PIL还没有解决。其他人遇到了这个问题并且removing the old JPEG library取得了成功。我不能在我的机器上真的这样做,但是,因为它是RHEL而且很多东西都依赖于libjpeg和libjpeg-devel(当我尝试yum删除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
对lib64 / modules中的所有模块运行ldd
时没有提到libjpeg。在PIL的_imaging.so文件上运行ldd
表明它正在使用新版本的libjpeg。我很确定我的系统上只有一个版本的PIL - 我做了一个非常彻底的搜索。
有没有人知道哪些程序或模块绑定到httpd或python可能会加载libjpeg?我知道某些东西正在通过apache加载它,因为它出现在lsof
中。
答案 0 :(得分:1)
有一种方法,但由于它是jpeg库的不同版本,因此您可能会破坏首先加载旧库的任何内容。
问题可能是您正在将PHP加载到同一个Apache安装中,并且它正在预加载一个PHP扩展模块,该模块依赖于旧版本的jpeg库。因为PHP优先于Python所做的事情,所以你会遇到错误的库。
因此,请尝试禁用mod_php,以便它不会加载到Apache中。如果你的问题消失了,你知道就是这样。如果它确实有效并且您不需要PHP,则将其永久禁用。如果你确实需要PHP,那么改为在fastcgi下使用PHP,这样就可以避免PHP被自己加载到Apache进程中。或者,您需要更新/重建PHP以使用相同的jpeg版本。
现在为hack预加载不同版本的jpeg库,但这可能无法工作或导致以后出现问题。这个hack是改变Apache的init脚本,它设置:
LD_PRELOAD=/some/path/libjpeg.so.8.0.0
export LD_PRELOAD
这告诉操作系统在执行任何操作之前将该库预加载到进程地址空间。
顺便说一句,如果它是PHP,你没有用ldd找到它的原因是PHP扩展模块安装在Apache模块所在的不同目录中。