Velký test PHP frameworků: Fuse, Prado a Qcodo

4. 9. 2008
Doba čtení: 10 minut

Sdílet

Pokud jste nevynechali žádný z dílů tohoto seriálu, tak již víte, jak je na tom pětice známých frameworků. Dnes si rozšíříme obzory a do naší základní pětice přidáme frameworky Fuse, Prado a Qcodo. Tyto frameworky nepatří mezi ty nejznámější, ale o to zajímavější a přínosnější budou jejich testy.

FUSE

Tento framework je ke stažení na stránkách www.phpfuse.net/Dow­nload/. 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

Tab. XVI. FUSE – výsledky testů bez 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

Graf 1

Obr. 16. FUSE – průměrné časy jednotlivých akcí bez eAcceleratoru

Paměťové nároky: 4623.88 kB

Tab. XVII. Rychlosti práce s databází – FUSE
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

Tab. XVIII. FUSE – výsledky testů s eAcceleratorem.
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

Graf2

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/pro­tected.

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

Tab. XIX. PRADO – výsledky testů bez 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

Graf3

Obr. 18. PRADO – průměrné časy jednotlivých akcí bez eAcceleratoru.

Paměťové nároky: 5669.42 kB

Tab. XX. Rychlosti práce s databází – PRADO
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

Tab. XXI. PRADO – výsledky testů s eAcceleratorem
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

Graf4

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.discollec­tive.com

Qcodo

Qcodo je ke stažení na qcodo.com/dow­nloads/ 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/confi­guration.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

Tab. XXII. Qcodo – výsledky testů bez 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

Graf5

Obr. 20. Qcodo – průměrné časy jednotlivých akcí bez eAcceleratoru.

Paměťové nároky: 3624.52 kB

Tab. XXIII. Rychlosti práce s databází – Qcodo
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

Tab. XXIV. Qcodo – výsledky testů s eAcceleratorem
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

Graf6

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.

ict ve školství 24

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.

Autor článku