【问题标题】:How to install ssh2 for php 7.3如何为 php 7.3 安装 ssh2
【发布时间】:2019-07-26 10:06:52
【问题描述】:

尝试通过 pecl 安装扩展 ssh2 时,我遇到以下错误消息。我使用的是基于 php:7.3.2-fpm

的 docker 容器

重现步骤:

  • 安装 PHP 7.3.2
  • 安装包libssh2-1-devlibssh2-1
  • 尝试通过pecl install ssh2-1.1.2安装ssh2扩展

那么如何才能成功安装ssh2 扩展呢?

...

/tmp/pear/temp/ssh2/ssh2_fopen_wrappers.c: In function 'php_ssh2_fopen_wrapper_tunnel':
/tmp/pear/temp/ssh2/ssh2_fopen_wrappers.c:1265:42: error: invalid operands to binary == (have 'zend_string {aka struct _zend_string}' and 'int')
  if (resource->path && resource->path[0] == '/') {
                        ~~~~~~~~~~~~~~~~~ ^~
/tmp/pear/temp/ssh2/ssh2_fopen_wrappers.c:1268:8: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
   host = resource->path + 1;
        ^
Makefile:196: recipe for target 'ssh2_fopen_wrappers.lo' failed
make: *** [ssh2_fopen_wrappers.lo] Error 1
ERROR: `make' failed

我发现this question 未得到答复,并在我第一次搜索时暂停了超级用户。我觉得这里更适合。

【问题讨论】:

    标签: php docker pecl libssh2


    【解决方案1】:

    bugs.php.net 上有一个现有报告,用户 goldorakhong 评论说要从源代码编译它。

    使用 docker 文件可以这样做:

    RUN cd /tmp \
        && git clone https://git.php.net/repository/pecl/networking/ssh2.git \
        && cd /tmp/ssh2/ \
        && .travis/build.sh \
        && docker-php-ext-enable ssh2
    

    如果您不使用 docker,则需要替换 docker-php-ext-enable 以其他方式注册变量。

    【讨论】:

    • 这很固执,但我推荐phpseclib 而不是ssh2。它可以通过作曲家安装。无需 PEAR 或编译。在使用ssh2.sftp://-wrapper 时,ssh2 也经常给我段错误,甚至更糟。
    • 为什么 .travis 目录下的 build.sh 脚本会创建一个新用户并在服务器上授予它 ssh 访问权限?这似乎不是一个好主意,也似乎没有必要。这有什么合理的解释吗?
    【解决方案2】:

    Windows 2008 R2 64 位

    Wampserver 3.1.9 64 位

    PHP 7.3.12

    1 - 从https://windows.php.net/downloads/pecl/releases/ssh2/ 下载 php_ssh2.dll 和 php_ssh2.pdb

    2 - 选择 2019 年 9 月 18 日上午 11:50 1.2

    3 - 选择 9/18/2019 上午 10:45 438049 php_ssh2-1.2-7.3-ts-vc15-x64.zip

    4 - 解压并复制 php_ssh2.dll 和 php_ssh2.pdb 到 C:/wamp64/bin/php/php7.3.12/ext/

    5 - 在 php.ini 中插入行:extension=php_ssh2.dll

    6 - 在 wamp 中重新启动所有服务

    【讨论】: