Linux下手动编译为PHP添加扩展

本文内容于Ubuntu14.04下尝试,不保证本文内容在其他版本的Linux下适用。

准备扩展源码

官方扩展源码在php源码包的ext目录中,最好源码包版本与你当前使用的php版本相同
如果要安装非官方扩展(即非PHP官方提供的扩展),需要你自行下载源码

解压php源码包,进入ext目录,其中是以各种扩展命名的目录,选择一个进入(一次只能编译一个扩展)
例如:源码包在/usr/local/src/php-5.6.14/
则执行cd /usr/local/src/php-5.6.14/
进入后可以查看一下列表

 [root@m:/usr/local/src/php-5.6.14/ext/]# ls
 bcmath              fileinfo   mbstring   pdo_firebird  shmop      tokenizer
 bz2                 filter     mcrypt     pdo_mysql     simplexml  wddx
 calendar            ftp        mssql      pdo_oci       skeleton   xml
 com_dotnet          gd         mysql      pdo_odbc      snmp       xmlreader
 ctype               gettext    mysqli     pdo_pgsql     soap       xmlrpc
 curl                gmp        mysqlnd    pdo_sqlite    sockets    xmlwriter
 date                hash       oci8       pgsql         spl        xsl
 dba                 iconv      odbc       phar          sqlite3    zip
 dom                 imap       opcache    posix         standard   zlib
 enchant             interbase  openssl    pspell        sybase_ct
 ereg                intl       pcntl      readline      sysvmsg
 exif                json       pcre       recode        sysvsem
 ext_skel            ldap       pdo        reflection    sysvshm
 ext_skel_win32.php  libxml     pdo_dblib  session       tidy

我们以编译其中的zlib插件为例,先进入zlib插件源码目录

[root@m:/usr/local/src/php-5.6.14/ext/]# cd zlib

使用phpize生成编译配置

此时需要用到phpize来生成编译配置,它就在php安装目录里
如果你的php安装在了/usr/local/php/,则在当前插件目录执行/usr/local/php/bin/phpize
(不要改变当前目录,必须保持在插件源码目录)

 root@m:/usr/local/src/php-5.6.14/ext/zlib# /usr/local/php/bin/phpize
 Configuring for:
 PHP Api Version:         20131106
 Zend Module Api No:      20131226
 Zend Extension Api No:   220131226

如果提示Cannot find autoconf.,ubuntu使用apt-get install autoconf安装autoconf(其他系统请自行查找对应安装命令来安装autoconf)

生成Makefile

执行./configure --with-php-config=/usr/local/php/bin/php-config
同样自己替换php安装路径来指定php-config程序
自行查看是否有错误,有则查找原因

编译源码

执行make

root@m:/usr/local/src/php-5.6.14/ext/zlib# make
-———————————————————————
Libraries have been installed in:
/usr/local/src/php-5.6.14/ext/zlib/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the -LLIBDIR
flag during linking and do at least one of the following:

  • add LIBDIR to the LD_LIBRARY_PATH environment variable during execution
  • add LIBDIR to the LD_RUN_PATH environment variableduring linking
  • use the -Wl,--rpath -Wl,LIBDIR linker flag
  • have your system administrator add LIBDIR to /etc/ld.so.conf

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
-———————————————————————

Build complete.
Don’t forget to run ‘make test’.

如果出现错误则需要查找原因解决
例如, 编译readline扩展需要安装readline开发依赖包(Ubuntu下执行apt-get install libreadline5-dev)
编译bz2扩展需要安装bzip2开发依赖包(Ubuntu下执行apt-get install libbz2-dev)

进入modules子目录查看编译好的扩展库文件

[root@m:/usr/local/src/php-5.6.14/ext/zlib]# cd modules
[root@m:/usr/local/src/php-5.6.14/ext/zlib/modules]# ls
zlib.la zlib.so

将其复制到php插件目录即可,
cp * /usr/local/php/lib/php/extensions/
(如果你不知道php插件目录,可以通过phpinfo查看extension_dir)

然后修改php.ini,添加插件
搜索extension=你可以找到一大坨被注释掉的插件,在它们附近,另起一行,加入需要加载的扩展库
以zlib为例:添加一行extension=zlib.so
保存,重启php,完工

如果你需要一次性加入大量插件,一个个编译绝壁会蛋疼 just like me :)
那么我想你需要这个Linux下PHP插件自动编译脚本

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~

支付宝
微信