Несколько лет назад я уже писал про это, но с того времени много воды утекло, сейчас установка движка Yii2 производится иначе.

Все действия производятся в Windows 10 x64.

Open Server

У меня локальный сервер находится в каталоге C:\OpenServer.

Сайт на Yii2 будет в каталоге C:\OpenServer\domains\yii2.loc.

Рекомендую использовать Open Server в редакции «premium», которая сразу включает Git for Windows, чтобы не устанавливать его отдельно.

На момент написания статьи актуальная версия Open Server — это 5.2.5. В настройках выбираем Ngnix 1.10, PHP 5.6-x64, MySQL 5.6-x64:

Open Server 5.2.5, в настройках выбираем Nginx 1.10, PHP 5.6-x64, MySQL 5.6-x64

Запускаем Open Server от имени администратора, открываем консоль:

Открываем консоль Open Server

Все команды, которые я дальше буду приводить необходимо выполнять именно в консоли Open Server.

Для начала убедимся, что Git работает:

git

Если получили в ответ справку, значит всё в порядке. Это важно, т.к. при установке движка Yii2 и его расширений Git используется.

Установка Yii2

Проще всего использовать для этого Cоmposer. Почитать на русском про него можно здесь и здесь. Если коротко, то это менеджер пакетов, написанных на PHP. Мы просто даём этому приложению команду, что нам требуется какой-то пакет. Он сам его скачивает и подключает! Более того, если этому пакету для работы требуются дополнительные пакеты, то он их тоже установит. В общем очень рекомендую. Освоиться с Composer совсем не сложно.

Сначала Composer надо установить в Open Server. Сделать это можно в каталог C:\OpenServer. Если требуется, перейдите в этот каталог:

cd c:\openserver

Для установки выполните поочередно следующие команды:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === 'e115a8dc7871f15d853148a7fbac7da27d6c0030b848d9b3dc09e2a0388afed865e6a3d6b3c0fad45c48e2b5fc1196ae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Первая скачивает инсталлятор Composer, вторая проверяет его, третья производит установку, последняя удаляет уже не нужный файл.

Получаем:

Downloading 1.2.0...
Composer successfully installed to: C:\OpenServer\composer.phar

Дополнительно для Composer устанавливаем плагин:

composer global require "fxp/composer-asset-plugin:~1.1.1"

Он тоже сообщает об успешном скачивании и т.д. Теперь можно устанавливать сам Yii2.

Разработчики Yii2 предлагают устанавливать движок, выбирая модификацию, содержащую по умолчанию один из двух шаблонов — basic или advanced. Последний больше подходит для традиционных сайтов, имеющих админку. В нём, как бы, два сайта в одном — frontend (сайт для всех) и backend (сайт-админка). Эти сайты имеют общие и раздельные настройки, общие и раздельные элементы и т.д. Это очень удобно и полезно.

Шаблон basic — это просто один сайт. Здесь нет понятия frontend и backend. Сайт для всего — общий. Кто-то потом сам может добавить в него админку, но я не вижу в этом смысла. Зачем? Если админка нужна, то проще сразу выбрать Yii2 с advanced-шаблоном.

В освоении версия advanced не сложнее! Разница минимальна. Это всего лишь вопрос удобства дальнейшей разработки. Базовый шаблон будет основой для вашего будущего сайта. Лучше сразу подумать немного вперед и сделать правильный выбор.

Переходим в каталог сайта и устанавливаем Yii2 с advanced-шаблоном:

cd domains\yii2.loc
composer create-project yiisoft/yii2-app-advanced ./ 2.0.9

Процесс установки Yii2 занимает порядка 3-5 минут. Скачиваются нужные пакеты, распаковываются, раскладываются в нужные каталоги. Всё происходит автоматически.

В процессе установки потребуется указать OAuth Token для GitHub, если таковой не был указан ранее. Он запоминается в системе и поэтому делается это один раз. Токен открывает доступ для автоматизированной загрузки с GitHub некоторых пакетов, необходимых Yii2.

Если у вас ещё нет аккаунта на GitHub, то регистрируйтесь. Сервис предоставляет вариант бесплатного использования, выбирайте его. Бесплатно — это публичное размещение исходников. Приватное размещение на GitHub только за деньги.

По сути, то и другое сейчас нам вообще не нужно. Мы просто регистрируемся, авторизуемся, и идём создаём токен.

В процессе установки запрос токена происходят в таком виде:

please create a GitHub OAuth token to go over the API rate limit
Head to https://github.com/settings/tokens/new?scopes=repo&description=Composer+for+Open+Server
to retrieve a token. It will be stored in "C:/Users/kodmg/AppData/Roaming/Composer/auth.json" for future use by Composer.
Token (hidden):
Token stored successfully.

Т.е. нам даже дают ссылку по которой надо пойти, чтобы создать токен. Сгенерированный токен копируем и вставляем в консоль, его будет не видно (пример выше). Просто вставили, жмём «Enter» и установка идёт дальше.

Установка Yii2 завершена:

Установка Yii2 завершена

Перед тем, как начать пользоваться нужно произвести инициализацию, в каталоге сайта выполняем:

init

Выбираем «Development» (разработка), подтверждаем «yes», готово:

$ init
Yii Application Initialization Tool v1.0

Which environment do you want the application to be initialized in?

  [0] Development
  [1] Production

  Your choice [0-1, or "q" to quit] 0

  Initialize the application under 'Development' environment? [yes|no] yes

  Start initialization ...

   generate backend/config/main-local.php
   generate backend/config/params-local.php
   ...
   generate yii
   generate cookie validation key in backend/config/main-local.php
   generate cookie validation key in frontend/config/main-local.php
      chmod 0777 backend/runtime
      chmod 0777 backend/web/assets
      chmod 0777 frontend/runtime
      chmod 0777 frontend/web/assets
      chmod 0755 yii
      chmod 0755 tests/codeception/bin/yii

  ... initialization completed.

Смысл инициализации состоит в первоначальной подготовке некоторых ключевых файлов, каталогов и настроек сайта. Мы выбираем вариант «Development» и нам дополнительно подключается, например, дебагер, встроенный в Yii2. Потом, когда разработка сайта будет завершена, то его можно будет отключить в настройках.

Повторно выполнять команду инициализации потом нельзя, она все файлы настроек выставляет в вид по умолчанию. Команда используется именно на начальном этапе, когда ещё ничего нет.

Заходите на сайт, используя ссылку yii2.loc/frontend/web

Админская часть находится здесь yii2.loc/backend/web

Чтобы войти в админку, нужно вначале зарегистрироваться на сайте, а для этого вначале создать базу данных.

База

Через phpMyAdmin создаём базу для сайта. Например «db_yii2», кодировку при этом выбираем «utf8_general_ci».

Редактируем файл настроек сайта common/config/main-local.php

<?php
return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=db_yii2',
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@common/mail',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => true,
        ],
    ],
];

Здесь прописываете имя базы, имя пользователя базы, пароль (если есть).

Теперь в консоли выполняем миграцию:

yii migrate

Будет найден единственный файл миграции, который ещё не применялся, подтверждаем его применение.

$ yii migrate
Yii Migration Tool (based on Yii v2.0.9)

Creating migration history table "migration"...Done.
Total 1 new migration to be applied:
        m130524_201442_init

Apply the above migration? (yes|no) [no]:yes
*** applying m130524_201442_init
    > create table {{%user}} ... done (time: 0.060s)
*** applied m130524_201442_init (time: 0.075s)

1 migration was applied.

Migrated up successfully.

В базе появятся две таблицы. Теперь на сайте можно регистрироваться.

Nginx

Чтобы указанные ссылки привести к виду yii2.loc и yii2.loc/backend, соответственно, необходимо настроить Nginx.

В Open Server это делается так. В зависимости от выбранной версии Nginx в модулях в панели настроек, мы берём файл конфигурации из каталога C:\OpenServer\userdata\config\ и копируем в каталог сайта C:\OpenServer\domains\yii2.loc\.

У меня Nginx 1.10, поэтому я копирую файл Nginx-1.10_vhost.conf

Теперь, всё, что мы настроим в этом файле, будет распространятся на Nginx только для этого сайта. Это очень удобно! Весь сайты могут быть разные, на разных движках. Каждому обычно нужны свои настройки.

Нужно перезапустить Open Server, чтобы настройки сработали.

Мой вариант конфигурации (не оптимально):

#-----------------------------------------------#
# Начало блока конфигурации хоста
#-----------------------------------------------#

server {
    listen         %ip%:%httpport%;
    listen         %ip%:%httpsport% ssl;
    server_name    %host% %aliases%;
    index index.php;
    
    ssl_certificate               "%sprogdir%/userdata/config/server.crt";
    ssl_certificate_key           "%sprogdir%/userdata/config/server.key";
    
    #add_header Strict-Transport-Security "max-age=94608000; includeSubDomains; preload";
    
    # if ($request_method !~* ^(GET|HEAD|POST)$ ){return 403;}
    location ~ /\. {deny all;}

    location ^~ /backend {
        rewrite ^/backend(.*)$ /backend/web$1 last;
    }
 
    location ^~ /backend/web {
        root "%hostdir%";
        
        location ~ \.php$ {
            try_files                          $uri =404;
            # if (!-e $document_root$document_uri){return 404;}
            fastcgi_pass                       backend;
            fastcgi_index                      index.php;
            fastcgi_buffers                    4 64k;
            fastcgi_connect_timeout            1s;
            fastcgi_ignore_client_abort        off;
            fastcgi_next_upstream              timeout;
            fastcgi_read_timeout               5m;
            fastcgi_send_timeout               5m;
            fastcgi_param    CONTENT_TYPE      $content_type;
            fastcgi_param    CONTENT_LENGTH    $content_length;
            fastcgi_param    DOCUMENT_URI      $document_uri;
            fastcgi_param    DOCUMENT_ROOT     $document_root;
            fastcgi_param    GATEWAY_INTERFACE CGI/1.1;
            fastcgi_param    HTTPS             $https;
            fastcgi_param    QUERY_STRING      $query_string;
            fastcgi_param    REQUEST_METHOD    $request_method;
            fastcgi_param    REQUEST_URI       $request_uri;
            fastcgi_param    REMOTE_ADDR       $remote_addr;
            fastcgi_param    REMOTE_PORT       $remote_port;
            fastcgi_param    SERVER_ADDR       $server_addr;
            fastcgi_param    SERVER_PORT       $server_port;
            fastcgi_param    SERVER_NAME       $host;
            fastcgi_param    SERVER_PROTOCOL   $server_protocol;
            fastcgi_param    SERVER_SOFTWARE   nginx;
            fastcgi_param    SCRIPT_FILENAME   $document_root$fastcgi_script_name;
            fastcgi_param    SCRIPT_NAME       $fastcgi_script_name;
            fastcgi_param    TMP               "%sprogdir%/userdata/temp";
            fastcgi_param    TMPDIR            "%sprogdir%/userdata/temp";
            fastcgi_param    TEMP              "%sprogdir%/userdata/temp";
        }
    }
    
    location / {
        root       "%hostdir%/frontend/web";
        try_files $uri $uri/ /index.php$is_args$args;

        location ~ \.php$ {
            try_files                          $uri =404;
            # if (!-e $document_root$document_uri){return 404;}
            fastcgi_pass                       backend;
            fastcgi_index                      index.php;
            fastcgi_buffers                    4 64k;
            fastcgi_connect_timeout            1s;
            fastcgi_ignore_client_abort        off;
            fastcgi_next_upstream              timeout;
            fastcgi_read_timeout               5m;
            fastcgi_send_timeout               5m;
            fastcgi_param    CONTENT_TYPE      $content_type;
            fastcgi_param    CONTENT_LENGTH    $content_length;
            fastcgi_param    DOCUMENT_URI      $document_uri;
            fastcgi_param    DOCUMENT_ROOT     $document_root;
            fastcgi_param    GATEWAY_INTERFACE CGI/1.1;
            fastcgi_param    HTTPS             $https;
            fastcgi_param    QUERY_STRING      $query_string;
            fastcgi_param    REQUEST_METHOD    $request_method;
            fastcgi_param    REQUEST_URI       $request_uri;
            fastcgi_param    REMOTE_ADDR       $remote_addr;
            fastcgi_param    REMOTE_PORT       $remote_port;
            fastcgi_param    SERVER_ADDR       $server_addr;
            fastcgi_param    SERVER_PORT       $server_port;
            fastcgi_param    SERVER_NAME       $host;
            fastcgi_param    SERVER_PROTOCOL   $server_protocol;
            fastcgi_param    SERVER_SOFTWARE   nginx;
            fastcgi_param    SCRIPT_FILENAME   $document_root$fastcgi_script_name;
            fastcgi_param    SCRIPT_NAME       $fastcgi_script_name;
            fastcgi_param    TMP               "%sprogdir%/userdata/temp";
            fastcgi_param    TMPDIR            "%sprogdir%/userdata/temp";
            fastcgi_param    TEMP              "%sprogdir%/userdata/temp";
        }
    }

    # Подключение веб-инструментов
    #---------------------------------------#
    # <Не изменяйте этот блок конфигурации>
    location /openserver/ {
        root     "%sprogdir%/modules/system/html";
        index    index.php;
        %allow%allow    all;
        allow    127.0.0.0/8;
        allow    ::1/128;
        allow    %ips%;
        deny     all;
        location /openserver/server-status {
            stub_status on;
        }
        location ~ ^/openserver/.*\.php$ {
            root                               "%sprogdir%/modules/system/html";
            fastcgi_pass                       backend;
            fastcgi_index                      index.php;
            fastcgi_buffers                    4 64k;
            fastcgi_connect_timeout            1s;
            fastcgi_ignore_client_abort        off;
            fastcgi_next_upstream              timeout;
            fastcgi_read_timeout               5m;
            fastcgi_send_timeout               5m;
            fastcgi_param    CONTENT_TYPE      $content_type;
            fastcgi_param    CONTENT_LENGTH    $content_length;
            fastcgi_param    DOCUMENT_URI      $document_uri;
            fastcgi_param    DOCUMENT_ROOT     $document_root;
            fastcgi_param    GATEWAY_INTERFACE CGI/1.1;
            fastcgi_param    HTTPS             $https;
            fastcgi_param    QUERY_STRING      $query_string;
            fastcgi_param    REQUEST_METHOD    $request_method;
            fastcgi_param    REQUEST_URI       $request_uri;
            fastcgi_param    REMOTE_ADDR       $remote_addr;
            fastcgi_param    REMOTE_PORT       $remote_port;
            fastcgi_param    SERVER_ADDR       $server_addr;
            fastcgi_param    SERVER_PORT       $server_port;
            fastcgi_param    SERVER_NAME       $host;
            fastcgi_param    SERVER_PROTOCOL   $server_protocol;
            fastcgi_param    SERVER_SOFTWARE   nginx;
            fastcgi_param    SCRIPT_FILENAME   $document_root$fastcgi_script_name;
            fastcgi_param    SCRIPT_NAME       $fastcgi_script_name;
            fastcgi_param    TMP               "%sprogdir%/userdata/temp";
            fastcgi_param    TMPDIR            "%sprogdir%/userdata/temp";
            fastcgi_param    TEMP              "%sprogdir%/userdata/temp";
        }
    }
    # <Не изменяйте этот блок конфигурации/>
    #---------------------------------------#
}

#-----------------------------------------------#
# Конец блока конфигурации хоста
#-----------------------------------------------#