【问题标题】:Why can't my deployed Symfony application load the bundles.php file?为什么我部署的 Symfony 应用程序无法加载 bundles.php 文件?
【发布时间】:2020-09-06 12:59:20
【问题描述】:

我有一个 Symfony 网络应用程序。我想将其部署到虚拟专用服务器。

我已经在Laravel HomesteadVagrant box 中开发了应用程序,并且正在通过 Github 操作进行部署。

在我的本地机器上,应用程序在 Vagrant 环境中运行良好,但在将文件同步到实时服务器后,它给了我一个错误屏幕。

警告:需要(/var/www/thebedechkacase.com/src/config/bundles.php): 无法打开流:没有这样的文件或目录

错误来自 Kernel.php 的第 20 行,如下所示

const CONFIG_EXTS = '.{php,xml,yaml,yml}';
public function registerBundles()
{
    $contents = require $this->getProjectDir().'/config/bundles.php';
    foreach ($contents as $class => $envs) {
        if ($envs[$this->environment] ?? $envs['all'] ?? false) {
            yield new $class();
        }
}

我不明白的是,根据错误信息和上面的代码,$this->getProjectDir() 的输出解析为/var/www/thebedechkacase.com/src/thebedechkacase.com 是我的应用程序代码存储的文件夹),但是@987654331 @实际上位于/var/www/thebedechkacase.com/config/

为什么 Symfony 认为projectDirsrc 中,为什么不在根目录(又名thebedechkacase.com/)中寻找config?为什么这在我的开发环境中有效,但在实时服务器上无效?

其他信息:我正在尝试使用我在 Github 操作中调用的 shell 脚本设置必要的环境变量,但是当我在实时服务器上手动检查环境变量时shell,我看到它们都没有设置,所以我的脚本可能首先被破坏(这就是为什么你能够看到默认的 Symfony 错误页面)。这可能与此有关还是这是另一个错误?

可以看到错误的网址: https://thebedechkacase.com/

项目的 Github 存储库: https://github.com/Cooty/the-bedechka-case

部署代码的操作: https://github.com/Cooty/the-bedechka-case/blob/develop/.github/workflows/main.yml

Symfony 版本: 5.0

实时服务器运行 Ubuntu 20.04、Ngingx 和 PHP-FPM 7.4 和 PHP 7.4。

【问题讨论】:

  • 您部署的应用是否有 composer.json 文件?如果不是,那可能就是问题所在。您可以查看 HttpKernel::getProjectDir 以查看它设置的目录项目。它从包含您的 Kernel.php 文件(即 src/)的目录开始,然后查找 composer.json 的一级。不知道为什么,但它就是这样。
  • 补充一下@Cerad 刚才所说的,这是corresponding source code。我的猜测是在您的 vagrant 设置中的 src/ 中必须有一个 composer.json 文件。

标签: php symfony deployment devops


【解决方案1】:

@Cerad 引导我找到解决方案,我从 rsync 命令的文件列表中排除了 composer.json,我认为它只需要安装依赖项,但 Symfony 在运行时也不会从它读取。

【讨论】:

    【解决方案2】:

    Symfony 根据“composer.json”文件位置设置“项目目录”。 引导应用程序(web 和 cli)需要“项目目录”。

    这就是为什么当您在没有“composer.json”的情况下部署应用程序时,例如。对于 Elasticbeanstalk,您需要像这样修改内核:

    use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
    use Symfony\Component\HttpKernel\Kernel as BaseKernel;
    
    class Kernel extends BaseKernel
    {
        use MicroKernelTrait;
    
        /**
         * NOTICE:
         * We don't want to deploy composer.json that's being used to compute project dir, so we will specify it here manually.
         */
        public function getProjectDir()
        {
            return \dirname(__DIR__);
        }
    
    

    注意被覆盖的 getProjectDir() 方法。

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 2019-07-24
      • 1970-01-01
      相关资源
      最近更新 更多