Установка Yii2 на Denwer

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

yii2framework-logo

Здравствуйте! Больше года не использовал 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 задача весьма тривиальная. Пошагово:

  1. Скачиваем потокобезопасную (thread safe) сборку php 5.4. для win x86, в моём случае это была php-5.4.45-Win32-VC9-x86.zip.
  2. Сохраняем в отдельной папке php.ini из папки Денвера (w:\usr\local\php5\) и очищаем папку удаляя все файлы. (Сохранять php.ini не обязательно, но нужно на случай если вы добавляли в PHP расширения чтобы вы всегда смогли восстановить настройки и сэкономить кучу времени на правку конфига php.ini)
  3. Распаковываем архив php-5.4.45-Win32-VC9-x86.zip в папку Денвера (w:\usr\local\php5\).
  4. Переименовываем (w:\usr\local\php5\) php.ini-development в php.ini. Я использую именно php.ini-development потому что Денвер у меня служит для разработки и отладки, а не в качестве релизной площадки.
  5. Запускаем Денвер. Открываем в браузере страницу с phpinfo();
    Убеждаемся что PHP работает.

    PHP5.4

    Если не работает, еще раз проверьте php.ini, используйте именно стандартную версию. Останавливаем Денвер.

  6. Настраиваем файл 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 час.

  1. Распаковываем архив в папку w:\home\localhost\www\yii2.
    Если вы скачали мой php.ini, то можете после разархивации сразу переходить к следующему пункту.
    В браузере по адресу http://localhost/yii2/requirements.php должна появиться картинка.

    yii2-first-look

    Которая в принципе сообщает о том, что конфигурация сервера удовлетворяет минимальным требованиям и Yii2 может работать. Но на практике это не совсем так, если вы попытаетесь выполнить команду инициализации в консоль вывалится ошибка

     The OpenSSL PHP extension is required by Yii2 
    

    и Yii2 не будет развернут. На самом деле, практически все желтые строки диагностики requirements.php исправляются раскоментированием или на крайний случай установкой соответствующего модуля PHP. Путём раскоментирования нескольких расширений в php.ini помеченных Need for Yii2 мне удалось добиться практически полного «зеленого света» за исключением баз данных и оптимизационных вещей, которые пока мне не нужны.

  2. Поскольку 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-started

Фактически на этом можно закончить статью. Надеюсь, она полностью прозрачно и даже для самых маленьких объяснила что делать и как поставить 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. Теперь пути будут отражены в формате /. В нашем случае всем веб-сайтом управляет один контроллер, который отвечает за выбор и выдачу страниц. Он называется SiteController или сокращенно site, поэтому все пути на сайте отображаются как yii2site/site/about, yii2site/site/contact и т.д. что мне кажется длинным, поэтому я добавлю несколько правил в инициализацию UrlManager. Теперь код его инициализации в конфиге будет выглядеть следующим образом.

...
        '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.