FUSE
Tento framework je ke stažení na stránkách www.phpfuse.net/Download/. V současné době je zde verze 1.0 ze dne 31. ledna 2008.
Základní vlastnosti
- Podporuje databázi MySQL.
- Kromě standardních pluginů (např. User Authentication) obsahuje také plugin Photo/Image Management, který umožňuje různé operace s obrázky.
- Pohled je soubor s příponou tmpl používající klasické HTML. Při vypisování dat se používají pseudoproměnné.
- K vytvořeným formulářům automaticky generuje validátor v JavaScriptu. Mimo to obsahuje i validace po odeslání formuláře, kterými jsou klasické metody na porovnání zadané délky řetězce, čísel, e-mailu, atd. Podporuje také možnost zapsat si vlastní regulární výraz do metody requireregexpmatch.
- Obsahuje některé standardní helpery – select box, seznam, javascript, paginátor, atd.
- Konfigurace a instalace se provádí v příkazové řádce, kde vyplníme název projektu, cestu k projektu, url adresu, název MySQL databáze. Pokud máme již databázi.
Dokumentace a uživatelská podpora
Dokumentace je psaná formou wiki. Je nedodělaná a připadá mi hodně nepřehledná. Člověk se pořád proklikává různými odkazy a ve výsledku zjišťuje, že na daných stránkách už několikrát byl a stále nezískal požadovanou informaci.
Pozitivní u FUSE je to, že na oficiálních stránkách frameworku [4] je video tutoriál. Ten mi výrazně pomohl při práci a nebýt tohoto tutoriálu, tak by FUSE ve srovnávacím testu vůbec nebylo.
Fórum na oficiálních stránkách [4] neoplývá zrovna velkou kapacitou řešených problémů. Při zobrazení všech témat se zobrazí pouze 4, takže v řešených situacích toho moc nenajdeme.
Ukázka zdrojových kódů
Ukázka pohledu:
1 <{form_script_tag}>
2 <{form_tag}>
3 <table style="margin-top: 2px;" border="1" cellpadding="10">
4 <tr>
5 <td>Name</td>
6 <td><{HTML/FormHelper::text_field('User', 'name') }></td>
7 </tr>
8 <tr>
9 <td colspan="2" style="text-align:center;">
10 <input type="submit" value="Save Changes" />
11 </td>
12 </tr>
13 </table>
14 </form>
Ukázka modelu:
1 <?php
2 FUSE::Require_class('Data/FuseDataModel');
3
4 class User extends FuseDataModel {
5
6 protected function _Init() {
7 }
8
9 }
10 ?>
Ukázka kontroleru:
1 <?php
2 FUSE::Require_class('AppControl/FuseDataController');
3
4 class UserController extends FuseDataController {
5
6 public function edit() {
7
8 FUSE::Require_model('User');
9 $user = new User;
10 $user->id = $this->get_param('id');
11
12 $this->set_redirect_success("edit", constant('SITE_BASE_URI') . "/User/List/?id=".$user->id_member);
13 parent::edit();
14 }
15 }
16 ?>
Výsledky testů bez použití eAcceleratoru
Akce | Vzorky | Průměr [ms] | Median [ms] | Min [ms] | Max [ms] | Sm. Odch. [ms] | Modus [ms] |
První test | |||||||
Zobrazení členů | 30 | 1468 | 750 | 141 | 9344 | 2065,44 | 141 |
Zobrazení uživatelů | 30 | 879 | 609 | 156 | 9719 | 1668,76 | 156 |
Editace uživatele | 30 | 923 | 672 | 203 | 2641 | 674,76 | 219 |
Upravení dat | 30 | 2556 | 2500 | 375 | 5250 | 1507,35 | 3765 |
Celkem | 120 | 1456 | 797 | 141 | 9719 | ||
Druhý test | |||||||
Zobrazení členů | 30 | 1084 | 500 | 140 | 16953 | 2967,39 | 281 |
Zobrazení uživatelů | 30 | 649 | 531 | 156 | 1579 | 415,07 | 156 |
Editace uživatele | 30 | 1098 | 984 | 203 | 2719 | 698,27 | 203 |
Upravení dat | 30 | 3015 | 2360 | 359 | 18250 | 3081,51 | N/A |
Celkem | 120 | 1461 | 922 | 140 | 18250 | ||
Třetí test | |||||||
Zobrazení členů | 30 | 955 | 453 | 141 | 11969 | 2084,76 | 625 |
Zobrazení uživatelů | 30 | 632 | 547 | 156 | 4078 | 686,85 | 156 |
Editace uživatele | 30 | 794 | 782 | 218 | 1875 | 451,23 | 219 |
Upravení dat | 30 | 3224 | 2235 | 359 | 13906 | 3137,19 | 375 |
Celkem | 120 | 1401 | 718 | 141 | 13906 |
Obr. 16. FUSE – průměrné časy jednotlivých akcí bez eAcceleratoru
Paměťové nároky: 4623.88 kB
Akce | Průměrný čas [ms] |
Výpis všech členů | 45,40 |
Jméno člena | 13,89 |
Všichni uživatelé člena | 13,49 |
Načtení jednoho uživatele | 0,83 |
Update dotaz | 751,56 |
Celkem | 106,67 |
Výsledky testů s použitím eAcceleratoru
Akce | Vzorky | Průměr [ms] | Median [ms] | Min [ms] | Max [ms] | Sm. Odch. [ms] | Modus [ms] |
První test | |||||||
Zobrazení členů | 30 | 232 | 219 | 78 | 719 | 112,46 | 234 |
Zobrazení uživatelů | 30 | 297 | 282 | 78 | 610 | 137,78 | 172 |
Editace uživatele | 30 | 608 | 594 | 125 | 1172 | 315,46 | 125 |
Upravení dat | 30 | 1449 | 1141 | 203 | 12531 | 2100,79 | 547 |
Celkem | 120 | 646 | 391 | 78 | 12531 | ||
Druhý test | |||||||
Zobrazení členů | 30 | 206 | 203 | 78 | 484 | 73,09 | 219 |
Zobrazení uživatelů | 30 | 270 | 266 | 78 | 469 | 99,60 | 219 |
Editace uživatele | 30 | 593 | 562 | 125 | 125 | 296,59 | 718 |
Upravení dat | 30 | 951 | 1031 | 203 | 1547 | 396,08 | 1125 |
Celkem | 120 | 505 | 328 | 78 | 1547 | ||
Třetí test | |||||||
Zobrazení členů | 30 | 510 | 109 | 62 | 5813 | 1333,53 | 78 |
Zobrazení uživatelů | 30 | 141 | 125 | 78 | 375 | 68,24 | 94 |
Editace uživatele | 30 | 238 | 203 | 125 | 1000 | 175,62 | 125 |
Upravení dat | 30 | 808 | 422 | 203 | 10218 | 1786,97 | 203 |
Celkem | 120 | 424 | 172 | 62 | 10218 |
Obr. 17. FUSE – průměrné časy jednotlivých akcí s eAcceleratorem.
Paměťové nároky:
Framework: 1618.57 kB
eAccelerator: 3665.92 kB
Celkem: 5284.49 kB
Zhodnocení
FUSE je velmi zajímavý framework, jehož nesmírnou výhodou je vygenerování celé kostry vyvíjené aplikace. Když se však podíváme na výše uvedené výsledky testů, tak zjistíme, že v rychlosti zpracovávání dat značně pokulhává. Při testu bez eAcceleratoru trvalo zobrazení členů (SELECT dotaz) kolem jedné sekundy a doba aktualizace uživatele (UPDATE dotaz) byla ještě třikrát delší. Se zapnutým eAceleratorem tyto časy sice klesly cca na 1/3 předchozích hodnot, ale stále se drží v relativně vysokých hodnotách.
PRADO
Framework je ke stažení ve verzích 3.x na www.pradosoft.com/download/. Poslední vydanou verzí je prozatím verze 3.1.2, která vyšla 21. dubna 2008.
PRADO není klasickým PHP frameworkem. Je založený na komponentovém přístupu a programování událostí. Inspiraci zřejmě hledal v Borland Delphi a ASP.NET.
Základní vlastnosti
- Podporuje následující databáze: MySQL 4.1+, PostgreSQL 7.3+, SQLite 2 a 3, MSSQL 2000+, Oracle (alpha).
- Pro přístup do databáze můžeme volit mezi PDO (PHP Data Objekt), Active Record nebo kompletního objektově mapového schéma SQLMap.
- Pohledy jsou soubory s příponou page, které obsahují kromě klasického HTML i další speciální objekty. U těchto objektů je možnost nastavit události podobně jako v JavaScriptu (onload, onclick,…). Speciální objekt může být např. tlačítko pro odeslání formuláře.
- Obsahuje validaci základních datových typů, dále je také možnost přidat k formuláři kontrolu CAPTCHA.
- Při tvorbě nového projektu je vhodné využít generátor adresářové struktury a základních konfiguračních souborů. Cesty k frameworku a adresářům projektu se nastavují v souboru index.php v adresáři projektu. Pro přístup do databáze je potřeba nakonfigurovat soubor application.xml v adresáři muj_projekt/protected.
Dokumentace a uživatelská podpora
V dokumentaci jsem toho moc nenalezl. Je psaná ve formě wiki a vypadá spíše jako ve stádiu vývoje. Orientace v ní není jednoduchá, byl jsem nucen používat výhradně vyhledávání.
Na stránkách [5] je velké množství dobře zpracovaných tutoriálů (HTML presentace i videa), které byly mým hlavním zdrojem informací při práci s tímto frameworkem.
PRADO má také velmi obsáhlé fórum a funkční IRC kanál. Na ten se lze připojit přímo na stránkách oficiálního fóra přes java aplikaci.
Ukázka zdrojových kódů
Ukázka pohledu:
1 <com:TForm>
2 <table border="1" cellpadding="10">
3 <tr>
4 <td>Jmeno:</td>
5 <td><com:TTextBox ID="jmenoEdit" Columns="50" /></td>
6 </tr>
7 <tr>
8 <td colspan="2" align="right">
9 <com:TButton Text="Save" OnClick="saveButtonClicked" />
10 <com:TButton Text="Cancel" OnClick="cancelButtonClicked" />
11 </td>
12 </tr>
13 </table>
14 </com:TForm>
Ukázka modelu:
1 <?php
2 class UserRecord extends TActiveRecord
3 {
4 const TABLE='users';
5
6 public $id_member;
7 public $ID;
8 public $name;
9 public $surname;
10
11 public static function finder($className=__CLASS__)
12 {
13 return parent::finder($className);
14 }
15 }
16 ?>
Ukázka kontroleru:
1 <?php
2 class listUsers extends TPage
3 {
4 public function onInit($param)
5 {
6 parent::onInit($param);
7 if(!$this->IsPostBack)
8 {
9 $this->Repeater->VirtualItemCount=UserRecord::finder()->count();
10 $this->clen_sdruzeni();
11 $this->populateData();
12 }
13 }
14 }
15 ?>
Výsledky testů bez použití eAcceleratoru
Akce | Vzorky | Průměr [ms] | Median [ms] | Min [ms] | Max [ms] | Sm. Odch. [ms] | Modus [ms] |
První test | |||||||
Zobrazení členů | 30 | 1175 | 594 | 125 | 15047 | 2614,44 | 172 |
Zobrazení uživatelů | 30 | 706 | 719 | 140 | 1563 | 400,71 | 140 |
Editace uživatele | 30 | 756 | 750 | 125 | 2078 | 466,41 | 125 |
Upravení dat | 30 | 1679 | 1656 | 266 | 3156 | 886,85 | N/A |
Celkem | 120 | 1079 | 781 | 125 | 15047 | ||
Druhý test | |||||||
Zobrazení členů | 30 | 730 | 703 | 156 | 1500 | 409,89 | 219 |
Zobrazení uživatelů | 30 | 650 | 547 | 140 | 1781 | 414,57 | 391 |
Editace uživatele | 30 | 673 | 641 | 125 | 2063 | 453,14 | 156 |
Upravení dat | 30 | 1819 | 1672 | 562 | 4062 | 905,25 | 2266 |
Celkem | 120 | 968 | 781 | 125 | 4062 | ||
Třetí test | |||||||
Zobrazení členů | 30 | 714 | 609 | 172 | 2016 | 444,32 | 172 |
Zobrazení uživatelů | 30 | 729 | 641 | 125 | 1515 | 389,78 | 406 |
Editace uživatele | 30 | 667 | 610 | 125 | 1547 | 380,64 | 297 |
Upravení dat | 30 | 1710 | 1672 | 421 | 3625 | 807,12 | N/A |
Celkem | 120 | 955 | 719 | 125 | 3625 |
Obr. 18. PRADO – průměrné časy jednotlivých akcí bez eAcceleratoru.
Paměťové nároky: 5669.42 kB
Akce | Průměrný čas [ms] |
Výpis všech členů | 8,13 |
Jméno člena | 70,98 |
Všichni uživatelé člena | 28,53 |
Načtení jednoho uživatele | 7,55 |
Update dotaz | 54,71 |
Celkem | 38,49 |
Výsledky testů s použitím eAcceleratoru
Akce | Vzorky | Průměr [ms] | Median [ms] | Min [ms] | Max [ms] | Sm. Odch. [ms] | Modus [ms] |
První test | |||||||
Zobrazení členů | 30 | 142 | 62 | 46 | 1437 | 269,17 | 47 |
Zobrazení uživatelů | 30 | 86 | 62 | 46 | 328 | 72,84 | 47 |
Editace uživatele | 30 | 53 | 47 | 31 | 125 | 24,68 | 47 |
Upravení dat | 30 | 221 | 125 | 93 | 1843 | 323,87 | 125 |
Celkem | 120 | 126 | 63 | 31 | 1843 | ||
Druhý test | |||||||
Zobrazení členů | 30 | 62 | 47 | 46 | 109 | 22,95 | 47 |
Zobrazení uživatelů | 30 | 56 | 62 | 47 | 63 | 7,66 | 47 |
Editace uživatele | 30 | 44 | 47 | 31 | 47 | 5,91 | 47 |
Upravení dat | 30 | 123 | 110 | 94 | 344 | 50,39 | 109 |
Celkem | 120 | 71 | 62 | 31 | 344 | ||
Třetí test | |||||||
Zobrazení členů | 30 | 68 | 47 | 47 | 125 | 28,63 | 47 |
Zobrazení uživatelů | 30 | 60 | 62 | 46 | 140 | 18,51 | 62 |
Editace uživatele | 30 | 47 | 47 | 31 | 110 | 14,50 | 47 |
Upravení dat | 30 | 136 | 109 | 93 | 625 | 94,81 | 109 |
Celkem | 120 | 78 | 62 | 31 | 625 |
Obr. 19. PRADO – průměrné časy jednotlivých akcí s eAcceleratorem.
Paměťové nároky:
Framework: 2097.29 kB
eAccelerator: 3532.80 kB
Celkem: 5630.09 kB
Zhodnocení
Na výše uvedených výsledcích můžeme vidět, jak velký vliv na rychlost frameworku může mít zapnutý eAccelerator. PRADO je s ním téměř desetkrát rychlejší než bez něj a jeho průměrné časy se následně pohybují pod hranicí 100 ms pro zobrazování dat a kolem 160 ms u aktualizace. Pokud však vezmeme samotný framework bez použití eAcceleratoru, tak jsou jeho časy hodně vysoko.
Příklad webu postaveného na tomto frameworku: www.discollective.com
Qcodo
Qcodo je ke stažení na qcodo.com/downloads/ ve dvou verzích: vývojová a stabilní.
Základní vlastnosti
- Podporuje databáze MySQL, MSSQL a PostgreSQL.
- Do databáze přistupuje prostřednictvím ORM.
- Obsahuje moduly pro generování kódu. Ihned po instalaci a zobrazení souboru index.php máme možnost nechat si vygenerovat všechny modely, kontrolery a pohledy.
- Pohledy jsou tvořeny převážně PHP kódem doplněným HTML tagy.
- Validace obsahuje rovněž klasické jako předchozí frameworky.
- Qcodo má velmi jednoduchou instalaci. Po rozbalení je potřeba nakonfigurovat soubor includes/configuration.inc.php, kde se nastavují cesty, url a databáze.
Dokumentace a uživatelská podpora
Dokumentace je slabý článek tohoto frameworku. Je docela nepřehledná, špatně se v ní orientuje a není moc obsáhlá. Spousta věcí v ní chybí. Obsahuje převážně spoustu vzorových příkladů i s kompletním zdrojovým kódem, což tak trochu kompenzuje výše zmíněné nedostatky. Na příkladech je tak předem vidět, co vše jde v Qcodu vytvořit, a také se z nich dá hodně pochopit a naučit. Tato procedura je však poněkud zdlouhavá.
Na stránkách Qcoda [6] nalezneme i nějaké video tutoriály a prezentace, které jsou taky velmi dobrým pomocníkem.
Oficiální fórum je docela živé a obsáhlé. Je vidět že je Qcodo docela oblíbené a podporované.
Ukázka zdrojových kódů
Ukázka pohledu:
1 <?php $this->RenderBegin() ?>
2 <div class="title_action"><?php _p($this->strTitleVerb); ?></div>
3 <div class="title"><?php _p("Úprava uživatele: ".$this->objUsers->Name." ".$this->objUsers->Surname); ?></div>
4 <br class="item_divider" />
5
6 <?php //$this->txtId->RenderWithName(); ?>
7 <br class="item_divider" />
8
9 <?php $this->txtName->RenderWithName(); ?>
10 <br class="item_divider" />
11 <?php $this->btnSave->Render() ?>
12 <?php $this->btnCancel->Render() ?>
13
14 <?php $this->RenderEnd() ?>
Ukázka modelu:
1 <?php
2 require(__DATAGEN_CLASSES__ . '/UsersGen.class.php');
3
4 class Users extends UsersGen {
5
6 public function __toString() {
7 return sprintf('Users Object %s', $this->intId);
8 }
9 }
10 ?>
Ukázka kontroleru:
1 <?php
2 require('wwwroot/includes/prepend.inc.php');
3 require(__FORMBASE_CLASSES__ . '/UsersListFormBase.class.php');
4 QApplication::CheckRemoteAdmin();
5
6 class UsersListForm extends UsersListFormBase {
7
8 protected $objMembers;
9 protected $strMemberName;
10
11 protected function Form_Create() {
12 parent::Form_Create();
13
14 $intId = QApplication::QueryString('intMemberId');
15 if (($intId)) {
16 $this->objMembers = Members::Load(($intId));
17 $this->strMemberName = QApplication::Translate($this->objMembers->Name);
18 }
19 $this->dtgUsers->SetDataBinder('dtgUsers_Bind');
20 }
21 }
22 UsersListForm::Run('UsersListForm', 'users_list.tpl.php');
23 ?>
Výsledky testů bez použití eAcceleratoru
Akce | Vzorky | Průměr [ms] | Median [ms] | Min [ms] | Max [ms] | Sm. Odch. [ms] | Modus [ms] |
První test | |||||||
Zobrazení členů | 30 | 173 | 140 | 63 | 1016 | 53,63 | 141 |
Zobrazení uživatelů | 30 | 210 | 172 | 78 | 688 | 57,98 | 78 |
Editace uživatele | 30 | 174 | 171 | 62 | 282 | 163,31 | 140 |
Upravení dat | 30 | 163 | 140 | 63 | 375 | 119,73 | 125 |
Celkem | 120 | 180 | 141 | 62 | 1016 | ||
Druhý test | |||||||
Zobrazení členů | 30 | 76 | 78 | 62 | 125 | 10,09 | 78 |
Zobrazení uživatelů | 30 | 84 | 79 | 78 | 94 | 12,57 | 78 |
Editace uživatele | 30 | 71 | 78 | 62 | 79 | 12,28 | 78 |
Upravení dat | 30 | 69 | 63 | 62 | 79 | 12,71 | 78 |
Celkem | 120 | 75 | 78 | 62 | 125 | ||
Třetí test | |||||||
Zobrazení členů | 30 | 77 | 78 | 62 | 110 | 13,26 | 78 |
Zobrazení uživatelů | 30 | 86 | 93 | 78 | 94 | 11,65 | 78 |
Editace uživatele | 30 | 73 | 78 | 62 | 79 | 11,78 | 78 |
Upravení dat | 30 | 72 | 78 | 62 | 79 | 10,33 | 78 |
Celkem | 120 | 77 | 78 | 62 | 110 |
Obr. 20. Qcodo – průměrné časy jednotlivých akcí bez eAcceleratoru.
Paměťové nároky: 3624.52 kB
Akce | Průměrný čas [ms] |
Výpis všech členů | 8,75 |
Jméno člena | 15,36 |
Všichni uživatelé člena | 1,11 |
Načtení jednoho uživatele | 14,35 |
Update dotaz | 18,47 |
Celkem | 11,29 |
Výsledky testů s použitím eAcceleratoru
Akce | Vzorky | Průměr [ms] | Median [ms] | Min [ms] | Max [ms] | Sm. Odch. [ms] | Modus [ms] |
První test | |||||||
Zobrazení členů | 30 | 57 | 16 | 15 | 750 | 14,21 | 15 |
Zobrazení uživatelů | 30 | 38 | 31 | 15 | 156 | 11,80 | 31 |
Editace uživatele | 30 | 29 | 31 | 15 | 141 | 138,44 | 15 |
Upravení dat | 30 | 24 | 31 | 15 | 46 | 12,46 | 31 |
Celkem | 120 | 37 | 31 | 15 | 750 | ||
Druhý test | |||||||
Zobrazení členů | 30 | 27 | 16 | 15 | 47 | 13,15 | 31 |
Zobrazení uživatelů | 30 | 36 | 32 | 16 | 63 | 10,91 | 31 |
Editace uživatele | 30 | 22 | 16 | 15 | 32 | 13,17 | 16 |
Upravení dat | 30 | 25 | 31 | 15 | 32 | 12,36 | 16 |
Celkem | 120 | 27 | 31 | 15 | 63 | ||
Třetí test | |||||||
Zobrazení členů | 30 | 24 | 16 | 15 | 47 | 11,57 | 16 |
Zobrazení uživatelů | 30 | 31 | 31 | 15 | 62 | 12,13 | 16 |
Editace uživatele | 30 | 26 | 31 | 15 | 47 | 8,38 | 31 |
Upravení dat | 30 | 21 | 16 | 15 | 32 | 9,28 | 31 |
Celkem | 120 | 26 | 31 | 15 | 62 |
Obr. 21. Qcodo – průměrné časy jednotlivých akcí s eAcceleratorem.
Paměťové nároky:
Framework: 1036.22 kB
eAccelerator: 2764.80 kB
Celkem: 3801.02 kB
Zhodnocení
Podíváme-li se na výsledky testu, tak zjistíme, že Qcodo je velmi rychlý framework. Průměrné časy bez eAcceleratoru se pohybují kolem 100 ms, z čehož nejvíce mě překvapila rychlost zapisování do databáze, tedy aktualizační dotaz. Při zapnutí eAcceleratoru hodnoty časů klesnou až někam do rozmezí 23 – 35 ms. Qcodo je zatím první framework, který má všechny časy téměř vyrovnané a s dotazem, se kterým se ostatní frameworky trápí nejvíce, má ze svých hodnot nejlepší výsledek.
Příklad webu postaveného na tomto frameworku: www.chess.com
V dalším díle bude dokončen test vybraných frameworků, můžete se těšit na oblíbený Zend a také na českou hvězdu framework Nette. Rovněž se dočkáte celkového porovnání či srovnání s čistým PHP a RoR.