【问题标题】:How to deploy PHP7 with MongoDB ext on Heroku?如何在 Heroku 上使用 MongoDB ext 部署 PHP7?
【发布时间】:2017-09-29 07:07:14
【问题描述】:

我正在尝试在 Heroku 上部署应用程序,但遇到了与冲突的作曲家依赖项相关的问题。它在我的本地开发机器上运行良好,我可以composer update 没有任何问题。

这是我的composer.json 的示例:

"require": {
    "php": "7.1.*",
    "ext-mongo": "*",
    "ext-mongodb": "^1.2",
    "symfony/symfony": "3.2.*",
    "doctrine/orm": "^2.5",
    "doctrine/doctrine-bundle": "^1.6",
    "doctrine/doctrine-cache-bundle": "^1.2",
    "symfony/swiftmailer-bundle": "^2.3.10",
    "symfony/monolog-bundle": "^3.0.2",
    "symfony/polyfill-apcu": "^1.0",
    "sensio/distribution-bundle": "^5.0",
    "sensio/framework-extra-bundle": "^3.0.2",
    "incenteev/composer-parameter-handler": "^2.0",
    "twig/twig": "^1.0||^2.0",
    "mongodb/mongodb": "^1.1",
    "doctrine/mongodb-odm-bundle": "^3.2",
    "alcaeus/mongo-php-adapter": "^1.0",
    "friendsofsymfony/user-bundle": "2.0.0-beta2",
    "friendsofsymfony/oauth-server-bundle": "^1.5",
    "symfony/assetic-bundle": "^2.8",
    "twig/extensions": "^1.4",
    "jms/serializer-bundle": "^1.2",
    "friendsofsymfony/rest-bundle": "^2.1"
},

...这是 Heroku 的错误输出:

> Loading repositories with available runtimes and extensions
> Updating dependencies
> Your requirements could not be resolved to an installable set of packages.
>
>   Problem 1
>     - Installation request for doctrine/annotations v1.4.0 -> satisfiable by doctrine/annotations[v1.4.0].
>     - Installation request for twig/twig v2.3.2 -> satisfiable by twig/twig[v2.3.2].
>     - Conclusion: don't install php 7.1.3
>     - Installation request for doctrine/mongodb 1.4.0 -> satisfiable by doctrine/mongodb[1.4.0].
>     - doctrine/annotations v1.4.0 requires php ^5.6 || ^7.0 -> satisfiable by php[5.6.30, 7.0.15, 7.0.16, 7.0.17, 7.1.1, 7.1.2, 7.1.3].
>     - don't install php 7.1.1|don't install php 5.5.38
>     - don't install php 7.1.2|don't install php 5.5.38
>     - don't install php 7.0.15|don't install php 5.5.38
>     - don't install php 7.0.16|don't install php 5.5.38
>     - don't install php 7.0.17|don't install php 5.5.38
>         - ext-mongo 1.6.14 requires php 5.5.* -> satisfiable by php[5.5.38].
>     - doctrine/mongodb 1.4.0 requires ext-mongo ^1.5 -> satisfiable by ext-mongo[1.6.14].
>     - ext-mongo 1.6.14 requires php 5.6.* -> satisfiable by php[5.6.30].
>     - Conclusion: don't install php 5.6.30

【问题讨论】:

    标签: mongodb heroku composer-php php-7 doctrine-odm


    【解决方案1】:

    这是一个更大的问题。我们把它分成两部分:

    第 1 部分:

    Ext-mongo 是一个legacy driver,在 PHP7.x 中不存在。但是 Doctrine-ODM 需要 ext-mongo。解决方法是使用一个适配器,该适配器为使用新MongoDB driver 的旧驱动程序提供接口。 Doctrine-ODM documentation 中有解释,但该解释不是最新的,因此不完整/不正确。

    在您的情况下,这意味着您从作曲家文件的 "require" 部分中删除 "ext-mongo""ext-mongodb" 并保留 "alcaeus/mongo-php-adapter" (适配器将需要自己 "ext-mongodb" - 新驱动程序。)不幸的是,这仍然行不通,将我们带到第 2 部分。

    第 2 部分:

    整合目前由 Packagist 提供的 alcaeus/mongo-php-adapter 会造成作曲家依赖冲突。有一些关于 exactly this problem 的讨论,以及这是否可能是一般作曲家问题 (see here)。此外,还提出了几种解决方案。 One solution 为我工作(我也在 Heroku 上部署):

    alcaeus/mongo-php-adapter 的 composer.json 中替换:

    "provide": {
        "ext-mongo": "1.6.14"
    },
    

    作者:

    "replace": {
        "ext-mongo": "1.6.14"
    },
    

    在 GitHub 上,master branch of alcaeus/mongo-php-adapter 使用“provide”版本,但也有一个 composer-replace 分支使用“replace”版本。不幸的是,这个分支没有保持最新。

    您可以在作曲家文件中将该“替换”分支用作 alcaeus/mongo-php-adapter 的存储库:

    "repositories": [
            {
                "type": "vcs",
                "url": "https://github.com/alcaeus/mongo-php-adapter"
            }
        ],
    "require": {
        "alcaeus/mongo-php-adapter": "dev-composer-replace",
        ...
    

    或者,您可以分叉主分支,将“提供”替换为“替换”并将该分叉用作存储库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 2021-04-20
      • 2022-12-13
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      相关资源
      最近更新 更多