Docker容器中给php动态安装swoole扩展 以及 安装扩展报错 error: mcrypt.h not found. Please reinstall libmcrypt解决

一、Docker容器中给php动态安装swoole扩展 

    关于给docker容器中的PHP安装扩展之前有一篇文章: Docker下动态安装php扩展及error: mcrypt.h not found. Please reinstall libmcrypt解决-CSDN博客,不过在安装swoole的时候遇到一些问题,所以在这里记录一下。

    docker容器安装PHP扩展有两种比较方便的方式,一个就是上面这篇文章中的使用docker-php-ext-install命令安装,但这个的前提是需要将对应的扩展包下载下来解压放到容器中的 /usr/src/php/ext/目录里。另外就是直接使用pecl安装php扩展。这里使用的是pecl安装。

    在安装swoole-4.2.12过程中,提示的sockets,openssl,http2,mysqlnd,postgresql coroutine功能我都选择启用,于是也碰到了报错:error: #error "Enable http2 support, require nghttp2 library." 原因是缺少nghttp2模块,注意是系统缺少这个模块不是PHP缺少,所以使用apt-get install nghttp2进行了安装,但并没有解决,最后我是使用wget下载nghttp2安装解决了。

    另外启动swoole的时候有报错:PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20160303/swoole.so' - libnghttp2.so.14:,此为刚刚安装的nghttp2还没有加载,使用命令ldconfig动态加载一下即可,全过程如下:

#进入dockerfile
yes@u07:~$ docker ps -a
yes@u07:~$ docker exec -it 23c83371a8a8 /bin/bash
#先进入/usr/local/lib/php/extensions/看看文件夹名称再查看
root@21231fewea8w:/var/www#  ls -l /usr/local/lib/php/extensions/no-debug-non-zts-20170718/
root@21231fewea8w:/var/www#  ls -l /usr/local/lib/php/extensions/no-debug-non-zts-20160303/
total 5424
-rwxr-xr-x 1 root staff  414128 Nov  7 16:41 gd.so
-rwxr-xr-x 1 root staff   49896 Nov  7 17:31 iconv.so
.....
#杳看启动的PHP模块
root@21231fewea8w:/var/www# php -m 
[PHP Modules]
Core
ctype
....
#开始安装swoole4.2.12
root@21231fewea8w:/var/www# pecl install swoole-4.2.12
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading swoole-4.2.12.tgz ...
Starting to download swoole-4.2.12.tgz (1,272,589 bytes)
enable sockets supports? [no] : yes
enable openssl support? [no] : yes
enable http2 support? [no] : yes
enable mysqlnd support? [no] : yes
enable postgresql coroutine client support? [no] : yes
/tmp/pear/temp/swoole/php_swoole.h:136:2: error: #error "Enable http2 support, require nghttp2 library."
 #error "Enable http2 support, require nghttp2 library."
  ^
Makefile:348: recipe for target 'swoole.lo' failed
make: *** [swoole.lo] Error 1
ERROR: 'make' failed
root@21231fewea8w:/var/www# apt-get install nghttp2             
Reading package lists... Done
#apt-get 安装nghttp2,如果没解决使用下面的办法
root@21231fewea8w: apt-get install nghttp2
#在docker下下载安装:
root@21231fewea8w: cd /opt
root@21231fewea8w: /opt wget https://github.com/nghttp2/nghttp2/releases/download/v1.34.0/nghttp2-1.34.0.tar.gz
root@21231fewea8w: /opt tar zxvf nghttp2-1.34.0.tar.gz
root@21231fewea8w: /opt cd nghttp2-1.34.0;./configure;make  && make install
#然后再进行安装swoole成功
root@21231fewea8w:/var/www# pecl install swoole-4.2.12
.....
Build process completed successfully
Installing '/usr/local/lib/php/extensions/no-debug-non-zts-20160303/swoole.so'
Installing '/usr/local/include/php/ext/swoole/config.h'
install ok: channel://pecl.php.net/swoole-4.2.12
configuration option "php_ini" is not set to php.ini location
You should add "extension=swoole.so" to php.ini
#到容器外挂载目录或容器中添加docker-php-ext-swoole.ini文件
yes@u07:/data/php/php/conf.d$ cp docker-php-ext-redis.ini docker-php-ext-swoole.ini
#内容:extension=swoole.so
root@21231fewea8w:/usr/local/lib/php/extensions/no-debug-non-zts-20160303# php -m | grep swoo
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20160303/swoole.so' - libnghttp2.so.14: cannot open shared object file: No such file or directory in Unknown on line 0
root@21231fewea8w:/usr/local/lib/php/extensions/no-debug-non-zts-20160303# ldconfig

最后重启PHP容器即可。安装好的swoole4.2.12扩展截图如下:

二、Docker下动态安装php扩展及error: mcrypt.h not found. Please reinstall libmcrypt解决

    docker安装的php带的那些扩展肯定和自己要的有些差别,必要时候肯定需要用再安装一些扩展。好在docker安装扩展也挺方便,基本只要知道两个命令就可以。即是docker-php-source 和 docker-php-ext-install。
    docker-php-source:功能就是在PHP容器中创建一个/usr/src/php的目录,所有PHP扩展源码扩展存放的路径:/usr/src/php/ext 里面。

    docker-php-ext-install:就是安装php模块,比如pdo pdo_mysql。应用如下:

root@user19:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
4da5b8faf1a0        nginx               "nginx -g 'daemon of…"   26 hours ago        Up 24 hours         0.0.0.0:80->80/tcp       nginx
2af5436df1e2        deluxo/php7.1-fpm   "docker-php-entrypoi…"   47 hours ago        Up 46 hours         0.0.0.0:9000->9000/tcp   php
root@user19:~$ docker exec -it 2af5436df1e2 /bin/bash
root@2af5436df1e2:/var/www# docker-php-source
#直接安装即可
root@2af5436df1e2:/var/www# docker-php-ext-install intl
root@2af5436df1e2:/var/www# docker-php-ext-install opcache
#有时会提示一些错误,比如缺少什么依赖模块直接在此apt-get install安装模块
root@2af5436df1e2:/var/www# docker-php-ext-install mcrypt
......
checking if nawk is broken... no
checking for mcrypt support... yes, shared
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
root@2af5436df1e2:/var/www# docker-php-ext-install libmcrypt
error: /usr/src/php/ext/libmcrypt does not exist

root@2af5436df1e2:/var/www# /usr/local/bin/docker-php-ext-install libmcrypt
error: /usr/src/php/ext/libmcrypt does not exist
#安装时列出来当前可安装的一些模块
Possible values for ext-name:
bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv imap interbase intl json ldap mbstring mcrypt mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline recode reflection session shmop simplexml snmp soap sockets spl standard sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zip
#映遇上这个错误:configure: error: mcrypt.h not found. Please reinstall libmcrypt.解决方法
root@2af5436df1e2:/var/www# apt-get install -y \
>         libfreetype6-dev \
>         libjpeg62-turbo-dev \
>         libmcrypt-dev \
>         libpng-dev
root@2af5436df1e2:/var/www# /usr/local/bin/docker-php-ext-install mcrypt
#在解决上面的方法时我退出容器进行了以下安装
root@user19:~$apt-get install libperl-dev libjpeg-dev  libpng-dev libxml2-dev libmcrypt-dev libmhash-dev libfreetype6-dev 
root@user19:~$ wget https://excellmedia.dl.sourceforge.net/project/mcrypt/Libmcrypt/Production/libmcrypt-2.5.7.tar.gz
root@user19:~$ wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/attic/libmcrypt/libmcrypt-2.5.7.tar.gz
root@user19:~$ tar -zxvf libmcrypt-2.5.7.tar.gz; cd libmcrypt-2.5.7
root@user19:~$ ./configure  –prefix=/usr/local; make ; make install

    对这个报错:configure: error: mcrypt.h not found. Please reinstall libmcrypt.着实让我头痛了一个多小时,尝试了各种办法,在容器外下载安装了libmcrypt模块进行安装,同时安装了一些mhash等各种模块,重启服务器、多次重启容器都没有成功。最后使用代码中的解决方法成功了,但不知道我前面做的这些安装是不是起到了作用。做个记录。

    除了上面之外,还有其它两个命令:
docker-php-ext-enable #启用一些已经安装了的模块,就和去除php.ini中模块前的;号一样。
docker-php-ext-configure#如果对模块安装前需要进行一些依赖路径配置可以使用。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值