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

Содержание

Слайд 2

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

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

сентября 2008. официальный сайт: www.bynet2.org
Слайд 3

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

Обычная разработка

Cms 1
Cms 2
Super CMS
Лучшая в мире CMS, потому,

что я написал ее сам!
Зачем что-то еще?
Слайд 4


Слайд 5

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

Потребность в фреймворках

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

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

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

Преимущества фреймворков

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

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

Php-фреймворки: codeIgniter cakePHP Symfony Zend Framework

Php-фреймворки:
codeIgniter
cakePHP
Symfony
Zend Framework

Слайд 8

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

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

Слайд 9

Cake PHP


Cake PHP

Слайд 10

CakePHP::Возможности Совместим с PHP4 и PHP5 MVC Своя файловая структура Своя

CakePHP::Возможности

Совместим с PHP4 и PHP5
MVC
Своя файловая структура
Своя абстракция данных (либо Adodb,

PEAR::Db)
Поддержка плагинов
Валидация
Scaffolding
Маршрутизация запросов
Компоненты / Хелперы / i18n
Слайд 11

CakePHP::Обработка запросов

CakePHP::Обработка запросов

Слайд 12

CakePHP::Соглашения Класс KissesAndHugsController должен храниться в файле kisses_and_hugs_controller.php Название модели записывается

CakePHP::Соглашения

Класс KissesAndHugsController должен храниться в файле kisses_and_hugs_controller.php
Название модели записывается в ед.

числе: Book, MyBook, и т.п. 
Названия таблиц должны быть в множественном числе, и через подчеркивание: my_year_books
Названия множественном числе. BooksController, OxenController.
Слайд 13

CakePHP::Контроллеры index – метод по умолчанию ( site.com/books/ ) Методы контроллера

CakePHP::Контроллеры

index – метод по умолчанию ( site.com/books/ )
Методы контроллера  
beforeFilter –

до логики
beforeRender – до view
afterFilter – после логики и после view
Слайд 14

CakePHP::Модели Доступные методы в каждой модели: beforeFind() afterFind() beforeValidate() beforeSave() afterSave() beforeDelete() afterDelete()

CakePHP::Модели

Доступные методы в каждой модели:
beforeFind()
afterFind()
beforeValidate()
beforeSave()
afterSave()
beforeDelete()
afterDelete()

Слайд 15

CakePHP::Шаблоны Чистый PHP Smarty Место нахождения шаблона: /app/views/people/index.tpl

CakePHP::Шаблоны

Чистый PHP
Smarty
Место нахождения шаблона:
/app/views/people/index.tpl

Слайд 16

CakePHP::Проекты Fileshifter.com Server: Pentium 3, 733mhz, 512MB RAM, 2TB SATA RAID.

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 сек
Слайд 17

Code Igniter



Code Igniter

Слайд 18

CodeIgniter Текущая версия 1.6.3 Гибкость Плагины / Хелперы Скаффолдинг Простота (loose

CodeIgniter

Текущая версия 1.6.3
Гибкость
Плагины / Хелперы
Скаффолдинг
Простота (loose coupling)
MVC
Поддержка PHP4
Настройка параметров автозагрузки

Слайд 19

CI::Ход работы приложения

CI::Ход работы приложения

Слайд 20

CodeIgniter::модели Классы моделей хранятся в папке application/models/ Класс: Model_name Имя файла: application/models/user_model.php Загрузка: $this->load->model('Model_name'); $this->Model_name->function();

CodeIgniter::модели

Классы моделей хранятся в папке application/models/
Класс: Model_name 
Имя файла:
application/models/user_model.php

Загрузка:
$this->load->model('Model_name'); $this->Model_name->function();
Слайд 21

CodeIgniter::Контроллеры application/config/routes.php – маршруты $route['default_controller'] = ‘XXX_controller'; class My_class extends Controller { …. } _remap ()

CodeIgniter::Контроллеры

application/config/routes.php – маршруты
$route['default_controller'] = ‘XXX_controller';
class My_class extends Controller { ….
}
_remap

()
Слайд 22

CodeIgniter::View class Privet extends Controller { …. } Загрузка: $this->load->view('name');

CodeIgniter::View

class Privet extends Controller
{
….
}
Загрузка:
$this->load->view('name');

Слайд 23

Symfony



Symfony

Слайд 24

Symfony::использует Creole – абстракция с БД Propel ( PDO с 1.2)

Symfony::использует

Creole – абстракция с БД
Propel ( PDO с 1.2)

Prado для i18n
Spyc YAML парсинг
Pake для командной строки(symfony 1.0)
Prototype, Script.aculo.us, Dynarch.com, TinyMCE
Слайд 25

Symfony::возможности I18n, l10n, cache, валидация и т.п. Scaffolding Генерация кода AdminGenerator

Symfony::возможности
I18n, l10n, cache, валидация и т.п.
Scaffolding
Генерация кода
AdminGenerator
Независимые блоки (Loose

coupling)
Маршрутизация
Хелперы
Debug
Слайд 26

Symfony::особенности Все классы начинаются с ‘sf’ (стандартные) class ##MODULE_NAME##Actions extends sfActions Много различного рода конфигурационных файлов.

Symfony::особенности
Все классы начинаются с ‘sf’ (стандартные)
class ##MODULE_NAME##Actions extends sfActions
Много различного рода

конфигурационных файлов.
Слайд 27



Слайд 28

Symfony::Известные проекты bookmarks.yahoo.com (20 млн пользователей) www.splitgames.fr (сайт обмена играми) www.kuss.de (сайт знакомств) www.winkel.ro (доска объявлений)

Symfony::Известные проекты

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

объявлений)
Слайд 29


Слайд 30

Zend Framework (ZF) Acl (роли и ресурсы) Auth (openId, Microsoft InfoCard)

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
Слайд 31

Новое в ZF 1.6 RC1 Интеграция с Dojo Поддержка с SOAP

Новое в ZF 1.6 RC1

Интеграция с Dojo
Поддержка с SOAP
Unit-тесты для контроллеров
Поддержка

индексных файлов Lucene 2.3
Zend_Session – обработчик сохранения
Paginator
Zend_Config_Xml – поддержка атрибутов
Медиа хелперы (QuickTime, Flash)
Слайд 32

ZF в цифрах Более 7 миллионов загрузок Более 500 разработчиков Более

ZF в цифрах

Более 7 миллионов загрузок
Более 500 разработчиков
Более

1000 страниц в справочнике
Более 500 примеров
Более 60 проектов на SourceForge
Более 30 проектов на Google Code
Около 70 различных компонентов.
Слайд 33

ZF::соглашения Class My_Class_Name должен находится в файле: My/Class/Name.php Cтиль кода во многом совпадает со стилями PEAR

ZF::соглашения

Class My_Class_Name должен находится в файле:
My/Class/Name.php
Cтиль кода во многом совпадает

со стилями PEAR
Слайд 34

ZF::Front Controller Pattern

ZF::Front Controller Pattern

Слайд 35

Zend_Controller_Response_Http


Zend_Controller_Response_Http


Слайд 36

ZF::Модели Zend_Db_Table PDO $db = Zend_Db::factory($cfgDb->type, $params); Zend_Db_Table::setDefaultAapter($db); Zend_Registry::set("DB", $db);

ZF::Модели

Zend_Db_Table
PDO
$db = Zend_Db::factory($cfgDb->type, $params);
Zend_Db_Table::setDefaultAapter($db);
Zend_Registry::set("DB", $db);

Слайд 37

ZF::Контроллеры Zend_Controller_Action ErrorHandler plugin ViewRenderer action helper plugin preDispatch postDispatch Init

ZF::Контроллеры

Zend_Controller_Action
ErrorHandler plugin
ViewRenderer action helper plugin
preDispatch
postDispatch
Init

Слайд 38

ZF::View interface Zend_View_Interface public function render($name); public function assign($name); Zend_View_Abstract basePath,

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
Слайд 39

ZF::Проекты www.magentocommerce.com – движок для e-commerce, 0.5млн скачиваний, 30K users, 70

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
Слайд 40

Производительность Почти Hello World test ;-)

Производительность

Почти Hello World test ;-)

Слайд 41

Обычная страница без ORM Ыф Вид теста: ab –n 1000 –c

Обычная страница без ORM

Ыф
Вид теста: ab –n 1000 –c XXX
512 ram,

Intel Pentium 14oo MHz, Windows XP
Слайд 42

Вместе с ORM, без кеша. Ыф 512Mb RAM 1.8Ghz AMD Sempron под Ubuntu Gutsy (7.10)



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

Ыф
512Mb RAM 1.8Ghz AMD Sempron

под Ubuntu Gutsy (7.10)
Слайд 43

Ыф 512Mb RAM 1.8Ghz AMD Sempron под Ubuntu Gutsy (7.10) Вместе с ORM, APC кэшем Ыф

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




Вместе с ORM, APC кэшем

Ыф

Слайд 44

Symfony performance

Symfony performance

Слайд 45

Проект на Zend Framework


Проект на
Zend Framework

Слайд 46

ZF::Пример проекта. Создаем сайт-сообщество. Несколько языков, несколько доменов, различные уровни доступа к ресурсам, маршрутизация, ORM.

ZF::Пример проекта.

Создаем сайт-сообщество. Несколько языков, несколько доменов, различные уровни доступа к

ресурсам, маршрутизация, ORM.
Слайд 47

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

Организация разработки

Zend Studio for Eclipse (или просто phpEclipse)
Cruise Control + phpUnderControl
PHPUnit

(Себастьян Бергман)
Smarty
SVN
Ajax: xajax/jQuery/Dojo/Prototype/и т.д.
Firebug + FirePhp (FireZend)
ORM (Doctrine)
Memcached
Слайд 48

Zend_Config site.ru.xml site.eu.xml site.zone.xml en ru

Zend_Config

site.ru.xml
site.eu.xml
site.zone.xml

en
ru

Слайд 49

bootstrap.php initView(); initRoutes(); initFrontend();

bootstrap.php

initView();
initRoutes();
initFrontend();

Слайд 50

$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);


$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);
Слайд 51

Auth: $authAdapter = new Zend_Auth_Adapter_DbTable( $db, 'user', 'login', 'pass'); Zend_Registry::set("Auth", $authAdapter);

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();
Слайд 52

ACL $roleAdmin = new Zend_Acl_Role(Socnet_Auth_Acl::ADMIN); $this->addRole($roleAdmin, $roleMember); $this->addResource('forum/topic'); $this->deny(null, null); //

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');
Слайд 53

Маршрутизация $route = new Zend_Controller_Router_Route(ajax/:widgetName/:widgetAction', array( 'controller' => ‘ajax', 'action' =>

Маршрутизация

$route = new Zend_Controller_Router_Route(ajax/:widgetName/:widgetAction',
array(
'controller' => ‘ajax',
'action' =>

'index',
'widgetName' => '',
'widgetAction' => 'index'
));
$router->addRoute('widget_request', $route);
Слайд 54



Слайд 55

Unit-тестирование /tests Auth Controller Domain Model Members AllTests.php setUpEnvinronment.php

Unit-тестирование

/tests
Auth
Controller
Domain
Model
Members


AllTests.php
setUpEnvinronment.php
Слайд 56



Слайд 57



Слайд 58

Модели /generated |- BaseModelName ParticularModel extends BaseModelName phpDoctrine .yml fixtures

Модели

/generated
|- BaseModelName
ParticularModel extends BaseModelName
phpDoctrine
.yml
fixtures

Слайд 59

if (extension_loaded('memcache')) { $frontendOptions = array( 'lifetime' => 7200, // cache


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);
Слайд 60

Диспетчеризация extends Zend_Controller_Dispatcher_Standard $action = $this->getActionMethod($request); $doCall = !method_exists($controller, $action); $request->setDispatched(true);

Диспетчеризация

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);
Слайд 61

motofriends.ru

motofriends.ru

Слайд 62

Выводы:



Выводы:

Слайд 63

Полезные ссылки Cakephp.org (cake-php.ru) – сайт фреймворка Cakeforge.com – набор готовых

Полезные ссылки

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 раза - Котеров)
httphttp://http://zendframeworkhttp://zendframework.http://zendframework.ruhttp://zendframework.ru/http://zendframework.ru/articleshttp://zendframework.ru/articles/http://zendframework.ru/articles/chtohttp://zendframework.ru/articles/chto_http://zendframework.ru/articles/chto_takoehttp://zendframework.ru/articles/chto_takoe_http://zendframework.ru/articles/chto_takoe_zendhttp://zendframework.ru/articles/chto_takoe_zend_http://zendframework.ru/articles/chto_takoe_zend_frameworkhttp://zendframework.ru/articles/chto_takoe_zend_framework/ (обзорно про ZF)
httphttp://http://kpumukhttp://kpumuk.http://kpumuk.infohttp://kpumuk.info/http://kpumuk.info/phphttp://kpumuk.info/php/http://kpumuk.info/php/zendhttp://kpumuk.info/php/zend-http://kpumuk.info/php/zend-frameworkhttp://kpumuk.info/php/zend-framework-http://kpumuk.info/php/zend-framework-routerhttp://kpumuk.info/php/zend-framework-router-http://kpumuk.info/php/zend-framework-router-forhttp://kpumuk.info/php/zend-framework-router-for-http://kpumuk.info/php/zend-framework-router-for-subdirectoryhttp://kpumuk.info/php/zend-framework-router-for-subdirectory-http://kpumuk.info/php/zend-framework-router-for-subdirectory-basedhttp://kpumuk.info/php/zend-framework-router-for-subdirectory-based-http://kpumuk.info/php/zend-framework-router-for-subdirectory-based-sitehttp://kpumuk.info/php/zend-framework-router-for-subdirectory-based-site/#http://kpumuk.info/php/zend-framework-router-for-subdirectory-based-site/#morehttp://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 (Довольно хорошие сравнительные тесты)
Слайд 64

http://phpimpact.wordpress.com/2008/07/28/zend-framework-architecture/ (архитектура Zend’a) httphttp://http://wikihttp://wiki.http://wiki.ringsidenetworkshttp://wiki.ringsidenetworks.http://wiki.ringsidenetworks.orghttp://wiki.ringsidenetworks.org/http://wiki.ringsidenetworks.org/displayhttp://wiki.ringsidenetworks.org/display/http://wiki.ringsidenetworks.org/display/ringsidehttp://wiki.ringsidenetworks.org/display/ringside/http://wiki.ringsidenetworks.org/display/ringside/Layeringhttp://wiki.ringsidenetworks.org/display/ringside/Layering+http://wiki.ringsidenetworks.org/display/ringside/Layering+andhttp://wiki.ringsidenetworks.org/display/ringside/Layering+and+http://wiki.ringsidenetworks.org/display/ringside/Layering+and+Cachinghttp://wiki.ringsidenetworks.org/display/ringside/Layering+and+Caching+http://wiki.ringsidenetworks.org/display/ringside/Layering+and+Caching+Design (слои в архитектуре) http://www.zend.com/en/products/platform/ (Zend Platform –


http://phpimpact.wordpress.com/2008/07/28/zend-framework-architecture/ (архитектура Zend’a)
httphttp://http://wikihttp://wiki.http://wiki.ringsidenetworkshttp://wiki.ringsidenetworks.http://wiki.ringsidenetworks.orghttp://wiki.ringsidenetworks.org/http://wiki.ringsidenetworks.org/displayhttp://wiki.ringsidenetworks.org/display/http://wiki.ringsidenetworks.org/display/ringsidehttp://wiki.ringsidenetworks.org/display/ringside/http://wiki.ringsidenetworks.org/display/ringside/Layeringhttp://wiki.ringsidenetworks.org/display/ringside/Layering+http://wiki.ringsidenetworks.org/display/ringside/Layering+andhttp://wiki.ringsidenetworks.org/display/ringside/Layering+and+http://wiki.ringsidenetworks.org/display/ringside/Layering+and+Cachinghttp://wiki.ringsidenetworks.org/display/ringside/Layering+and+Caching+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/ (много интересных статей)
httphttp://http://wwwhttp://www.http://www.settihttp://www.setti.http://www.setti.bizhttp://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)