Несколько лет назад я уже писал про это, но с того времени много воды утекло, сейчас установка движка 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 от имени администратора, открываем консоль:
Все команды, которые я дальше буду приводить необходимо выполнять именно в консоли 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 завершена:
Перед тем, как начать пользоваться нужно произвести инициализацию, в каталоге сайта выполняем:
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";
}
}
# <Не изменяйте этот блок конфигурации/>
#---------------------------------------#
}
#-----------------------------------------------#
# Конец блока конфигурации хоста
#-----------------------------------------------#