Граков Алексей Antalika.com
Этот доклад был прочитан на конференции Байнет 2.2 Beta. Минск, сентября официальный сайт:
Обычная разработка Cms 1 Cms 2 Super CMS Лучшая в мире CMS, потому, что я написал ее сам! Зачем что-то еще?
Потребность в фреймворках Разработка нестандартных проектов. Желание иметь под рукой хороший инструмент, который будет: - развиваться - иметь хорошую документацию - иметь качественный код - обеспечивать достаточную гибкость - содержать компоненты на все случаи жизни - бесплатным
Преимущества фреймворков Один зверь, вместо зоопарка Ускорение сроков разработки Меньше внимания на мелочи, больше на бизнес логику Больший контроль над процессом и качеством разработки Хорошая документированность Быстрый ввод новичков на проект
Php-фреймворки: codeIgniter cakePHP Symfony Zend Framework
Цитируемость фреймворков в поисковиках ПоисковикCakePhpSymfonyCodeIgniter Zend Framework Google (world) 3,680,0001,440,000544,0003,280,000 Google EN3,250,000497,000361,0002,040,000 Google.ru ,50036,900 Yandex90, 00068, 00087, , 000
Cake PHP
CakePHP::Возможности Совместим с PHP4 и PHP5 MVC Своя файловая структура Своя абстракция данных (либо Adodb, PEAR::Db) Поддержка плагинов Валидация Scaffolding Маршрутизация запросов Компоненты / Хелперы / i18n
CakePHP::Обработка запросов
CakePHP::Соглашения Класс KissesAndHugsController должен храниться в файле kisses_and_hugs_controller.php Название модели записывается в ед. числе: Book, MyBook, и т.п. Названия таблиц должны быть в множественном числе, и через подчеркивание: my_year_books Названия множественном числе. BooksController, OxenController.
CakePHP::Контроллеры index – метод по умолчанию ( site.com/books/ ) Методы контроллера beforeFilter – до логики beforeRender – до view afterFilter – после логики и после view
CakePHP::Модели Доступные методы в каждой модели: beforeFind() afterFind() beforeValidate() beforeSave() afterSave() beforeDelete() afterDelete()
CakePHP::Шаблоны Чистый PHP Smarty Место нахождения шаблона: /app/views/people/index.tpl
CakePHP::Проекты Fileshifter.com Server: Pentium 3, 733mhz, 512MB RAM, 2TB SATA RAID. OS: Fedora Linux, ext3 filesystem. Объем данных на сервере: 1.37 TB. Ежедневный траффик: 28 GB в среднем. Время отклика: сек
Code Igniter
CodeIgniter Текущая версия Гибкость Плагины / Хелперы Скаффолдинг Простота (loose coupling) MVC Поддержка PHP4 Настройка параметров автозагрузки
CI::Ход работы приложения
CodeIgniter::модели Классы моделей хранятся в папке application/models/ Класс: Model_name Имя файла: application/models/user_model.php Загрузка: $this->load->model('Model_name'); $this->Model_name->function();
CodeIgniter::Контроллеры application/config/routes.php – маршруты $route['default_controller'] = XXX_controller'; class My_class extends Controller { …. } _remap ()
CodeIgniter::View class Privet extends Controller { …. } Загрузка: $this->load->view('name');
Symfony
Symfony::использует Creole – абстракция с БД Propel ( PDO с 1.2) Prado для i18n Spyc YAML парсинг Pake для командной строки(symfony 1.0) Prototype, Script.aculo.us, Dynarch.com, TinyMCE
Symfony::возможности I18n, l10n, cache, валидация и т.п. Scaffolding Генерация кода AdminGenerator Независимые блоки (Loose coupling) Маршрутизация Хелперы Debug
Symfony::особенности Все классы начинаются с sf (стандартные) class ##MODULE_NAME##Actions extends sfActions Много различного рода конфигурационных файлов.
Symfony::Известные проекты bookmarks.yahoo.com (20 млн пользователей) (сайт обмена играми) (сайт знакомств) (доска объявлений)
Zend Framework (ZF) Acl (роли и ресурсы) Auth (openId, Microsoft InfoCard) Cache / Loader Config / Console_Getopt (cli) Date ( i18n, l10N) / Db Filter, Validate (34) / Gdata (Zend Google Data Client) Http_Client / Json / Locale, Log, Mail, Mime, Registry Rest_Client / Rest_Server Service: Akismet, Amazon, Delicious, Flickr, Nirvanix, Simpy, StrikeIron и Yahoo! / XmlRpc
Новое в ZF 1.6 RC1 Интеграция с Dojo Поддержка с SOAP Unit-тесты для контроллеров Поддержка индексных файлов Lucene 2.3 Zend_Session – обработчик сохранения Paginator Zend_Config_Xml – поддержка атрибутов Медиа хелперы (QuickTime, Flash)
ZF в цифрах Более 7 миллионов загрузок Более 500 разработчиков Более 1000 страниц в справочнике Более 500 примеров Более 60 проектов на SourceForge Более 30 проектов на Google Code Около 70 различных компонентов.
ZF::соглашения Class My_Class_Name должен находится в файле: My/Class/Name.php Cтиль кода во многом совпадает со стилями PEAR
ZF::Front Controller Pattern
Zend_Controller_Front Zend_Controller_Roulter_Rewrite (выбирает action для запуска) Zend_Controller_Dispatcher_Standard (вызыает action) Zend_Controller_Action (конкретный) Using Zend_Action_Helper Zend_Controller_Request Zend_View (использует Zend_View_Helper) Zend_Db_Table (Model ) Т.е. тут может быть Custom Model Zend_Controller_Response_Http
ZF::Модели Zend_Db_Table PDO $db = Zend_Db::factory($cfgDb->type, $params); Zend_Db_Table::setDefaultAapter($db); Zend_Registry::set("DB", $db);
ZF::Контроллеры Zend_Controller_Action ErrorHandler plugin ViewRenderer action helper plugin preDispatch postDispatch Init
ZF::View interface Zend_View_Interface public function render($name); public function assign($name); Zend_View_Abstract basePath, filters, helpers, _setHelperClass (filter) Zend/Controller/Action/Helper/ViewRenderer.php MyClass_View_Smarty extends Zend_View_Abstract
ZF::Проекты – движок для e- commerce, 0.5млн скачиваний, 30K users, 70 партнеров, 60+ языков, 150+ расширений (no java!) RightMedia – online реклама (NY) 4-5млрд показов в день, 100K запросов/с, 19K рекламодателей и партнеров (5 dev-6m) QEDWiki – IBM (mashups) PokerRoom.com – 12млн users (25 srv, 16front, 9mysql, i18n, docs, routes:{playpoker, pokerSpielen}: (seo), ZP+JavaBridge
Производительность Почти Hello World test ;-)
Обычная страница без ORM Ыф Вид теста: ab –n 1000 –c XXX 512 ram, Intel Pentium 14oo MHz, Windows XP cakePhp Zend CodeIgniter
Вместе с ORM, без кеша. Ыф 512Mb RAM 1.8Ghz AMD Sempron под Ubuntu Gutsy (7.10) cakePhp Zend CodeIgniter
Ыф 512Mb RAM 1.8Ghz AMD Sempron под Ubuntu Gutsy (7.10) Вместе с ORM, APC кэшем Ыф cakePhp 7.3 Zend CodeIgniter
Symfony performance
Проект на Zend Framework
ZF::Пример проекта. Создаем сайт-сообщество. Несколько языков, несколько доменов, различные уровни доступа к ресурсам, маршрутизация, ORM.
Организация разработки Zend Studio for Eclipse (или просто phpEclipse) Cruise Control + phpUnderControl PHPUnit (Себастьян Бергман) Smarty SVN Ajax: xajax/jQuery/Dojo/Prototype/и т.д. Firebug + FirePhp (FireZend) ORM (Doctrine) Memcached
Zend_Config site.ru.xml site.eu.xml site.zone.xml en ru
bootstrap.php initView(); initRoutes(); initFrontend();
$view = new Socnet_View_Smarty(); $vRender = new Zend_Controller_Action_Helper_ViewRenderer($view); $vRender->setViewBasePathSpec( dirname(__FILE__).'/V/smarty/templates') ->setViewScriptPathSpec(':module/:controller/:action.:suffix') ->setViewScriptPathNoControllerSpec(':action.:suffix') ->setViewSuffix('tpl'); Zend_Controller_Action_HelperBroker::addHelper($vRender);
Auth: $authAdapter = new Zend_Auth_Adapter_DbTable( $db, 'user', 'login', 'pass'); Zend_Registry::set("Auth", $authAdapter); Class myAdapter extends Zend_Auth_Adapter_Interface public function authenticate();
ACL $roleAdmin = new Zend_Acl_Role(Socnet_Auth_Acl::ADMIN); $this->addRole($roleAdmin, $roleMember); $this->addResource('forum/topic'); $this->deny(null, null); // Запрет всем для всего. $this->allow(null, 'forum'); // всем доступ к форуму $this->allow(null, 'ajax'); // всем к ajax $this->allow($admin, admin');
Маршрутизация $route = new Zend_Controller_Router_Route(ajax/:widgetNam e/:widgetAction', array( 'controller' => ajax', 'action' => 'index', 'widgetName' => '', 'widgetAction' => 'index' )); $router->addRoute('widget_request', $route);
Unit-тестирование /tests Auth Controller Domain Model Members AllTests.php setUpEnvinronment.php
Модели /generated |- BaseModelName ParticularModel extends BaseModelName phpDoctrine.yml fixtures
if (extension_loaded('memcache')) { $frontendOptions = array( 'lifetime' => 7200, // cache lifetime of 2 hours 'automatic_serialization' => true ); $backendOptions = array(); $frontend = 'Core'; $backend = 'Memcached'; } else { $frontendOptions = array( 'lifetime' => 7200, // cache lifetime of 2 hours 'automatic_serialization' => true ); $backendOptions = array( 'cache_dir' => dirname(__FILE__).'/../tmp/' // ); $frontend = 'Core'; $backend = 'File'; } $cache = Zend_Cache::factory($frontend, $backend, $frontendOptions, $backendOptions); Zend_Registry::set('cache', $cache);
Диспетчеризация extends Zend_Controller_Dispatcher_Standard $action = $this->getActionMethod($request); $doCall = !method_exists($controller, $action); $request->setDispatched(true); $controller->preDispatch(); $xajaxargs = $controller->_page->Xajax->getRequestParams(); $sResponse = call_user_func_array(array(&$controller, $action),$xajaxargs); if (is_a($sResponse, "xajaxResponse")) { $sResponse = $sResponse->getXML(); } header($sContentHeader);
motofriends.ru
Выводы:
Полезные ссылки Cakephp.org (cake-php.ru) – сайт фреймворка Cakeforge.com – набор готовых проектов на cake codeigniter.com (code-igniter.ru) – сайт фреймворка symfony-project.org - сайт фреймворка Framework.zend.com - сайт фреймворка Zendframework.ru - русский сайт + wiki (новый) (Интеграция Zend_Acl и MVC. Часть 1) (Интеграция Zend and Doctrine) (откуда инклюды) (Prepared statements in mysql) (Сравнение скорости PDO, ADOdb, MDB2, Zend_Db, и т.п.) (Сравнительный тест систем кэширования user data для PHP) (оптимизация Загрузки в 22 раза - Котеров) (обзорно про ZF) (Роутеры в Zend) (Zend_Tool – для создания рабочей копии проекта (еще одно сравнение фреймворков) (CI vs Cake) (Довольно хорошие сравнительные тесты)
(архитектура Zenda) (слои в архитектуре) (Zend Platform – aka Php Application Server – стоит почитать) (много интересных статей) (сравнение CodeIgniter с Cake) (матрица JS-фреймворков) (Symfony: 1st project ) (обзор производительности) (1-й проект на cake)
Есть вопросы? Icq: Skype: horal777 Алексей Граков