65
Граков Алексей Antalika.com

php frameworks

Embed Size (px)

Citation preview

Граков АлексейAntalika.com

Этот доклад был прочитан на конференции Байнет 2.2 Beta. Минск, 11-12 сентября 2008.официальный сайт: www.bynet2.org

Обычная разработкаCms 1Cms 2 Super CMS Лучшая в мире CMS, потому, что я

написал ее сам!

Зачем что-то еще?

Потребность в фреймворкахРазработка нестандартных проектов. Желание иметь под рукой хороший

инструмент, который будет: - развиваться - иметь хорошую документацию

- иметь качественный код - обеспечивать достаточную гибкость - содержать компоненты на все случаи

жизни - бесплатным

Преимущества фреймворковОдин зверь, вместо зоопаркаУскорение сроков разработкиМеньше внимания на мелочи, больше на

бизнес логикуБольший контроль над процессом и

качеством разработкиХорошая документированностьБыстрый ввод новичков на проект

Php-фреймворки:

codeIgnitercakePHPSymfonyZend Framework

Цитируемость фреймворковв поисковиках

Поисковик CakePhp Symfony CodeIgniter Zend Framework

Google (world)

3,680,000 1,440,000 544,000 3,280,000

Google EN 3,250,000 497,000 361,000 2,040,000

Google.ru 28100 20020 28,500 36,900

Yandex 90, 000 68, 000 87, 000 333, 000

Cake PHP

CakePHP::ВозможностиСовместим с PHP4 и PHP5MVCСвоя файловая структураСвоя абстракция данных (либо 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::ШаблоныЧистый PHPSmartyМесто нахождения шаблона:

/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 в среднем.Время отклика: 0.3-0.5 сек

Code Igniter

CodeIgniterТекущая версия 1.6.3 ГибкостьПлагины / ХелперыСкаффолдингПростота (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::Viewclass 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 млн

пользователей)www.splitgames.fr (сайт обмена играми)www.kuss.de (сайт знакомств)www.winkel.ro (доска объявлений)

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, RegistryRest_Client / Rest_ServerService: Akismet, Amazon, Delicious, Flickr, Nirvanix,

Simpy, StrikeIron и Yahoo! / XmlRpc

Новое в ZF 1.6 RC1Интеграция с DojoПоддержка с SOAPUnit-тесты для контроллеровПоддержка индексных файлов Lucene 2.3Zend_Session – обработчик сохраненияPaginatorZend_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_TablePDO

$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

preDispatchpostDispatchInit

ZF::Viewinterface Zend_View_Interfacepublic function render($name);

public function assign($name);

Zend_View_AbstractbasePath, filters, helpers, _setHelperClass (filter)

Zend/Controller/Action/Helper/ViewRenderer .php

MyClass_View_Smarty extends Zend_View_Abstract

ZF::Проектыwww.magentocommerce.com – движок для 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

1 10 50

cakePhp 5.21 4.98 5.02

Zend 7.67 7.86 7.77

CodeIgniter 16.13 15.44 15.42

Вместе с ORM, без кеша.Ыф

512Mb RAM 1.8Ghz AMD Sempron под Ubuntu Gutsy (7.10)

1 10 50

cakePhp 3.6 3.7 3.8

Zend 21.5 21.2 21.7

CodeIgniter 9.3 9.1 9.2

Ыф

512Mb RAM 1.8Ghz AMD Sempron под Ubuntu Gutsy (7.10)

Вместе с ORM, APC кэшемЫф 1 10 50

cakePhp 7.3 7.3 7.3

Zend 97.5 98.0 96.6

CodeIgniter 32.8 33.3 31.8

Symfony performance

Проект на Zend Framework

ZF::Пример проекта.Создаем сайт-сообщество. Несколько

языков, несколько доменов, различные уровни доступа к ресурсам, маршрутизация, ORM.

Организация разработкиZend Studio for Eclipse (или просто

phpEclipse)Cruise Control + phpUnderControlPHPUnit (Себастьян Бергман)SmartySVNAjax: xajax/jQuery/Dojo/Prototype/и т.д.Firebug + FirePhp (FireZend)ORM (Doctrine)Memcached

Zend_Configsite.ru.xmlsite.eu.xmlsite.zone.xml <languages> <language>en</language> <language>ru</language></languages>

bootstrap.phpinitView();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/:widgetName/: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 (новый)http://habrahabr.ru/blogs/zend_framework/31639/ (Интеграция Zend_Acl и MVC. Часть 1)

http://lobach.info/develop/zf/integrating-zend-framework-and-doctrine/ (Интеграция Zend and Doctrine)

http://phpimpact.wordpress.com/2008/08/04/php-applications-where-is-the-include-coming-from/ (откуда инклюды)

http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html (Prepared statements in mysql)

http://vanav.com.ua/post397 (Сравнение скорости PDO, ADOdb, MDB2, Zend_Db, и т.п.)

http://club.shelek.ru/viewart.php?id=300 (Сравнительный тест систем кэширования user data для PHP)

http://www.dklab.ru/chicken/nablas/49.html (оптимизация Загрузки в 22 раза - Котеров)http://zendframework.ru/articles/chto_takoe_zend_framework/ (обзорно про ZF)http://kpumuk.info/php/zend-framework-router-for-subdirectory-based-site/#more-31 (Роутеры в Zend)http://devzone.zend.com/article/3811-Using-Zend_Tool-to-start-up-your-ZF-Project (Zend_Tool – для

создания рабочей копии проекта

http://www.avnetlabs.com/php/php-frameworks-revisited-codeigniter-vs-zend-framework (еще одно сравнение фреймворков)

http://snook.ca/archives/php/codeigniter_vs_cakephp/ (CI vs Cake)

http://www.avnetlabs.com/php/php-framework-comparison-benchmarks (Довольно хорошие сравнительные тесты)

http://phpimpact.wordpress.com/2008/07/28/zend-framework-architecture/

(архитектура Zend’a)

http://wiki.ringsidenetworks.org/display/ringside/Layering+and+Caching+Design (слои в архитектуре)

http://www.zend.com/en/products/platform/ (Zend Platform – aka Php Application Server – стоит почитать)

http://phpimpact.wordpress.com/category/frameworks/ (много интересных статей)

http://www.setti.biz/574/ (сравнение CodeIgniter с Cake)http://ajaxpatterns.org/Frameworks_Matrix (матрица JS-фреймворков)http://www.symfony-project.org/tutorial/1_0/my-first-project (Symfony: 1st

project )http://paul-m-jones.com/blog/?p=236 (обзор производительности)http://manual.cakephp.org/view/326/the-cake-blog-tutorial (1-й проект на

cake)

Есть вопросы[email protected]

Icq: 286-41-77-45Skype: horal777 Алексей Граков