in Профессиональное

Чеклист: готов ли ваш symfony проект к развертыванию (часть 2)

По мотивам Check if your symfony application is ready for deployment

Небольшой сборник рецептов (или же мини тестов), которые желательно выполнять перед развертыванием symfony-проектов. Часть 2-я.

Favicon

Браузеры запрашивают favicon.ico файл, когда юзер в первый раз посещает страницу и впоследствии использует его для отображения в адресной строке и в меню закладок. Этот файлик не только делает внешний вид вашего сайта целостным, но и позволяет визуально отделять его от других сайтов в закладках, добавляет уникальности.

Вот несколько полезных ссылок для создания иконок:

Имена кукисов

Механизм сессий использует куки на стороне клиента и эти куки по умолчанию именуются symfony. В apps/frontend/config/factories.yml добавьте следующие строки для всех окружений:

storage:
  class: sfSessionStorage
  param:
    session_name: my_project

Если у вас используется sf[Doctrine]GuardPlugin, вы можете изменить имя куки “Remember me” в myProject/config/app.yml

all:
  sf_guard_plugin:
    remember_cookie_name:   myProjectRememberMe

Проверка продакшн сервера

Для проверки того, корректно ли настроен сервер для symfony-проекта, ребята из Sensio написали тестовый скрипт. Загрузить его можно здесь: http://svn.symfony-project.com/branches/1.4/data/bin/check_configuration.php. Поместите его в web-директорию (зачем именно туда непонятно, так как тестируются общие настройки). Выполните скрипт:

$ php check_configuration.php

********************************
*                              *
*  symfony requirements check  *
*                              *
********************************

php.ini used by PHP: Z:usrlocalphp5php.ini

** WARNING **
*  The PHP CLI can use a different php.ini file
*  than the one used with your web server.
*  (especially on the Windows platform)
*  If this is the case, please launch this
*  utility from your web server.
** WARNING **

** Mandatory requirements **

  OK        PHP version is at least 5.2.4 (5.2.4)

** Optional checks **

  OK        PDO is installed
  OK        PDO has some drivers installed: mysql
  OK        PHP-XML module is installed
  OK        XSL module is installed
  OK        The token_get_all() function is available
  OK        The mb_strlen() function is available
  OK        The iconv() function is available
  OK        The utf8_decode() is available
  OK        A PHP accelerator is installed
[[WARNING]] php.ini has short_open_tag set to off: FAILED
            *** Set it to off in php.ini ***
[[WARNING]] php.ini has magic_quotes_gpc set to off: FAILED
            *** Set it to off in php.ini ***
  OK        php.ini has register_globals set to off
  OK        php.ini has session.auto_start set to off
  OK        PHP version is not 5.2.9

Соответствующую документацию можно почитать тут: http://www.symfony-project.org/getting-started/1_4/en/02-Prerequisites.

Языковые настройки

По умолчанию, symfony помещает lang=en на каждую страницу вашего проекта. Если ваше приложение работает с другими языками, отредактируйте apps/frontend/templates/layout.php следующим образом:

<html
  xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="<?php echo $sf_user->getCulture() ?>"
  lang="<?php echo $sf_user->getCulture() ?>"
>

Удаляем /backend.php/ из URI

В файле apps/frontend/config/settings.yml вы можете скрыть отображение имени bootstrap скрипта при помощи опции no_script_name. Эта опция включена для первого сгенерированного рпиложения (как правило frontend) и отключена для последующих.

Почему?

Потому что без указания backend.php (ну или грубо говоря имени приложения через скрипт), symfony не может понять, какое из приложений запускать. Обратите внимание на web/index.php:

<?php

require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);
sfContext::createInstance($configuration)->dispatch();

Явно указано приложение (frontend) и окружение (prod). Т.о. мы должны придумать как указать symfony нужное приложение, не используя для этого backend.php явно.

Мы можем, например, использовать разные домены:

  • http://my-app.com для фронтэнда
  • http://my-app-backend.com для бэкэнда

Или, что еще лучше, для бэкэнжа можно использовать поддомен:

  • http://my-app.com для фронтэнда
  • http://admin.my-app.com для бэкэнда

Если ваш проект размещен на выделенном сервере

Вам нужно добавить новый виртуальный хост в httpd.conf:

<VirtualHost *:80>
  ServerName admin.my-app.com
  DirectoryIndex backend.php
  DocumentRoot "/path/to/the/web/directory"
  <Directory "/path/to/the/web/directory">
    AllowOverride All
    Allow from All
  </Directory>
  Alias /sf /path/to/the/symfony/data/web/sf
  <Directory "/path/to/the/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

Если ваш проект расположен на виртуальном хостинге

В этом случае у вас скорее всего нет доступа к http.conf и единственный доступный способ конфигурирования – это .htaccess. Добавим после строк:

<IfModule mod_rewrite.c>
  RewriteEngine On

Следующие строки:

# The admin subdomain returns to the backend
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} ^admin.my-app..*
RewriteRule ^(.*)$ backend.php [QSA,L]

И, наконец,

можно модифицировать settings.yml:

prod:
  .settings:
    no_script_name:  true

И очистить кэш:

php symfony cc

PHP акселератор

Для продуктового сервера вам нужна максимальная производительность. Установка акселератора (вики-статья про акселераторы http://en.wikipedia.org/wiki/PHP_accelerator) даст хороший прирост производительности при малых затратах. Одним из популярных акселераторов является APC (Advanced PHP Cache – http://www.php.net/apc).

Установка на выделенный сервер

Процесс установки APC на выделенный сервер прост насколько это вообще возможно ))

pecl install apc

Виртуальный хостинг

Как правило поставить что-то на виртуальном хостинге нельзя. Но в Doctrine ORM вы можете включить встроенный механизм кэширования. Включить кэширование можно добавив следующий метод в mySfProject/config/ProjectConfiguration.class.php (документация: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction):

/**
 * Configure the Doctrine engine
 **/
public function configureDoctrine(Doctrine_Manager $manager)
{
  $manager->setAttribute(Doctrine::ATTR_QUERY_CACHE, new Doctrine_Cache_Apc());
}

P.S. Установка eAccelerator для PHP5 под Windows http://hudson.su/?p=808 (хотя для posix систем принцип тот же, из исходников вы вряд ли его будете собирать, yum install или apt get…)

Оставайтесь с нами, окончание следует ))

Write a Comment

Comment

*

  1. Здравствуйте! Уже не знаю что делать! У меня такая проблема: пытаюсь выполнить команду
    php symfony doctrine:build-schema
    выдает: couldn’t locate driver named mysql
    Вот что показал check_configuration.php:

    OK PHP version is at least 5.2.4 (5.3.1)

    ** Optional checks **

    OK PDO is installed
    [[WARNING]] PDO has some drivers installed: : FAILED
    *** Install PDO drivers (mandatory for Propel and Doctrine) ***
    OK PHP-XML module is installed
    [[WARNING]] XSL module is installed: FAILED
    *** Install the XSL module (recommended for Propel) ***
    OK The token_get_all() function is available
    [[WARNING]] The mb_strlen() function is available: FAILED
    *** Install mb_strlen() function ***
    OK The iconv() function is available
    OK The utf8_decode() is available
    [[WARNING]] A PHP accelerator is installed: FAILED
    *** Install a PHP accelerator like APC (highly recommended) ***
    [[WARNING]] php.ini has short_open_tag set to off: FAILED
    *** Set it to off in php.ini ***
    [[WARNING]] php.ini has magic_quotes_gpc set to off: FAILED
    *** Set it to off in php.ini ***
    OK php.ini has register_globals set to off
    OK php.ini has session.auto_start set to off
    OK PHP version is not 5.2.9

    • Обратите внимание на строки:

      [[WARNING]] PDO has some drivers installed: : FAILED
      *** Install PDO drivers (mandatory for Propel and Doctrine) ***

      Это скорее всего означает что у вас не загружен pdo_mysql

    • Для решения проблемы в php.ini нужно указать верный путь к папке ext (или другой, где лежат расширения).