使用 MySQL 编译 PHP 5.4 及更高版本

使用 MySQL 编译 PHP 5.4 及更高版本

我正在 Oracle Enterprise Linux 上运行一堆 mediawiki 实例,并尝试从 1.19.x 升级到最新的 LTS 版本 1.23.x。我目前使用的是 PHP 5.3,由于特殊页面和缩略图存在一些奇怪的问题,建议我将 PHP 升级到 5.4 或更高版本。

./configure --prefix=$PRE --with-config-file-path=$CONFIG_FILE_PATH --with-mysql=/usr/include/mysql --with-apxs2=$PRE/apache/bin/apxs --with-zlib --with-jpeg-dir --with-gd --with-iconv-dir --with-libxml-dir=/usr/local/bin --enable-mbstring

我遇到的问题是我的 PHP 编译一直失败并出现错误:

error: Cannot find MySQL header files under /usr/include/mysql.

这就是奇怪的地方:

$ cd /usr/include/mysql
$ ll | grep mysql.h
-rw-r--r-- 1 root root 28148 May 11 2011 mysql.h

显然头文件存在。

更奇怪的是:如果我提取 PHP 5.3 tar 的副本,将其解压并运行完全相同的编译命令成功。

我知道 PHP 5.3 和 5.4 之间 PHP 从 libmysqlslient 转移到 mysqlnd [无论这意味着什么],但根据他们的手册,编译参数没有改变。

http://php.net/manual/en/mysql.installation.php

所以我想这一定是mysqlnd的改变。所以我通过使用 mysqlnd 编译 5.3 进行了测试,结果成功了!

--with-mysql=mysqlnd --with-mysql=/usr/include/mysql

我还尝试过 PHP 5.6,以防某些损坏的问题得到修复,但也因找不到头文件错误而失败。

我不知道从这里该去哪里。

答案1

来自 php 5.3 配置文件:

if test "$PHP_MYSQL" = "mysqlnd"; then
    PHP_MYSQLND_ENABLED=yes

elif test "$PHP_MYSQL" != "no"; then
    MYSQL_DIR=
    MYSQL_INC_DIR=

    for i in $PHP_MYSQL /usr/local /usr; do
        if test -r $i/include/mysql/mysql.h; then
            MYSQL_DIR=$i
            MYSQL_INC_DIR=$i/include/mysql
            break
        elif test -r $i/include/mysql.h; then
            MYSQL_DIR=$i
            MYSQL_INC_DIR=$i/include
            break
        fi
    done

    if test -z "$MYSQL_DIR"; then
        { echo "configure: error: Cannot find MySQL header files under $PHP_MYSQL.
Note that the MySQL client library is not bundled anymore!" 1>&2; exit 1; }
    fi

从 php 5.4 和 5.6 配置:

if test "$PHP_MYSQL" = "yes" || test "$PHP_MYSQL" = "mysqlnd"; then
    PHP_MYSQLND_ENABLED=yes

elif test "$PHP_MYSQL" != "no"; then
  MYSQL_DIR=
  MYSQL_INC_DIR=

  if test -r $PHP_MYSQL/include/mysql/mysql.h; then
    MYSQL_DIR=$PHP_MYSQL
    MYSQL_INC_DIR=$PHP_MYSQL/include/mysql
    break
  elif test -r $PHP_MYSQL/include/mysql.h; then
    MYSQL_DIR=$PHP_MYSQL
    MYSQL_INC_DIR=$PHP_MYSQL/include
    break
  fi

  if test -z "$MYSQL_DIR"; then
    as_fn_error $? "Cannot find MySQL header files under $PHP_MYSQL.
Note that the MySQL client library is not bundled anymore!" "$LINENO" 5
  fi

该错误具有误导性,因为它只是打印您输入的内容;$PHP_MYSQL并且并没有告诉你它实际上是在查找$PHP_MYSQL/include/mysql/mysql.hand $PHP_MYSQL/include/mysql.h,在我的例子中翻译为/usr/include/mysql/include/mysql/mysql.hand/usr/include/mysql/include/mysql.h

不用说,答案是:

./configure --prefix=$PRE --with-config-file-path=$CONFIG_FILE_PATH --with-mysql=/usr --with-apxs2=$PRE/apache/bin/apxs --with-zlib --with-jpeg-dir --with-gd --with-iconv-dir --with-libxml-dir=/usr/local/bin --enable-mbstring

相关内容