php - 我如何强制 PHP 使用 iconv 的 libiconv 版本而不是 CentOS 安装的 glibc 版本?

标签 php linux apache glibc iconv

我正在处理的代码在 Windows XP 和 Mac OS X 上运行完美。在 CentOS(以及 Fedora 和 Ubuntu)上测试它时,它无法正常工作。搜索网络使我得出结论,这是导致问题的 iconvglibc 版本。所以现在我需要 libiconv 版本的 iconv 才能让 Zend Lucene 正常工作。

我已经下载了 libiconv 并使用 --prefix=/usr/localmake、然后是 make install 配置它,没有任何错误。看起来它已成功安装,因为执行 /usr/local/bin/iconv --version 说版本是 libiconv。尽管一个简单的 iconv --version 仍然给出了 glibc 版本。

然后我使用 --with-iconv=/usr/local 从源代码重新编译了 PHP。但是,phpinfo() 显示正在使用的 iconvglibc 版本。我也已经使用 --with-iconv-dir 或使用 /usr/local/bin/php 尝试了其他几个编译。

当然,我重新编译PHP后重启了web服务器。

我的 /etc/httpd/conf/httpd.conf 中有以下行:

LoadModule /usr/lib/httpd/modules/libphp5.so

libphp5.so其实是在/usr/lib/httpd/modules

phpinfo() 显示 PHP 5.3.3。我还 yum 删除了预安装的 PHP 5.1.* 以确保。但 iconv 仍在使用 glibc 版本。

ldd/usr/lib/httpd/modules/libphp5.so 给出

linux-gate.so.1 =>  (0x003b1000)
/usr/local/lib/preloadable_libiconv.so (0x00110000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x001ed000)
librt.so.1 => /lib/librt.so.1 (0x0021f000)
libmysqlclient.so.15 => /usr/lib/mysql/libmysqlclient.so.15 (0x003b2000)
libldap-2.3.so.0 => /usr/lib/libldap-2.3.so.0 (0x0026e000)
liblber-2.3.so.0 => /usr/lib/liblber-2.3.so.0 (0x00370000)
libiconv.so.2 => /usr/local/lib/libiconv.so.2 (0x00516000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x002a8000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0x00228000)
libz.so.1 => /usr/lib/libz.so.1 (0x00328000)
libcurl.so.3 => /usr/lib/libcurl.so.3 (0x00f23000)
libm.so.6 => /lib/libm.so.6 (0x0033b000)
libdl.so.2 => /lib/libdl.so.2 (0x00364000)
libnsl.so.1 => /lib/libnsl.so.1 (0x0037e000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00f5f000)
libssl.so.6 => /lib/libssl.so.6 (0x0862c000)
libcrypto.so.6 => /lib/libcrypto.so.6 (0x04145000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x08e2d000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x0611a000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x005f4000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x0024e000)
libidn.so.11 => /usr/lib/libidn.so.11 (0x071f5000)
libc.so.6 => /lib/libc.so.6 (0x08aa6000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00397000)
/lib/ld-linux.so.2 (0x00251000)
libresolv.so.2 => /lib/libresolv.so.2 (0x0748a000)
libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0x07ddf000)
libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x062b7000)
libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00369000)
libselinux.so.1 => /lib/libselinux.so.1 (0x0913b000)
libsepol.so.1 => /lib/libsepol.so.1 (0x07eb4000)

这是来自:NullPointer.ph 的交叉帖子

最佳答案

我刚刚通过手动重新编译 php iconv 扩展,将我的 php-5.3.3 从 glibc 的 iconv 更改为 GNU libiconv。请按照以下步骤操作:

  1. 下载 php-5.3.3 source code
  2. 解压并进入php-5.3.3/ext/iconv子目录
  3. 执行phpize命令(如果没有这样的命令则安装php-devel包)
  4. (*) 编辑配置文件(vim configure):在 4664 行添加 iconv_impl_name=""(您的系统配置中的确切行号可能不同):

    ...
    iconv_impl_name=""
        if test -z "$iconv_impl_name"; then
          { $as_echo "$as_me:${as_lineno-$LINENO}: checking if using GNU libiconv" >&5<
    ...
    
  5. ./configure --with-iconv=/usr/local|grep iconv:

    checking if using GNU libiconv... yes
    
  6. 制作

  7. sudo make install

现在我运行 php -i|grep "iconv impl" 并得到:

iconv implementation => libiconv

* 这个技巧强制配置选择 GNU libiconv 而不是 glibc 的 iconv。默认情况下,它会在第一步检查 glibc 的 iconv,而根本不检查 GNU libiconv。

关于php - 我如何强制 PHP 使用 iconv 的 libiconv 版本而不是 CentOS 安装的 glibc 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4743080/

相关文章:

linux - Linux 中处理器间通信的最佳方式是什么?

python - 在哪里找到python-2.6.0-8.9.28的xml.dom python包,我有一个Linux版本的suse/x86_64版本

apache - 如何在代理后面隐藏弱 SSL?

具有子域的 Apache2 多个 SSL 证书将不起作用

java - 我的 Java Socket 不适用于 Google.com,但适用于其他网站

php - 如何在 Linux/Apache 虚拟主机上运行 win32 控制台应用程序?

php - 确认完成后将详细信息从一张表移至另一张表 [sql]

node.js - 尽可能快地在 MongoDB 中加载一百万条记录

php - Laravel 5 Force 下载 pdf 文件

php - 通过数组定义类选项是一种不好的做法吗?