以非交互模式升级 PHP 并安装库

以非交互模式升级 PHP 并安装库

问题

我正在尝试安装php 5.5php5-memcached安装到已预装 php 5.3 的机器上。此外,我无法更改默认配置,因为它是为 CI 提供的暂存箱。因此,我们假设已预装 php 5.3,并且可以不是被改变。

因此,我首先尝试安装 php,然后安装 php-memcached:

sudo apt-get update
sudo apt-get -o Dpkg::Options::="--force-confnew" -o Dpkg::Options::="--force-overwrite" install -y php5
sudo apt-get -o Dpkg::Options::="--force-confnew" -o Dpkg::Options::="--force-overwrite" install -y php5-memcached

重要的是,上述命令由构建运行器调用,因此,它不是“交互”模式,因为没有负责安装的“用户”。

问题是由于现有的 php 5.3 我得到了:

A new version of configuration file /etc/php5/cli/php.ini is available, but the version installed currently has been locally
modified.

  1. install the package maintainer's version    3. show the differences between the versions            5. start a new shell to examine the situation
  2. keep the local version currently installed  4. show a side-by-side difference between the versions

这是因为它发现了一些修改过的配置文件。问题是 - 我能以某种方式强制覆盖它吗?如您所见,我已经尝试过但-o Dpkg::Options::="--force-confnew" -o Dpkg::Options::="--force-overwrite"没有成功(我想这是因为这个“对话框”与 dpkg 无关)。这个“对话框”的问题显然在于,事实上,所有设置命令都是从 CI 容器内部调用的,并且没有可以执行任何“操作”的“用户” - 它应该是完全自动执行的。

再次,

问题:在这种情况下,我如何强制覆盖任何配置?否则,我如何实现初始目标并将 php 从 5.3 升级到 5.5,然后安装 php5-memcached?

答案1

有问题的消息与此无关dpkg,因此无法通过dpkg选项来控制它。我发现有两个可行的选择:

  • 首先,完全重新安装 PHP:先删除 PHP 5.3,然后在“空白系统”上安装 5.5。就我而言,这不是一个好的解决方案,因为删除 PHP 5.3 将花费很长时间(超过 500,000 个文件和相应的检查)
  • 二、使用phpenvphp-build用于管理不同的 PHP 环境,而无需触及当前安装的环境。默认情况下,它附带pyrus扩展,用于pyrus数据包管理器,允许使用它。对于 php-memcached,我简单地使用它:

    pyrus install pecl/memcached-2.1.0
    pyrus build pecl/memcached-2.1.0
    phpenv rehash
    

    请注意,pyrus install pecl/memcached在某些 PHP 版本上可能会失败,因此,为构建指定特定版本的 PHP 更为安全。此方法pyrus将允许安装任何可用的包pyrus。如果您仍然需要自定义的东西(我需要 phalcon),您可以使用自定义编译来构建它,例如:

    #!/bin/bash
    
    PHPVERSION=$1
    
    # get the extension via wget, for example
    
    # cd to extension directory
    
    # Perform the compilation
    ~/.phpenv/versions/$PHPVERSION/bin/phpize
    ./configure --with-php-config=/home/ubuntu/.phpenv/versions/$PHPVERSION  /bin/php-config --enable-extension
    make && make install
    
    echo "extension=extension.so" > ~/.phpenv/versions/$PHPVERSION/etc/conf.d/extension.ini
    

    其中--enable-extension"extension.so"等等,您需要用编译的扩展进行替换。

如您所见,这不是解决问题的直接方法,但它仍然符合全自动 CI 构建的目标,允许为此类构建创建任何 PHP 版本设置/扩展启用。

PS:如果有人能找到一种方法来克服问题中的信息,这将是“第三”个选项,但我不相信使用dpkg工具可以实现。

相关内容