Symfony 2.2.1 rsync deploy - не работает на удаленном сервере

Я очень новичок в Symfony и пытаюсь автоматизировать процесс развертывания с помощью rsync, сохраняя работоспособность как локальной, так и удаленной установки Symfony.

Что я сделал до сих пор:

  • установил Cygwin на мою локальную машину (Windows 7+Apache2.2+PHP 5.3+MySQL 5.1)
  • выполнил базовую установку Symfony на моей локальной машине из оболочки с помощью команды php composer.phar create-project symfony/framework-standard-edition [path]/ 2.2.1
  • настроить удаленный сервер LAMP Ubuntu с помощью php-fpm (fastcgi)
  • настроить два разных файла конфигурации для локального и удаленного в app/config/ dir, parameters.yml и parameters.yml.remote
  • создал app/config/rsync_exclude.txt файл, содержащий список файлов, которые не rsync для удаленного сервера (как предложено на этой странице)
  • создал сценарий развертывания оболочки, который я запускаю из Cygwin (см. ниже)

Сценарий развертывания выдает команды:

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'

rsync, ssh а также mv Команды работают, но развернутый сайт всегда показывает ошибку 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;
    }
}

1 ответ

Решение

Если есть ошибка с автозагрузчиком, сгенерированным композитором, выполняя...

composer update

... обновит ваши зависимости и создаст новую.

Вы должны вызывать команду с флагом -o, если вы развертываете в производственной системе.

Таким образом, composer генерирует автозагрузчик карты классов (который работает намного лучше) вместо классического автозагрузчика.

composer update -o

Я думаю, повторная генерация автозагрузчика решит проблему:)

Другие вопросы по тегам