【问题标题】:Symfony 2.2.1 rsync deploy - not working on remote serverSymfony 2.2.1 rsync deploy - 不在远程服务器上工作
【发布时间】:2013-05-19 20:49:27
【问题描述】:

我是 Symfony 的新手,我正在尝试使用 rsync 自动化部署过程,同时保持 Symfony 的本地和远程安装工作。

到目前为止我做了什么:

  • 在我的本地机器上安装了 Cygwin (Windows 7+Apache2.2+PHP 5.3+MySQL 5.1)
  • 使用命令在我的本地机器上从 shell 完成了基本的 Symfony 安装 php composer.phar create-project symfony/framework-standard-edition [path]/ 2.2.1
  • 使用 php-fpm (fastcgi) 设置远程 LAMP Ubuntu 服务器
  • app/config/ 目录中为本地和远程设置两个不同的配置文件parameters.yml 和parameters.yml.remote
  • 创建了一个app/config/rsync_exclude.txt 文件,其中包含一个要同步到远程服务器的文件列表(如this page 中所建议的那样)
  • 创建了一个我从 Cygwin 运行的部署 shell 脚本(见下文)

部署脚本发出命令:

rsync -avz /cygdrive/c/[path]/ user@server:[remote-path]/ --exclude-from=/cygdrive/c/[path]/app/config/rsync_exclude.txt
ssh user@server 'cd [remote-path]/ && php app/console --env=prod cache:clear && php app/console cache:clear'
ssh user@server 'mv [remote-path]/app/config/parameters.yml.remote ~/[remote-path]/app/config/parameters.yml'

rsyncsshmv 命令有效,但部署的站点始终显示 HTTP 500 错误(app.php 和 app_dev.php)。 查看服务器错误日志,错误是:

Fatal error:  Class 'Composer\\Autoload\\ClassLoader' not found in /[remote-path]/vendor/composer/autoload_real.php on line 23

任何线索都会受到欢迎。

编辑 - 这是我的vendor/composer/autoload_real.php 文件(抱歉让问题变得更长!):

<?php

// autoload_real.php generated by Composer

class ComposerAutoloaderInit9d50f07556e53717271b583e52c7de25
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInit9d50f07556e53717271b583e52c7de25', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        // ^^^^^^ this is line 23 and gives the error ^^^^^^^^^^^
        spl_autoload_unregister(array('ComposerAutoloaderInit9d50f07556e53717271b583e52c7de25', 'loadClassLoader'));

        $vendorDir = dirname(__DIR__);
        $baseDir = dirname($vendorDir);

        $map = require __DIR__ . '/autoload_namespaces.php';
        foreach ($map as $namespace => $path) {
            $loader->add($namespace, $path);
        }

        $classMap = require __DIR__ . '/autoload_classmap.php';
        if ($classMap) {
            $loader->addClassMap($classMap);
        }

        $loader->register(true);

        require $vendorDir . '/kriswallsmith/assetic/src/functions.php';
        require $vendorDir . '/swiftmailer/swiftmailer/lib/swift_required.php';

        return $loader;
    }
}

【问题讨论】:

  • 看看你的 autoload_real.php 可能会有所帮助:)
  • 请在 rsync 上传之前尝试“composer update -o”。优化的自动加载器(类映射)是生产系统的方式:)
  • @nifr 这似乎成功了...请将其作为答案发布,我会接受!
  • 好的,写了答案并包含了一些描述:)

标签: symfony cygwin rsync


【解决方案1】:

如果composer生成的自动加载器有错误,执行...

composer update

... 将更新您的依赖项并创建一个新的。

如果您要部署到生产系统,您应该调用带有 -o 标志的命令。

这样,composer 会生成一个类映射自动加载器(性能更好),而不是经典的自动加载器。

composer update -o

我想重新生成自动加载器会解决这个问题:)

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2015-12-08
    • 2022-01-05
    相关资源
    最近更新 更多