背景描述:最近在做公司旧项目的需求,要求实现用sftp上传文件到远程服务器,在本地调试的时候遇到了以下问题:
Fatal error: Uncaught Error: Call to undefined function ssh2_connect() in /commonPushFtp.class.php:26
其实就是因为本地docker的php没有安装ssh2扩展导致。
话不多说,上步骤。
先补充一点,docker没有php.ini文件,所有php扩展都放在: /usr/src/php/ext
,初始化执行以下指令即可
docker-php-source extract | delete
安装步骤
1、先安装libssh2
$ wget https://www.libssh2.org/download/libssh2-1.8.2.tar.gz --no-check-certificate
$ tar -zxvf libssh2-1.8.2.tar.gz
$ cd libssh2-1.8.2
$ ./configure --prefix=/usr/local/libssh2
$ make && make install
2、安装SSH2扩展
$ wget http://pecl.php.net/get/ssh2-1.3.1.tgz -O /tmp/ssh2.tgz
&& pecl install /tmp/ssh2.tgz
&& rm -rf /tmp/ssh2.tgz
&& docker-php-ext-enable ssh2
但是其实最终安装成功SSH2是用了下面两行代码
$ pecl install ssh2-1.3.1
$ docker-php-ext-enable ssh2
注意事项
在安装扩展过程出现了以下问题
1、安装libssh2第一步没有加--no-check-certificate
,会提示以下错误ERROR: The certificate of ‘xxxxx’ is not trusted
2、提示php版本要在4-6之间的,这个是因为libssh2版本太低了,用上面版本即可
3、报错libssh2_priv.h:257:22: error: field 'exchange_hash' has incomplete type libssh2_sha1_ctx exchange_hash;
这种情况有我更新我的openssl版本为1.1.1,并且用的较新的libssh2版本即可
4、安装ssh2的时候遇到了一个问题,
执行pecl install ssh2-1.3.1
的时候会提示
libssh2 prefix? [autodetect] :
网上的教程都说的直接回车即可,但我回车之后没有找到
checking for ssh2 files in default path… not found
configure: error: The required libssh2 library was not found. You can obtain that package from http://sourceforge.net/projects/libssh2/
ERROR: /tmp/pear/temp/ssh2/configure --with-php-config=/usr/local/bin/php-config --with-ssh2' failed
意思就是没找到libssh2,报这个错那就不能回车了,在提示libssh2 prefix? [autodetect] :
的时候直接输入我们刚才安装libssh2的位置/usr/local/libssh2,即可。
题外话
以上虽然安装完成了,但是我们的题目是在docker下安装扩展,所以其实还没完。其实以上的安装已经可用了,只是重启docker之后就没了。
所以其实在docker的Dockerfile-php
文件中添加
总结
docker中php扩展安装方式
1、PHP源码文件目录自带扩展 docker-php-ext-install直接安装
2、pecl扩展 因为一些扩展不包含在PHP源码文件中,PHP 的扩展库仓库中存在。用 pecl install 安装扩展,再用 docker-php-ext-enable 命令 启用扩展
3、其他扩展 一些既不在 PHP 源码包,也不再 PECL 扩展仓库中的扩展,可以通过下载扩展程序源码,编译安装的方式安装