软件版本
本文所使用的操作系统,PHP,Swoole扩展的版本信息如下:
# 操作系统版本
[admin@sparklee ~]$ cat /etc/issue
CentOS release 6.8 (Final)
# PHP版本
[admin@sparklee ~]$ php -v
PHP 5.5.38 (cli) (built: Oct 12 2018 20:42:20)
# PHP扩展 - Swoole版本
swoole-1.9.23
安装方法1. PHP核心扩展安装
如果php是通过源码进行编译安装的话,则只需要在配置php源码时,附加上相应的选项即可:
# 第一步:下载php源码,解压
[admin@sparklee ~]$ wget http://cn2.php.net/distributions/php-5.5.38.tar.gz
[admin@sparklee ~]$ tar zxvf php-5.5.38.tar.gz
[admin@sparklee ~]$ cd php-5.5.38
# 第二步:配置php
# 例如,将pdo_mysql核心扩展进行静态编译安装
[admin@sparklee ~]$ ./configure --with-pdo-mysql
# 类似的,可以静态编译安装各种php核心扩展,如:
[admin@sparklee ~]$ ./configure \
--prefix=/home/admin/app/php --with-config-file-path=/home/admin/app/php/etc \
--enable-fpm --with-fpm-user=admin --with-fpm-group=admin \
--with-mysql --with-mysqli --with-pdo-mysql \
--with-curl \
--with-readline \
--enable-mbstring \
--enable-pcntl \
--enable-sysvmsg
# 第三步:编译
[admin@sparklee ~]$ make
# 第四步:安装
[admin@sparklee ~]$ make install
参考:
mysql扩展pdo-mysql安装:http://php.net/manual/zh/ref.pdo-mysql.php
进程控制扩展pcntl安装:http://php.net/manual/zh/pcntl.installation.php
激活mbstring函数:http://php.net/manual/zh/mbstring.installation.php
安装方法2. PECL扩展安装
因为本文所使用的测试机已经安装了Swoole扩展,为了演示Swoole扩展的安装过程,故先将已安装的Swoole扩展卸载掉,卸载方法如下:
# 查看已安装的PHP PECL扩展列表
[admin@sparklee ~]$ pecl list
Installed packages, channel pecl.php.net:
=========================================
Package Version State
swoole 1.9.23 stable
SeasLog 1.6.9 stable
xdebug 2.3.3 stable
# 卸载Swoole扩展
[admin@sparklee ~]$ pecl uninstall swoole
Unable to remove "extension=swoole.so" from php.ini
uninstall ok: channel://pecl.php.net/swoole-1.9.23
# 手动删除php.ini中"extension=swoole.so"
# 顺便提一下,".so"文件即shared object file,共享对象文件,亦即动态库dynamic library
接下来看看如何安装PECL扩展:
# 安装PECL Swoole扩展
[admin@sparklee ~]$ pecl install swoole-1.9.23 > install.log
# 手动修改php.ini文件,并添加一行:
extension=swoole.so
没错,PECL扩展的安装就是这么简单,两步搞定。
上文在执行PECL Swoole扩展安装命令时,我特意将安装日志重定向保存到了install.log文件中,目的就是为能够进一步分析通过pecl install命令安装PHP扩展时,具体都干了些啥。OK,现在,就让我们来详细分析一下安装日志的内容吧:
[admin@sparklee ~]$ vim install.log
# 第一步:自动下载swoole-1.9.23源码包(默认从站点http://pecl.php.net/package/swoole下载)
# 源码包的默认下载位置为:/tmp/pear/temp/swoole
downloading swoole-1.9.23.tgz ...
Starting to download swoole-1.9.23.tgz (708,921 bytes)
..............................done: 708,921 bytes
209 source files, building
# 第二步:执行phpize生成编译检测脚本(即:在swoole源码目录下生成./configure等文件)
running: phpize
Configuring for:
PHP Api Version: 20121113
Zend Module Api No: 20121212
Zend Extension Api No: 220121212
building in /tmp/pear/temp/pear-build-adminyaZcfk/swoole-1.9.23
# 第三步:执行./configure做编译配置检测
# Q: 为什么"--with-php-config"的值是"/home/admin/app/php/bin/php-config"?,
# A: 因为本文php的安装目录为/home/admin/app/php
running: /tmp/pear/temp/swoole/configure --with-php-config=/home/admin/app/php/bin/php-config
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for a sed that does not truncate output... /bin/sed
......
......
......
creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h
# 第四步:执行make,进行编译
running: make
/bin/sh /tmp/pear/temp/pear-build-adminyaZcfk/swoole-1.9.23/libtool --mode=compile cc -I. ......
......
......
......
Build complete.
Don't forget to run 'make test'.
# 第五步:执行make install,进行安装
running: make INSTALL_ROOT="/tmp/pear/temp/pear-build-adminyaZcfk/install-swoole-1.9.23" install
Installing shared extensions: /tmp/pear/temp/pear-build-adminyaZcfk/install-swoole-1.9.23/home/admin/app/php/lib/php/extensions/no-debug-non-zts-20121212/
......
......
......
Build process completed successfully
Installing '/home/admin/app/php/lib/php/extensions/no-debug-non-zts-20121212/swoole.so'
install ok: channel://pecl.php.net/swoole-1.9.23
configuration option "php_ini" is not set to php.ini location
You should add "extension=swoole.so" to php.ini
根据上文对install.log安装日志的分析可知,通过pecl install命令安装PECL扩展,事际上就是自动执行了上述的5个步骤,即:
(1) 第一步:自动下载swoole-1.9.23源码包
(2) 第二步:phpize,生成编译检测脚本
(3) 第三步:configure,做编译配置检测
(4) 第四步:make,编译
(5) 第五步:make install,安装
最后:手动添加"extension=swoole.so"到php.ini即可。
事实上,如何你自己写了一个很不错的php扩展,可以考虑提交到官方扩展仓库pecl.php.net上,如果pecl官方接受了你的扩展申请并将其纳为官方扩展,那么别人就可以很容易的通过pecl install命令安装你的php扩展了。然而,有一些php扩展可能并未纳入pecl官方扩展,那要如何安装这些非官方扩展呢?其实安装的方法与pecl install一键安装的原理是一样的,只不过需要我们手动通过执行phpize/configure/make/make install进行编译安装而已,这也就是"其他扩展"的安装方法。
安装方法3. 其他扩展安装
如上文所述,其他扩展的安装方法其实就是要手动完成pecl install命令自动完成的5个步骤:
# 第一步:从官方仓库pecl.php.net下载swoole-1.9.23源码包,解压并进入源码目录
[admin@sparklee ~]$ wget http://pecl.php.net/get/swoole-1.9.23.tgz
[admin@sparklee ~]$ tar zxvf swoole-1.9.23.tgz
[admin@sparklee ~]$ cd swoole-1.9.23
# 第二步:执行phpize来生成编译检测脚本
[admin@sparklee ~]$ phpize
Configuring for:
PHP Api Version: 20121113
Zend Module Api No: 20121212
Zend Extension Api No: 220121212
# 第三步:执行configure来做编译配置检测
[admin@sparklee ~]$ ./configure --with-php-config=/home/admin/app/php/bin/php-config
# 第四步:执行make进行编译
[admin@sparklee ~]$ make
# 第五步:执行make install进行安装
[admin@sparklee ~]$ make install
最后:手动添加"extension=swoole.so"到php.ini即可。
注意:通过手动执行phpize/configure/make/make install进行安装的扩展,pecl命令是无法进行管理的
# 通过pecl list命令无法查看到手动编译安装的swoole扩展
[admin@sparklee ~]$ pecl list
Installed packages, channel pecl.php.net:
=========================================
Package Version State
SeasLog 1.6.9 stable
xdebug 2.3.3 stable
# 通过pecl uninstall卸载手动安装的swoole扩展时,会提示pecl/swoole扩展未安装
[admin@sparklee ~]$ pecl uninstall swoole
pecl/swoole not installed
如果想要删除手动安装的php扩展,只需要:
(1)手动删除扩展共享对象文件:rm /home/admin/app/php/lib/php/extensions/no-debug-non-zts-20121212/swoole.so
(2)手动删除php.ini中的"extension=swoole.so"即可
(3)如果启动了php-fpm,安装或删除扩展后,需要重启php-fpm:pkill php-fpm && php-fpm
参考
1. PECL 扩展库安装:http://php.net/manual/zh/install.pecl.php
2. 编译安装Swoole:https://wiki.swoole.com/wiki/page/6.html
3. How to install more PHP extensions:https://github.com/docker-library/docs/blob/master/php/README.md#how-to-install-more-php-extensions