用phpize编译动态扩展模块

服务器运行一段时间后,可能突然会需求添加某个扩展,这就需要在不重新编译PHP的情况下独立添加扩展。

我们在做什么

  • 在Linux下编译安装php是常有的事情,当然,目前为止个人依然推荐二进制安装,rpm或者deb安装等等。经常会出现我们需要ext中的一些功能,这些功能在编译过程中并没有加载进来,一个常用的办法就是使用phpize这个php的工具来编译扩展模块(结果会生成一个so文件,比如mbstring.so, tidy.so,功能类似于windows下的dll文件),然后再在配置文件中进行适当设定就OK了。
  • 整个过程和动态编译apache的模块非常相似,只不过apache使用的程序叫做apxs,而php里叫做phpize。
  • 下面的报错是一个典型的例子,在提醒你需要动态加载一个模块了。
Fatal error: Call to undefined function curl_init() in /var/www/boss.yfang.cn/htdocs/yahooboss.class.php on line 48
# 稍微查一下就知道这是php的curl模块中的一个函数

准备工作

  • 首先,我们需要php的源代码(其实我们只需要特定的扩展模块这部分代码)。假设我们吧源代码放在/usr/local/src/php-version/ 这里
  • 同时,我们需要知道已经安装好的php的安装位置,假设在/usr/local/php/目录下
  • 我们还需要了解php.ini 这个配置文件的位置,后面我们需要修改这个文件

实际操作

  • 1. 进入php源程序目录中的ext目录中,这里存放着各个扩展模块的源代码
cd /usr/local/src/php-version/ext
  • 2. 选择你需要的模块,比如tidy模块
cd tidy
  • 3. 执行phpize
/usr/local/php/bin/phpize # 有可能你用其他安装方式已经把phpize加到了PATH中,如果是这样你可以直接执行 "phpize" 就好了# 这时已经生成了一些配置信息,接下来可以开始configure了
  • 4. 像编译其他典型程序一样./configure
./configure --with-php-config=/usr/local/php/bin/php-config
# 这里如果直接执行./configure很有可能会报错# "configure: error: Cannot find php-config. Please use --with-php-config=PATH",# 你的配置文件位置可能不在这个目录,这个文件通常是在php安装目录的bin目录下的一个文件名叫做php-config或者php-config5的文件,实在找不到就find一下咯
    • 在这一步中如果出错了,通常是因为你的系统缺少相关的库,按照提示去安装吧
    • 比如,如果没有装libtidy的话,会在这一步收到”configure: error: Cannot find libtidy”这样的提示,安装相应的模块即可,如果安装模块的目标位置不是默认的位置,可能需要添加部分参数,比如 ./configure –with-php-config=/usr/local/php/bin/php-config –with-tidy=/usr/local/tidy ,具体参考Linux下安装Tidy(zz)
  • 5. 编译安装
make && make install
# 最后结果会输出生成的so位置,比如 "Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
  • 6. 编辑php.ini
    • 默认的extension_dir一般为’./’,我们需要做如下设定,才能找到正确的位置: extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/”
    • 然后是激活模块,很简单,只需要在后面添加 extension=tidy.so 就好了,有几个模块就添加几个
    • 如果在Windows下,很有可能这个模块已经在配置文件里面写了(只不过被注释掉了),那么,你只要把前面的分号去掉即可
    • 一般的默认配置文件都是dll文件,所以这个在linux下不适用,自己添加一句就是了
  • 7. 检查新的php配置是否能够正常工作
/usr/local/php/bin/php -v# 执行这个命令时,php会去检查配置文件是否正确,如果有配置错误,这里会报错,可以根据错误信息去排查# 下面是一个典型的错误输出,报告找不到配置文件中设定的so,原因就是没有更改extension_dir
PHP Warning:  PHP Startup: Unable to load dynamic library './curl.so' - ./curl.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library './tidy.so' - ./tidy.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP 5.2.6 (cli) (built: Aug  8 2008 16:08:19)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies
    with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies
  • 8. 重启apache,使你的php配置更新。
  • 9. 这里说一个检查模块是否OK的方法,phpinfo页面(<?php phpinfo(); ?>)打开,如果多了你刚刚添加的模块,基本上就证明OK了。

Linux下独立添加PHP扩展模块

 

服务器运行一段时间后,可能突然会需求添加某个扩展,如curl、pdo、xmlrpc等,这就需要在不重新编译PHP的情况下独立添加扩展。

下面以安装curl为例,介绍具体安装步骤。

1.安装crul wget http://curl.haxx.se/download/curl-7.19.6.tar.gz tar -zxvf curl-7.19.6.tar.gz cd curl-7.19.6 ./configure –prefix=/usr/local/curl

make

make install

2.编译生成扩展进入php源程序目录中的ext目录中,这里存放着各个扩展模块的源代码,选择你需要的模块,比如curl模块:

cd curl

执行phpize生成编译文件,phpize在PHP安装目录的bin目录下

/usr/local/php5/bin/phpize

运行时,可能会报错:Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable is set correctly and then rerun this script.“,需要安装autoconf:

yum install autoconf(RedHat或者CentOS)、apt-get install autoconf(Ubuntu Linux)

生成配置文件,并编译生成模块:

/usr/local/php5/bin/phpize

./configure –with-curl=/usr/local/curl –with-php-config=/usr/local/php5/bin/php-config

make

make install

这样,curl.so就被复制到PHP对应目录(如:/usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/)

3.修改配置在php.ini里,设置扩展目录:

extension_dir = “/usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/”

并添加扩展模块引用:

extension = curl.so

4.检查并重启Apache

/usr/local/php/bin/php -v

执行这个命令时,php会去检查配置文件是否正确,如果有配置错误,这里会报错,可以根据错误信息去排查。

发表评论