Статьи

Развертывание приложений CakePHP в AppFog на правильном пути

Эта статья опубликована на одном из наших родственных сайтов CloudSpring . Если вы найдете это полезным, обязательно посетите их!

В этой статье рассматриваются две темы: развертывание приложения в облачном провайдере AppFog и рекомендации для хорошо структурированного PHP-приложения.

Сначала мы создадим простое приложение для создания заметок, используя CakePHP и его автоматическую команду выпечки. Затем я покажу вам один из способов структурировать приложение, разделяя его компоненты на:

  • код приложения
  • данные приложения и настройки
  • код библиотеки и поставщика

Приложение будет наконец зарегистрировано и опубликовано в AppFog.

Зарегистрируйтесь с AppFog

AppFog — это поставщик платформы как услуги (PaaS), созданный на основе проекта Cloud Foundry с открытым исходным кодом. Он обеспечивает поддержку нескольких языков программирования и позволяет нам развертывать приложения для нескольких поставщиков инфраструктуры, таких как Amazon AWS, HP Openstack, Microsoft Azure и Rackspace DFW.

Зарегистрироваться в AppFog очень просто; все, что вам нужно, это адрес электронной почты и пароль, и у вас есть доступ к их бесплатному тарифному плану, который предлагает 2 ГБ ОЗУ, 10 служб (например, базы данных) объемом до 100 МБ каждая и лимит передачи данных 50 ГБ. Это много для бесплатного сервиса! Также, как говорится, вы можете переместить свое приложение в любую службу, совместимую с Cloud Foundry.

Создайте бесплатную учетную запись AppFog , и тогда мы продолжим.

Создать локальное приложение

Загрузите последнюю версию CakePHP и распакуйте ее на свой компьютер для разработки, а затем переименуйте в приложение (я выбираю FogNotes). Сделайте этот каталог видимым для вашего веб-сервера с помощью дружественного URL-адреса (например, http: //fognotes.local), корнем документа должен быть каталог app/webroot и создайте пустую базу данных MySQL (например, fognotes_local ).

В вашем браузере вы должны увидеть домашнюю страницу по умолчанию, предоставленную CakePHP. Не беспокойтесь о предупреждениях — мы скоро позаботимся о них.

Теперь создайте каталог с именем data и двумя подкаталогами в нем с именем config и logs . Скопируйте (или переместите) каталог app/tmp внутри data и сделайте его и каталог logs доступным для записи на веб-сервере. В качестве последнего штриха создайте псевдоним команды CakePHP для консоли команды в корневом каталоге вашего приложения.

  ~ / FogNotes $ ln -s lib / Cake / Console / cake cake 

Ваша структура каталогов должна выглядеть так:

  FogNotes /
     приложение/
     данные/
         конфиг /
         журналы /
         TMP /
             кэш /
             журналы /
             сессий /
             Тесты /
     Библиотека /
         Торт/
     плагины /
     поставщики /
     торт
     index.php 

Сделав это, мы отделили конкретный код app ( app ) от фреймворка ( lib/Cake ) и библиотек ( plugins и vendors ). Кроме того, данные и настройки приложения находятся в одном отдельном месте ( data/* ). Теперь мы можем теперь мы можем обновлять, резервировать и поддерживать каждый из компонентов в отдельности. Это очень желательно в реальном приложении!

Имея структуру каталогов, давайте скажем CakePHP использовать ее. Мы должны установить пользовательский временный каталог, поэтому отредактируйте app/webroot/index.php и вставьте этот код сразу после оператора define('ROOT',...) :

 <?php // Custom TMP directory if (!defined('TMP')) { define('TMP', ROOT . DS . 'data' . DS . 'tmp' . DS); } 

Теперь для базы данных. Обычно параметры подключения к базе данных хранятся в каталоге app/Config в файле с именем database.php . Мы изменим этот параметр, чтобы инфраструктура искала в каталоге data/config файл, имя которого соответствует названию нашей текущей среды (например, data/config/local.php ).

Скопируйте файл app/Config/database.php .default в app/Config/database.php и замените класс DATABASE_CONFIG следующим кодом:

 <?php class DATABASE_CONFIG { public $default = null; public $test = null; public $env = null; /** * Switch configuration based on environment */ function __construct() { // Check that a suitable environment is defined if (!defined('APP_ENV')) { return false; } $this->env = APP_ENV; // Try to read database settings from the current ENV file $config = Configure::read('Database.config'); if (!is_array($config)) { return false; } // Load all config database profiles foreach ($config as $name => $data) { $this->$name = $data; } // Throw an error if there is no suitable configuration if (empty($config['default']) || empty($this->default)) { return false; } } } 

Этот трюк был адаптирован из статьи, опубликованной в сообществе разработчиков CakePHP eimermusic. Среда будет определена с использованием файла начальной загрузки или чтения переменной среды, предоставленной AppFog, и соответствующий файл конфигурации будет загружен.

Файл app/Config/bootstrap.php является файлом запуска приложения. В нижней части файла после инструкции Configure::write('Dispatcher.filters'...) вставьте этот код, который регистрирует путь data/config с помощью CakePHP:

 <?php // Define a custom reader to search for config files App::uses('PhpReader', 'Configure'); Configure::config('default', new PhpReader(ROOT . DS . 'data' . DS . 'config' . DS)); // Determine the environment if ($env = getenv('APP_ENV')) { if (!defined('APP_ENV')) define('APP_ENV', $env); } else { if (!defined('APP_ENV')) define('APP_ENV', 'local'); } по <?php // Define a custom reader to search for config files App::uses('PhpReader', 'Configure'); Configure::config('default', new PhpReader(ROOT . DS . 'data' . DS . 'config' . DS)); // Determine the environment if ($env = getenv('APP_ENV')) { if (!defined('APP_ENV')) define('APP_ENV', $env); } else { if (!defined('APP_ENV')) define('APP_ENV', 'local'); } 

AppFog позволит нам установить переменную APP_ENV . Если он не установлен, то приложение считает себя в локальном режиме.

Теперь перейдите к концу файла и вставьте этот код:

 <?php try { Configure::load(APP_ENV); } catch (ConfigureException $e) { // do something, for example exit application } 

Оператор Configure::load() указывает CakePHP выполнить поиск в каталоге data/config файла с именем, подобным текущему окружению (например, local.php или prod.php ). В этом файле мы можем переопределить все настройки, определенные ранее приложением.

local.php файла конфигурации local.php может быть:

 <?php // Load base configuration. Any of the core settings can be // overridden here. Don't delete the $config var! $config = array( 'debug' => 1 ); // If declared in the $config array, String::UUID() crashes Configure::write('Security.salt', 'SomeSuperSecretLongString'); Configure::write('Security.cipherSeed', 'SomeSuperSecretLongNumber'); // Database settings Configure::write('Database.config', array( 'default' => array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'root', 'password' => 'secret_password', 'database' => 'fognotes_local', 'prefix' => '', 'encoding' => 'utf8', 'unix_socket' => '/tmp/mysql.sock', ) )); // Custom Log file settings to ROOT/data/logs/ CakeLog::config('default', array( 'engine' => 'FileLog', 'path' => ROOT . DS . 'data' . DS . 'logs' . DS )); 

При наличии всех настроек предупреждающие сообщения на домашней странице по умолчанию должны исчезнуть.

Создать приложение в AppFog

Войдите в консоль AppFog и создайте новое приложение. Обязательно выберите PHP в качестве типа приложения, своего любимого провайдера инфраструктуры (я выбрал AWS Europe) и дайте ему имя. Затем нажмите «Создать приложение», и через пару секунд система отправит вас в «Управление полетом» приложения.

Приложение с AppFog изначально состоит из одного файла index.php с кодом «Hello World»; мы должны загрузить наш локальный код. Но прежде чем мы это сделаем, нам нужно привязать службу базы данных. Выберите панель «Службы», нажмите кнопку MySQL и дайте ей имя (например, fognotes_prod ). VCAP_SERVICES данные для подключения к службе хранятся в переменной среды VCAP_SERVICES .

Нам также нужно перейти на панель «Env Variables» и установить нашу собственную переменную. Создайте новую переменную с именем APP_ENV со значением «prod» и сохраните.

Сделайте копию data/config/local.php назовите его data/config/prod.php и откройте его в вашем редакторе. Мы извлечем настройки базы данных в соответствии с рекомендациями, изложенными в документации AppFog. Отредактируйте файл конфигурации так, чтобы он выглядел так:

 <?php // ...other code // AppFog Extraction $services_json = json_decode(getenv('VCAP_SERVICES'),true); $af_mysql_config = $services_json['mysql-5.1'][0]['credentials']; // Database settings Configure::write('Database.config', array( 'default' => array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => $af_mysql_config['hostname'], 'login' => $af_mysql_config['username'], 'password' => $af_mysql_config['password'], 'database' => $af_mysql_config['name'], 'prefix' => '', 'encoding' => 'utf8', ) )); // ...other code 

Мы также можем привязать приложение к пользовательскому домену или поддомену (бесплатно!), Но здесь это не так.

Теперь мы почти готовы нажать наш код! На панели «Обновление исходного кода» найдите инструкции по установке утилиты af в вашей системе. Откройте сеанс терминала и перейдите в корень приложения. Следуйте инструкциям для установки инструмента CLI, затем войдите в систему, но не загружайте код удаленного проекта. Вместо этого af update FogNotes команду af update FogNotes чтобы af update FogNotes локальный код на удаленный сервер. Менее чем за минуту ваше приложение будет развернуто, и вы увидите тот же главный экран, что и у вашей локальной версии. Это означает, что приложение распознает производственную среду и удаленную базу данных.

Добавление некоторых штрихов

У нас развернуто пустое приложение, но мы должны добавить хотя бы некоторый код и данные для нашего приложения. Мы позволим CakePHP сделать тяжелую работу.

Создайте файл data/config/notes.sql со следующим содержимым:

 CREATE TABLE notes ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY , title VARCHAR( 255 ) NOT NULL , content TEXT NOT NULL , created DATETIME NULL DEFAULT NULL , modified DATETIME NULL DEFAULT NULL , INDEX (title, created, modified) ) ENGINE = INNODB; 

Импортируйте файл в локальную базу данных в командной строке или с помощью вашего любимого инструмента MySQL.

Затем из корневого каталога вашего приложения выполните команду:

  ~ / FogNotes $ ./cake bake 

Следуйте инструкциям (это действительно просто!) И создайте модель, представление и контроллер для «Заметок», единственной таблицы в базе данных. CakePHP создаст нужные файлы для вас. Затем откройте файл app/Config/routes.php и замените первый оператор Router::connect() следующим кодом, чтобы заново связать домашнюю страницу со списком заметок:

 <?php Router::connect('/', array('controller' => 'notes', 'action' => 'index')); 

Перезагрузите локальную домашнюю страницу, и вы должны иметь полностью работающее приложение. Теперь пришло время опубликовать изменения. Команда af update FogNotes отправит новый код.

Вы увидите неприятную страницу с ошибкой, если перезагрузите удаленное приложение сейчас. Это потому, что мы не создали таблицу данных в удаленной базе данных. Woops!

Самый простой способ импортировать таблицы — создать туннель с помощью команды af tunnel а затем подключиться к удаленной базе данных, используя информацию, предоставленную самим туннелем. Откройте туннель в окне консоли, выберите «none» в качестве типа клиента, а затем вы можете использовать другое окно терминала для импорта файла SQL:

  mysql --protocol = TCP --host = localhost --port = 10000 --user = RemoteUserName 
  --password = RemotePassword RemoteLongDifficultDBName </path/to/notes.sql 

Вы также можете использовать Sequel Pro, если вы работаете на Mac или MySQL Workbench, пока туннель открыт.

Как только таблица на месте, удаленное приложение снова будет работать гладко.

Резюме

Организация примера приложения, которое я показал вам здесь, является лишь одним из многих методов, которые вы можете использовать для улучшения процессов разработки CakePHP. Например, вы можете сохранить сеансы в файле на вашем локальном компьютере и использовать MongoDB в производственном экземпляре AppFog.

AppFog — относительно молодой сервис PaaS, но перспективный. Это быстрый и простой в использовании, и он всегда развивается. AppFog также позволяет вам клонировать целое приложение, полезное для создания промежуточной среды или среды исправления ошибок. Остальное зависит от вас, поэтому счастливое кодирование!

Изображение через Fotolia