【问题标题】:composer is "killed" automatically from SSH作曲家被 SSH 自动“杀死”
【发布时间】:2016-04-04 03:51:41
【问题描述】:

我在本地构建了一个完整的应用程序,现在尝试像往常一样安装在远程服务器上(git pull、解决冲突、更新实体、清除缓存......)但是我的新应用程序需要几个捆绑包,所以从 github 拉取并解决冲突后,我正在尝试安装捆绑包,但所有捆绑包都出现了同样的问题。

我的服务器是否“杀死”了进程?

我已经搜索了一整天,但找不到问题。我来自 php.ini 的 php 配置是:

这个错误以前从未发生过,两年前我在这台服务器上安装了很多包。有类似经历的人吗?

谢谢。

编辑:

我做了一个“php composer.phar 诊断”,得到以下信息:

问题可能出在“composer.json”中?

【问题讨论】:

标签: php symfony composer-php


【解决方案1】:

可能是与 PHP CLI 内存限制配置有关的问题。 您可以使用以下命令诊断 CLI PHP 的内存分配:

php -i | grep memory

然后使用以下命令查看哪个php.ini 用于 CLI 版本:

php -i | grep 'php.ini'

顺便说一句,我建议使用 composer 依赖项进行正确的开发工作流程如下:

但您知道,您通常应该在您的 机器,然后提交/部署 composer.lock 文件并仅运行 install 在您的服务器上使用锁同步依赖项 文件,以确保你只得到你正确测试过的东西。那样 您也可以运行内存不足的服务器而不会出现任何问题。

希望有帮助

【讨论】:

    【解决方案2】:

    谢谢@Matteo

    问题是否可能是服务器上剩余的可用 RAM 量?

    我已经验证了内存限制,但不认为这是问题。

    php-cli -i | grep memory
    

    但是,我已经解决了我的问题。实际上有三种方法可以解决它:

    1.在没有 Composer 的情况下安装包

    这不是推荐的解决方案,但知道如何去做通常非常有用,尤其是在非常过时的项目中,并且您担心命令composer update会产生问题

    本指南假设您在本地服务器上没有内存限制问题,因此所有命令都可以在 composer 中正常工作。

    首先,您必须在本地机器上安装捆绑包,例如:

    composer require jms/serializer-bundle
    

    安装包后,你只需要将包添加到你的 AppKernel.php 文件中:

    // in AppKernel::registerBundles()
      $bundles = array(
      // ...
      new JMS\SerializerBundle\JMSSerializerBundle(),
      // ...
    );
    

    第二,从你的bundle目录打开composer.json,例如

    // \vendor\jms\serializer-bundle\JMS\SerializerBundle\composer.json
    "require": {
        "php": ">=5.4.0",
        "jms/serializer": "^1.0.0",
        "phpoption/phpoption": "^1.1.0",
        "symfony/framework-bundle": "~2.3|~3.0"
    },
    

    对于“require section”中的每个bundle,打开对应的composer.json来识别所有需要的bundle。

    目的是复制所有这些捆绑包的目录并将它们上传到“供应商”目录中的远程服务器(注意保持相同的大目录层次结构)

    例如:

    如果你从 jms/serializer 包中打开 composer.json,你可以看到:

    // vendor/jms/serializer/composer.json
    "require": {
        "php": ">=5.4.0",
        "jms/metadata": "~1.1",
        "jms/parser-lib": "1.*",
        "phpcollection/phpcollection": "~0.1",
        "doctrine/annotations": "1.*",
        "doctrine/instantiator": "~1.0.3"
    },
    

    现在,您应该从 jms/metadata、jms/parser-lib 和 phpcollection/phpcollection 打开 composer.json 以识别您必须上传到远程服务器的其他包。

    目标是不丢失任何依赖项。

    最后,从远程服务器打开/vendor/composer/autoload_namespaces.php 并添加您的捆绑包依赖项的所有命名空间。您应该将此文件与您本地的“autoload_namespaces.php”进行比较。

    2。添加交换空间

    您有三个选择:创建新的交换分区、创建新的交换文件或在现有 LVM2 逻辑卷上扩展交换。建议您扩展现有的逻辑卷。

    3.在本地更新作曲家以仅在远程安装

    这是进行良好编程实践的推荐选项。当composer update 在第三个项目上完成时,我们不知道会发生什么错误,但是当您有足够的时间进行开发并且从现在开始该项目将归您所有时,您应该对项目进行全面升级。首先使用composer update 在您的本地服务器上更新并解决出现的所有冲突。最后,随着 composer.json 和 composer.lock 在服务器上更新,从现在到永远只需要运行 composer install 来安装和更新新包的所有依赖项。

    Matteo 的解释是对的,composer update 命令占用的内存比composer install 多很多。

    但你知道,你通常应该在你的机器上运行更新,然后提交/部署 composer.lock 文件,并且只在你的服务器上运行 install 以将依赖项与锁定文件同步,以确保你只得到你正确测试的东西。这样,您也可以毫无问题地运行内存不足的服务器。

    【讨论】:

    • 我观察到我的 docker 客户端的最大内存量有限是造成这种情况的原因。
    【解决方案3】:

    将 composer.lock 文件从本地设备上传到服务器 并运行composer install

    【讨论】:

      【解决方案4】:

      您可以在本地机器的项目目录中安装包,然后上传所有更新的文件,大多数是安装的包及其依赖项,位于供应商文件夹,composer.json和composer.lock中。

      【讨论】:

        【解决方案5】:

        在我的情况下,将 composer 升级到版本 2 解决了这个 killed 问题。我最初在 unix 机器上通过sudo apt-get install composer 安装了作曲家,所以我不得不删除它并使用来自composer 网站的说明安装 v2。升级后一切正常。

        【讨论】:

          【解决方案6】:

          Composer 更新静默返回“Killed”#1815

          sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
          sudo /sbin/mkswap /var/swap.1
          sudo chmod 600 /var/swap.1
          sudo /sbin/swapon /var/swap.1
          

          【讨论】:

            猜你喜欢
            • 2013-07-23
            • 2014-01-07
            • 2019-10-05
            • 1970-01-01
            • 2019-02-01
            • 2019-08-12
            • 2013-03-26
            • 2013-12-09
            相关资源
            最近更新 更多