Ubuntu16.04下交叉编译适配openwrt(CC版本)的swoole扩展库(swoole-1.10.3)
Ubuntu16.04下交叉编译适配openwrt(CC版本)的swoole扩展库(swoole-1.10.3)
一、简介
在开发websocket版本的PHP客户端时,初期测试是可行的,但是服务器端的websocket服务器程序不仅要和openwrt下的php-websocket-client建立连接,还要和网页端建立连接,等到用户量和网关量增加后,其服务器程序的并发性能要求会随之增加,所以,我们的服务器端程序使用了PHP的高级网络框架swoole,随之而来的问题就是运行在openwrt网关上的php-websocket-client也需要使用swoole库提供的客户端才行,而由于swoole扩展库在openwrt的安装源上是没有的,所以需要我们自己交叉编译swoole的源码进行该扩展库的安装,而swoole虽然是国人开发,但是官网给的mipsel架构下安装方式只有交叉编译几个大字,因此,交叉编译安装swoole扩展库只有自己摸索,所幸找到了正确的方向,交叉编译PHP,然后利用php-config和phpize来交叉编译安装swoole源码,填了很多坑之后PHP总算交叉编译完成了,在“Ubuntu16.04下交叉编译适配openwrt(CC版本)的PHP源码(php-5.6.17)总结”总结中有详细的说明,接下来就是借助交叉编译安装好的PHP来交叉编译安装swoole库了。
二、准备
交叉编译安装好openwrt对应版本的PHP到Ubuntu上;
下载pcre库源码。swoole库需要借助于pcre库:https://ftp.pcre.org/pub/pcre/
下载swoole源码:https://github.com/swoole/swoole-src/releases
http://pecl.php.net/package/swoole
http://git.oschina.net/swoole/swoole
三、编译及安装
1.交叉编译pcre(非必须,我这里就不缺pcre)
方法和交叉编译PHP源码相同,而且也没有什么坑,直接加上通用的交叉编译参数即可。
(1)解压、创建安装文件夹
tar zxvf pcre-8.32.tzr.gz
cd pcre-8.32/
mkdir mipselpcre
(2)configure
CC=mipsel-openwrt-linux-uclibc-gcc ./configure --host=mipsel-openwrt-linux --prefix=/home/ubuntu/php-src-php-5.6.17/pcre-8.32/mipselpcre/
…
(3)make
…
(4)make install
…
2.交叉编译swoole
(1)解压、phpize
…
cd swoole-src-1.10.3/
swoole会安装到PHP中,所以即使指定了安装位置也无用。
使用交叉编译的PHP的bin目录下phpize:
(2)configure
不要掉参数–with-php-config:
CC=mipsel-openwrt-linux-uclibc-gcc AR=mipsel-openwrt-linux-uclibc-ar LD=mipsel-openwrt-linux-uclibc-ld RANLIB=mipsel-openwrt-linux-uclibc-ranlib STRIP=mipsel-openwrt-linux-uclibc-strip ./configure --host=mipsel-openwrt-linux-uclibc --with-php-config=/home/ubuntu/php-src-php-5.6.17/php-5.6.17/mipselPHP5.6.17/bin/php-config
。。。
这里基本不会报错。
(3)make
因为swoole是纯c写的,所以这里生成的so文件是c的库文件,然后你下一步安装就会将la和so结合生成PHP的so库安装到你连接的PHP扩展中。
(4)make install
安装成功了,只要你的交叉编译的PHP没有安装在需要权限的位置,一般make install是不需要权限的。
常见错误:
显示Permission denied xxxxxxxx,在交叉编译时(前提是你交叉编译安装的PHP目录不需要root权限)出现这种错误就是你在configure时没有指定php-config造成的,默认使用的Ubuntu系统下安装的PHP的php-config文件了,前面configure和make都没有报错但并不代表没有错误。
如果你直接按照字面理解以为是没有权限,加上sudo的话会将swoole.so安装到你Ubuntu的php目录下,结果就是你将swoole.so拷贝到开发板后运行出现Unable to initialize module的错误或者swoole相关的函数还是无法使用,如下:
3.配置swoole库到openwrt开发板
(1)复制swoole.so到PHP的库文件安装路径下
使用scp协议将交叉编译的php中安装的swoole.so拷贝到开发板的扩展库安装目录下,我这里为/usr/lib/php/:
注意一点:如果你这个目录下存在swoole.so,先删掉,再传输,否则可能替换失效。
(2)添加swoole.ini文件
这里需要添加swoole.ini文件到/etc/php5/文件夹下,你可以发现很多扩展库的ini文件:
如果没有这个ini文件,即使你将so文件拷贝到上面的位置,扩展库也不会生效。
内容仿照其它扩展库即可,只需要加入:extension=swoole.so
(3)可能需要修改php.ini文件
extension_dir="/usr/lib/php/"
有时候这句话前面会有分号,有的话就去掉该分号。
(4)运行测试
调用swoole函数成功了,我这里swoole的服务器暂时没开,写一个swoole函数进行简单测试即可。
四、最后
swoole是一个套壳c的PHP扩展库,是作为一个高级网络框架来使用的,使得PHP借助于c实现了多线程、高并发。对于基于websocket、TCP、HTTP等通信协议的通信服务器、客户端开发很有帮助,少了写底层c程序的过程,可以加快项目开发进度。