Подробное пошаговое руководство по установке Yii2

Здравствуйте! Больше года не использовал PHP и не интересовался новинками веб-программирования.
Я уже как-то писал о своём опыте с фреймворком Yii. Тогда для того, чтобы развернуть фреймворк и сделать простенький веб-сайтик у меня ушло 80 часов. Но мир не стоит на месте и уже год как во всю используется Yii2. При необходимости реализовать очередной простенький проект, я решил обратиться именно к этому фреймворку. Но возникли некоторые трудности — Yii2 не устанавливается на имеющийся Denwer в стандартной поставке. Итак, эта статья пошагово поможет преодолеть эти трудности и позволит запустить Yii2 на Денвере (Denwer).
Что у меня есть: Денвер на локальной машине, на нём я веду разработку проекта и дешевый PHP 5.4 хостинг, на котором я публикую свой проект.
Что я хочу: Без установки composer и каких-либо других внешних инструментов установить сборку Yii2 base или advanced на Denwer.
Установка PHP 5.4. на Denwer
В качестве основы я взял имеющийся у меня Denwer3_Base_2013-06-02_a2.2.22_p5.3.13_m5.5.25_pma3.5.1_xdebug.exe. На момент написания статьи релиз может быть новее. Текущей комплект на официальном сайте Denwer Apache 2.2.22 + SSL, PHP 5.3.13 + XDebug, MySQL 5.5, phpMyAdmin 3.5, многопроектность, работа с Flash-накопителем. Известно, что Yii2 минимально требует PHP 5.4., по этой причине еще до скачивания yii2 обновим версию PHP Денвера. Обновление PHP Денвера до версии 5.4 задача весьма тривиальная. Пошагово:
- Скачиваем потокобезопасную (thread safe) сборку php 5.4. для win x86, в моём случае это была php-5.4.45-Win32-VC9-x86.zip.
- Сохраняем в отдельной папке php.ini из папки Денвера (w:\usr\local\php5\) и очищаем папку удаляя все файлы. (Сохранять php.ini не обязательно, но нужно на случай если вы добавляли в PHP расширения чтобы вы всегда смогли восстановить настройки и сэкономить кучу времени на правку конфига php.ini)
- Распаковываем архив php-5.4.45-Win32-VC9-x86.zip в папку Денвера (w:\usr\local\php5\).
- Переименовываем (w:\usr\local\php5\) php.ini-development в php.ini. Я использую именно php.ini-development потому что Денвер у меня служит для разработки и отладки, а не в качестве релизной площадки.
- Запускаем Денвер. Открываем в браузере страницу с phpinfo();
Убеждаемся что PHP работает.
Если не работает, еще раз проверьте php.ini, используйте именно стандартную версию. Останавливаем Денвер.
- Настраиваем файл php.ini. Я это делал путем сравнения по содержимому нового файла полученного путём переименования php.ini-development в php.ini и старого сохранённого php.ini. Сравнение по содержимому делал стандартными средствами Total Commander 8.0 (Files->Compare by content). Таким образом, мне удалось быстро перенести необходимые настройки и подключенные модули в новую версию PHP.
Правки php.ini приведу в формате строка – было – стало.721 было ; extension_dir = "ext" стало extension_dir = "/usr/local/php5/ext" 787 было ;upload_tmp_dir = стало upload_tmp_dir = /tmp 858 было ;extension=php_bz2.dll ;extension=php_curl.dll ;extension=php_fileinfo.dll ;extension=php_gd2.dll ;extension=php_gettext.dll ;extension=php_gmp.dll ;extension=php_intl.dll ;extension=php_imap.dll ;extension=php_interbase.dll ;extension=php_ldap.dll ;extension=php_mbstring.dll ;extension=php_exif.dll ; Must be after mbstring as it depends on it ;extension=php_mysql.dll ;extension=php_mysqli.dll ;extension=php_oci8.dll ; Use with Oracle 10gR2 Instant Client ;extension=php_oci8_11g.dll ; Use with Oracle 11gR2 Instant Client ;extension=php_openssl.dll ;extension=php_pdo_firebird.dll ;extension=php_pdo_mysql.dll ;extension=php_pdo_oci.dll ;extension=php_pdo_odbc.dll ;extension=php_pdo_pgsql.dll ;extension=php_pdo_sqlite.dll ;extension=php_pgsql.dll ;extension=php_pspell.dll ;extension=php_shmop.dll ; The MIBS data available in the PHP distribution must be installed. ; See http://www.php.net/manual/en/snmp.installation.php ;extension=php_snmp.dll ;extension=php_soap.dll ;extension=php_sockets.dll ;extension=php_sqlite3.dll ;extension=php_sybase_ct.dll ;extension=php_tidy.dll ;extension=php_xmlrpc.dll ;extension=php_xsl.dll стало ;extension=php_bz2.dll extension=php_curl.dll ;extension=php_fileinfo.dll; Need for Yii2 extension=php_gd2.dll ;extension=php_gettext.dll ;extension=php_gmp.dll ;extension=php_intl.dll; Need for Yii2 ;extension=php_imap.dll ;extension=php_interbase.dll ;extension=php_ldap.dll extension=php_mbstring.dll ;extension=php_exif.dll ; Must be after mbstring as it depends on it extension=php_mysql.dll extension=php_mysqli.dll ;extension=php_oci8.dll ; Use with Oracle 10gR2 Instant Client ;extension=php_oci8_11g.dll ; Use with Oracle 11gR2 Instant Client ;extension=php_openssl.dll; Need for Yii2 ;extension=php_pdo_firebird.dll ;extension=php_pdo_mysql.dll ;extension=php_pdo_oci.dll ;extension=php_pdo_odbc.dll ;extension=php_pdo_pgsql.dll ;extension=php_pdo_sqlite.dll ;extension=php_pgsql.dll ;extension=php_pspell.dll ;extension=php_shmop.dll ; The MIBS data available in the PHP distribution must be installed. ; See http://www.php.net/manual/en/snmp.installation.php ;extension=php_snmp.dll ;extension=php_soap.dll ;extension=php_sockets.dll ;extension=php_sqlite3.dll ;extension=php_sybase_ct.dll ;extension=php_tidy.dll ;extension=php_xmlrpc.dll extension=php_xsl.dll 909 было ;date.timezone = стало date.timezone = Europe/Moscow 987 было [mail function] ; For Win32 only. ; http://php.net/smtp SMTP = localhost ; http://php.net/smtp-port smtp_port = 25 ; For Win32 only. ; http://php.net/sendmail-from ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path ;sendmail_path = стало [mail function] ; For Win32 only. ; http://php.net/smtp ;SMTP = localhost ; http://php.net/smtp-port ;smtp_port = 25 ; For Win32 only. ; http://php.net/sendmail-from sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path sendmail_path = \usr\sbin\sendmail -t -i 1386 было ;session.save_path = "/tmp" стало session.save_path = "/tmp"
Или скачайте мой php.ini файл содержащий доп. модификации, в т.ч. и раскоментированные модули для Yii2, которые не были раскоментированы в примере выше, они помечены Need for Yii2.
PHP 5.4. установлен, переходим к установке Yii2.
Upd 2015.12.06: Поигравшись почти месяц с Yii2 убедился в том, что composer для работы с ним вещь практически незаменимая. Настоятельно рекомендую установить его, информация в конце данной статьи. В главе настройка модулей PHP, запуск инициализации Yii2 рассказывается про необходимые компоненты и способы разворачивания из архива, что достаточно для начала, но я рекомендую разобраться с composer и все последующие установки осуществлять через него.
Настройка модулей PHP, запуск инициализации Yii2
Для начала я скачал архив Yii2 с официального веб-сайта. В моём случае это был архив yii-advanced-app-2.0.6.tgz.
Я уже проходил установку yii1 руками на Денвер под Windows. С учётом прошлого опыта, на разворачивание Yii2 у меня ушло не более 4х часов. А с помощью этой инструкции это можно сделать и менее чем за 1 час.
- Распаковываем архив в папку w:\home\localhost\www\yii2.
Если вы скачали мой php.ini, то можете после разархивации сразу переходить к следующему пункту.
В браузере по адресу http://localhost/yii2/requirements.php должна появиться картинка.
Которая в принципе сообщает о том, что конфигурация сервера удовлетворяет минимальным требованиям и Yii2 может работать. Но на практике это не совсем так, если вы попытаетесь выполнить команду инициализации в консоль вывалится ошибка
The OpenSSL PHP extension is required by Yii2
и Yii2 не будет развернут. На самом деле, практически все желтые строки диагностики requirements.php исправляются раскоментированием или на крайний случай установкой соответствующего модуля PHP. Путём раскоментирования нескольких расширений в php.ini помеченных Need for Yii2 мне удалось добиться практически полного “зеленого света” за исключением баз данных и оптимизационных вещей, которые пока мне не нужны.
- Поскольку bat файлы в случае Денвера не работают, как это было при установке Yii 1.1. я написал команду init вручную.
Заходим в командную строку Windows. Не забудьте только перевести указатель диска на диск Денвера, это можно сделать командой w: (если диск Денвера w). В результате перевода в консоли должно появиться приглашение W:\>.
Выполните командуw:\usr\local\php5\php.exe w:\home\localhost\www\yii2\init
Консоль должна выдать вам меню, если не выдала, еще раз перепроверьте шаги описанные выше.
Я скопировал не только выдачу меню, но и свои ответы.
W:\>w:\usr\local\php5\php.exe w:\home\localhost\www\yii2\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 backend/web/index-test.php generate backend/web/index.php generate common/config/main-local.php generate common/config/params-local.php generate console/config/main-local.php generate console/config/params-local.php generate frontend/config/main-local.php generate frontend/config/params-local.php generate frontend/web/index-test.php generate frontend/web/index.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.Если вы увидели тоже самое, поздравляю! Это значит что по ссылке http://localhost/yii2/frontend/web/index.php вас ждёт готовая для работы система Yii2.
Фактически на этом можно закончить статью. Надеюсь, она полностью прозрачно и даже для самых маленьких объяснила что делать и как поставить Yii2 на Денвер.
Но мне текущей установки недостаточно! Я хочу больше:
- Хочу нормальный адрес стартовой страницы
- Хочу нормальную систему путей
- Хочу разобраться с отключением Yii Debugger
Действия после инициализации Yii2
Первое, что я всегда делаю с любым фреймворком — правильно раскладываю его по папочкам и параллельно решаю вопросы ЧПУ (Человеко-понятный URL).
Для этого я завел условный хост проекта. Для этого создал хост в Денвере путем заведения дополнительной папки в W:\Webservers\home\. Пусть хост будет называться yii2site. Воссоздал необходимую структуру каталогов, subdomain, www.
Поместил фреймфорк в yii2site\www\yii2 не забыв прикрыть deny from all в .htaccess. Выполнил разворачивание фреймворка командой init, как это было подробно описано выше.
Далее я начал раскладывать получившиеся папки в привычном для меня стиле. Изначально я хотел вытащить в корневую директорию yii2site\www\ папки backend, frontend, console. Но столкнулся с большим количеством трудностей, которые пока не знаю как решить. Почитав слегка документацию, поиграв с basic, я понял что принял правильное решение выбрав advanced, поскольку у него уже разделена логика админки и пользовательской части. Также смирился с предлагаемой Yii2 структурой каталогов и вытащил в корневую директорию yii2site\www\ содержимое yii2site\www\yii2\frontend\web не забыв прописать новые относительные пути в index.php и index-test.php. Не очень приятное чувство кода разрабатываемые компоненты вынуждены лежать в папке фреймворка. Я бы хотел вытащить в корневую директорию yii2site\www\ папки frontend, backend и console. Ну да ладно, это не в приоритете. Буду рад комментариям о том, кто и как предпочитает строить структуру каталогов в проектах на Yii2.
Настройка ЧПУ очень похожа на Yii1.1. Мой .htaccess файл из прошлого проекта даже настроен чуть более продуманно. Возьму его за основу и помещу в yii2site\www\.
#Указываем кодировку
AddDefaultCharset utf-8
RewriteEngine on
# не позволять httpd отдавать файлы, начинающиеся с точки (.htaccess, .svn, .git и прочие)
RedirectMatch 403 /\..*$
# если директория или файл существуют, использовать их напрямую
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# иначе отправлять запрос на файл index.php
RewriteRule . index.php
Для того, чтобы Yii2 начал работать с красивыми путями, необходимо активировать компонент UrlManager. Это делается путём вставки в конфиг yii2site\www\yii2\frontend\config\main.php кода
...
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
],
...
UrlManager работает, для этого достаточно пройтись по меню развернутого веб-сайта http://yii2site. Теперь пути будут отражены в формате
...
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules'=> [
'' => 'site/index',
'/'=>'site/', //Yo, Petukhovsky is become yii2 master (selfsarcasm)
],
],
...
Больше ничего редактировать не нужно, компоненты генерации ссылок в меню, автоматически перестроятся под настройки UrlManager и будут генерировать короткие ссылки формата yii2site/about, yii2site/contact и т.д.
Последним штрихом будет отключение Yii debugger в production. Это делается очень просто. В файле index.php есть константы.
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
YII_DEBUG может принимать значения true/fasle отвечает за включение/выключение режима отладки. Включенный режим отладки позволяет собирать больше информации в лог-файлы, а также покажет детальный стек ошибки в случае падения приложения.
YII_ENV — указывает в какой среде (окружении) запущено приложение “prod”, “dev” или “test”. Фактически, в зависимости от значения устанавливается в true значение одной из трех соответствующих констант YII_ENV_PROD, YII_ENV_DEV или YII_ENV_TEST. В зависимости от среды могут подключаться или отключаться различные модули.
Обнаружил странную логику, по умолчанию, панель дебага Yii Debugger включена во все среды, кроме test. См. файл yii2site\www\yii2\frontend\config\main-local.php
…
if (!YII_ENV_TEST) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = 'yii\debug\Module';
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = 'yii\gii\Module';
}
…
я выключу debug\Module и gii\Module также и в среде “prod” (YII_ENV_PROD).
…
if (!YII_ENV_TEST && !YII_ENV_PROD) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = 'yii\debug\Module';
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = 'yii\gii\Module';
}
…
Соответственно, остаётся указать в файлу index.php соответствующие данные
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'prod');
Всё. Теперь наш Yii2 advanced красив, аккуратен, работает с короткими ссылками и на сайте сокрыта вся отладочная информация. Спасибо за прочтение, надеюсь, мой конспект окажется для вас полезен!
Upd 2015.12.06: Поигравшись почти месяц с Yii2 убедился в том, что composer для работы с ним вещь практически незаменимая. Настоятельно рекомендую установить его. Краткая инструкция прилагается.
Composer для Денвер
Composer это инструмент основанный на PHP позволяющий при установке фреймворка и библиотек написанных на PHP определять версии и накатывать соответствующие обновленные или связанные библиотеки. По-правильному composer – это пакетный менеджер для PHP.
При попытке установить его на Денвер, возникает достаточно много ошибок не позволяющих завершить его установку.
PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_curl.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_gd2.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_interbase.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_mbstring.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_mysql.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_mysqli.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_openssl.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_pdo_mysql.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_pdo_pgsql.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_pdo_sqlite.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_pgsql.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_soap.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_sqlite3.dll' PHP Startup: Unable to load dynamic library '/usr/local/php5/ext/php_xsl.dll'
Даже если при установке выбирать php на диске W:, проблема не лечится. Всё дело в файле w:\usr\local\php5\php.ini.
; On windows: ; extension_dir = "/usr/local/php5/ext" неправильно extension_dir = "w:\usr\local\php5\ext"
Добавляем правильный путь в переменную extension_dir. Сейчас и далее указываем для composer путь к php w:\usr\local\php5\php.exe, и соответственно запускаем Денвер при установке composer и помним что Денвер всегда должен быть запущен когда мы используем composer.
Обращаю внимание на то, что composer может также ругаться на отсутствие OpenSSL и других библиотек, но вы избежите этих проблем, если последовательно выполните все шаги по обновлению конфига и установке актуальной версии PHP (см. раздел Установка PHP 5.4. на Denwer данной статьи).
Но и это еще не всё. Yii захочет чтобы перед установкой фреймворка вы обновили модуль fxp.
composer global require "fxp/composer-asset-plugin:1.1.1"
Команда может не сработать поскольку по умолчанию у папки (\AppData\Local\Composer) куда был установлен composer стоит разрешение только на чтение. Нужно выставить права на запись в меню правой клавиши -> свойства -> общие -> только для чтения (снять галочку).
Но и даже это еще не все. Думаете что теперь вы запустите команду
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
и всё заработает?
Это не совсем так, в процессе разворачивания проекта из удаленного репозитория composer запросит Github token, чтобы его получить необходимо зарегестрироваться на GitHub и получить токен на странице personal access tokens. Надеюсь что это было нетрудно.
Теперь composer готов для работы с Yii2.