需求背景:公司项目有个功能需要导出花名册,有个客户里的员工有几万名,每次导出需要很久且接口不稳定经常会报504。继而开发优化需要用到下xlswriter这个扩展。

先上官方地址:https://github.com/viest/php-ext-xlswriter

开始部署

由于公司的环境是docker-alpine,所以本想着更换下源,使用添加命令即可

1
apk add php7-xlswriter

结果发现 xlswriter文档中部署的源只有

1
2
# 添加官方 Testing 源
# http://nl.alpinelinux.org/alpine/edge/testing

尝试添加源以后,再装扩展,发现一直不能识别到扩展路径。

1
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php7/modules/xlswriter.so' - Error relocating /usr/lib/php7/modules/xlswriter.so: zend_wrong_parameter_type_error: symbol not found in Unknown on line 0

多方资料查询无果,加入群里问了下作者问题,作者==说apk的源没有更新,可通过pecl编译==,安装无奈最后选择编译安装了。

Pecl编译安装

1.pecl工具安装:

1
2
3
4
cd /bin/
wget http://pear.php.net/go-pear.phar -O go-pear.php
php go-pear.php
##回车默认安装

2.相关扩展的安装

1
2
3
4
5
6
apk update

apk add autoconf \
gcc \
g++ \
zlib-dev

3.尝试使用pecl安装xlswriter

1
2
pecl install xlswriter会出现错误提示,但是不要紧xlswriter 的安装包已经下载下来了
路径在/tmp/pear/install/

4.编译安装

1
2
3
4
5
6
7
8
9
10
11
# 解压 
tar -zxvf xlswriter.tgz
cd xlswriter

phpize && ./configure --with-php-config=/usr/bin/php-config7 --enable-reader

这里会出现一个提示 phpize :找不到命令

这里需要安装一个扩展 php7-dev

使用命令apk add php7-dev安装,安装后编译的命令还不可以直接用,在/usr/bin找到phpize7 ,将其复制一个为phpize

5.开始编译

1
phpize && ./configure --with-php-config=/usr/bin/php-config7 --enable-reader

编译后执行make && make install 会提示 make找不到命令

1
apk add make

然后再次运行make && make install,编译完成。

6.配置扩展文件

1
2
3
4
cd /usr/lib/php7/modules/查看xlswriter.so文件是否存在
确认存在 cd /etc/php7/conf.d
编辑扩展文件 vi xlswriter.ini
extension = xlswriter.so

7.运行 php -m |grep xlswriter 确认是否安装上

1
2
# php -m |grep xlswriter
xlswriter

一劳永逸

在我编译安装后作者说,两个基础包一样的镜像,都安装一下zlib扩展,然后在另一个镜像里编译扩展,把编译好的so动态库复制过去就可以完成安装

这句话的意思两个相同的基础镜像1和2,在镜像1中编译之前安装zlib扩展,编译成功以后的xlswriter.so 可以复制在镜像2中,只需执行上面的第六步骤配置扩展文件即可完成扩展的安装