我正在 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.h
and $PHP_MYSQL/include/mysql.h
,在我的例子中翻译为/usr/include/mysql/include/mysql/mysql.h
and/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