在 Bluemix 上部署 Symfony2

Deploying Symfony2 on Bluemix

我们正在尝试在 bluemix 上部署 symfony2 应用程序,但没有成功...我们已经看到一些关于此类问题的帖子,但它们要么没有答案,要么已过时,要么问题略有不同。

我们有一个基于 symfony 标准版发行版的 symfony 应用程序,移动到 backend 文件夹中,因为我们还有一个前端。 但是,composer.json 位于根目录中,并引用后端文件夹。这是唯一完成的修改。

在本地一切正常,但在使用 PHP buildpack 的 Bluemix 上却不行,这是错误:

Generating autoload files

  [RuntimeException]                                                                                             
  Could not scan for classes inside "backend/app/AppKernel.php" which does not appear to be a file nor a folder  

在 Bluemix 上,env 被设置为通过 manifest.yml 生产,我们已经尝试在本地以相同的配置安装 composer:

 applications:
 - name: myapp
   random-route: true
   memory: 128M
   env:
    SYMFONY_ENV: prod
    #BP_DEBUG: true

这个错误是我在详细模式下得到的,我在没有详细模式的情况下也完全一样。我们 运行 在 Bluemix 上处于非开发模式,这里是完整的 options.json:

{
    "COMPOSER_INSTALL_OPTIONS": [ "--no-dev", "-vvv"]
}

我试图添加用于调试目的的脚本。它在本地运行良好,但在 Bluemix 上运行不佳,因此根本无济于事。摘自composer.json:

"scripts": {
    "pre-autoload-dump": [
        "echo TEST"
    ],
    ...
}

文件存在并且在正确的位置:

   $ ll backend/app/
    total 128
    drwxr-xr-x 6 bob bob  4096 févr. 28 15:45 .
    drwxr-xr-x 9 bob bob  4096 févr. 28 15:44 ..
    -rwxr-xr-x 1 bob bob   101 févr. 23 11:37 AppCache.php
    -rwxr-xr-x 1 bob bob  1394 févr. 24 11:32 AppKernel.php
    -rwxr-xr-x 1 bob bob   263 févr. 23 11:37 autoload.php
    -rw-r--r-- 1 bob bob 40956 févr. 28 15:45 bootstrap.php.cache
    drwxr-xr-x 3 bob bob  4096 févr. 28 15:45 cache
    -rwxr-xr-x 1 bob bob  3909 févr. 28 15:45 check.php
    drwxr-xr-x 2 bob bob  4096 févr. 28 14:37 config
    -rwxr-xr-x 1 bob bob   897 févr. 22 15:28 console
    -rwxr-xr-x 1 bob bob   143 févr. 23 11:37 .htaccess
    drwxr-xr-x 2 bob bob  4096 févr. 28 14:37 logs
    -rwxr-xr-x 1 bob bob  1358 févr. 23 11:37 phpunit.xml.dist
    drwxr-xr-x 3 bob bob  4096 févr. 23 11:37 Resources
    -rwxr-xr-x 1 bob bob 34272 févr. 28 15:45 SymfonyRequirements.php

似乎 composer.json 中的配置是正确的(寻找正确的位置)。同样的文件在本地使用没有任何问题:

"extra": {
        "symfony-app-dir": "backend/app",
        "symfony-web-dir": "backend/web",
        ...
}

我最后想到的是,我在执行新的 cf push 之前执行了 cf delete myapp 以确保Bluemix 上考虑了最新文件(因为我不明白为什么 Bluemix 上没有预自动加载转储脚本 运行)

感谢您的帮助!

我找到问题了。

首先,我是这样找到的:

我已将 no-script 和 no-autoloader 选项添加到 composer,以确保容器 运行 并且我能够连接到它以查看文件系统。否则,容器将被破坏,并且无法知道发生了什么。

"COMPOSER_INSTALL_OPTIONS_DEBUG": [ "--no-dev", "-vvv", "--no-autoloader", "--no-scripts"]

然后我用 ssh 连接到容器(只用 Diego):

cf enable-ssh
cf ssh

然后,通过查看文件系统,我发现 backendfrontend 文件夹放在 htdocs 文件夹。

我已将 composer.json 更改为参考 htdocs/backend/ 而不是仅 backend/ 并且一切正常美好的。来自 composer.json 文件的示例:

    "autoload": {
        "psr-4": { "": "htdocs/backend/src/" },
        "classmap": [ "htdocs/backend/app/AppKernel.php", "htdocs/backend/app/AppCache.php" ]
    },

现在的问题是我在本地环境(一切都在./)和容器(一切都在htdocs/ ) 和 composer.json 不支持环境变量使得仅使用一个文件变得复杂。但那是另外一回事了。