Zend
Zend framework je ke stažení na framework.zend.com/download ve verzi 1.5.1 vydané 25. března 2008.
Základní vlastnosti
- Podporuje databáze MySQL, MSSQL, SQLite, Oracle, PostgreSQL, IBM DB2.
- Pro přístup do databáze využívá PDO.
- Součástí Zendu je celá řada modulů, např. ověřování práv (Zend_Acl), posílání emailů (Zend_Mail) nebo tvorba PDF dokumentů (Zend_Pdf).
- Pohledy můžou být klasické soubory tvořeny kombinací HTML a PHP mající příponu phtml, nebo lze využít i šablonovací systém SMARTY.
- Obsahuje i nadstandardní validační metody, jako např. ověření, zda jde o: IP adresu, hexadecimální číslo nebo datum. Nabízí také možnost zadání regulárního výrazu.
- Obsahuje standardní helpery.
- Konfiguraci můžeme provést dvěma způsoby, a to v souboru INI nebo XML. Pro načtení dat z těchto souborů následně využijeme třídu Zend_Config_Ini, popř. Zend_Config_Xml.
Dokumentace a uživatelská podpora
Dokumentace je u Zendu velmi propracovaná a snadno se v ní orientuje. Je také doplněna velkým množstvím příkladů. Na stránkách Zendu nalezneme i různé video tutoriály a prezentace.
Tento framework je celosvětově velmi rozšířený a komunita kolem něj je obrovská. Na internetu tak existují velká fóra v různých jazycích, jež jsou naplněna řešenými problémy.
Zend má velké zastoupení i mezi českými vývojáři. Lze tedy najít mnoho návodů a řešených problémů právě v češtině.
Ukázka zdrojových kódů
Ukázka pohledu:
1 <table cellspacing = "10" border="1" cellpadding = "5">
2
3 <?php foreach($this->useri as $user) : ?>
4 <tr>
5 <td><?php echo $this->escape($user->ID);?></td>
6 <td><?php echo $this->escape($user->name)." ".$this->escape($user->surname);?></td>
7 <td><?php echo $this->escape($user->email);?></td>
8 <td><?php echo $this->escape($user->phone);?></td>
9 <td>
10 <a href="<?php echo $this->baseUrl; ?>/users/edit/id/<?php
11 echo $user->ID.'/id_clena/'.$user->id_member;?>">Edit</a>
12 </td>
13 </tr>
14 <?php endforeach; ?>
15 </table><br />
16 <a href="<?php echo $this->baseUrl; ?>/index">Zpět na seznam členů</a>
Ukázka modelu:
1 <?php
2
3 class Users extends Zend_Db_Table
4 {
5 protected $_name = 'users';
6 }
7 ?>
Ukázka kontroleru:
1 <?php
2 require_once 'Zend/Controller/Action.php';
3 require_once 'Zend/Session/Namespace.php';
4 require_once 'Zend/Form.php';
5 require_once 'Zend/Form/Element/Text.php';
6
7 class UsersController extends Zend_Controller_Action
8 {
9 function indexAction()
10 {
11
12 $useri = new Users();
13 $id = (int)$this->_request->getParam('id', 0);
14 $member = new Members();
15 $this->view->member = $member->fetchRow('ID='.$id);
16 $this->view->title = "Uživatelé člena ".$this->view->member->name;
17 $namespace = new Zend_Session_Namespace();
18 if (isset($namespace->vypis))
19 {
20 $this->view->vypis = $namespace->vypis;
21 unset($namespace->vypis);
22 }
23
24 if ($id > 0) $this->view->useri = $useri->fetchAll('id_member='.$id);
25 }
26 }
27 ?>
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 | 1016 | 843 | 171 | 2437 | 745,03 | 375 |
Zobrazení uživatelů | 30 | 1260 | 531 | 156 | 19000 | 3329,90 | 281 |
Editace uživatele | 30 | 1177 | 672 | 171 | 12641 | 2185,80 | 172 |
Upravení dat | 30 | 1805 | 1953 | 328 | 4359 | 939,39 | 344 |
Celkem | 120 | 1314 | 859 | 156 | 19000 | ||
Druhý test | |||||||
Zobrazení členů | 30 | 1210 | 547 | 171 | 15547 | 2708,54 | 375 |
Zobrazení uživatelů | 30 | 703 | 578 | 157 | 1890 | 463,98 | 328 |
Editace uživatele | 30 | 1120 | 640 | 156 | 14343 | 2488,68 | 344 |
Upravení dat | 30 | 1343 | 1250 | 343 | 2860 | 683,33 | 672 |
Celkem | 120 | 1094 | 688 | 156 | 15547 | ||
Třetí test | |||||||
Zobrazení členů | 30 | 973 | 766 | 203 | 2969 | 681,26 | 344 |
Zobrazení uživatelů | 30 | 981 | 1032 | 157 | 2578 | 567,52 | 297 |
Editace uživatele | 30 | 1002 | 843 | 172 | 2406 | 665,41 | 610 |
Upravení dat | 30 | 2023 | 2109 | 500 | 4250 | 1020,15 | 2953 |
Celkem | 120 | 1245 | 1062 | 157 | 4250 |
Obr. 22. Zend – průměrné časy jednotlivých akcí bez eAcceleratoru
Paměťové nároky: 6538.49 kB
Akce | Průměrný čas [ms] |
Výpis všech členů | 17,72 |
Jméno člena | 44,34 |
Všichni uživatelé člena | 9,89 |
Načtení jednoho uživatele | 103,35 |
Update dotaz | 8,98 |
Celkem | 34,07 |
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 | 97 | 62 | 46 | 843 | 140,67 | 47 | |
Zobrazení uživatelů | 30 | 48 | 47 | 31 | 94 | 13,51 | 47 | |
Editace uživatele | 30 | 42 | 47 | 31 | 63 | 10,61 | 47 | |
Upravení dat | 30 | 118 | 94 | 63 | 407 | 79,68 | 78 | |
Celkem | 120 | 76 | 62 | 31 | 843 | |||
Druhý test | ||||||||
Zobrazení členů | 30 | 59 | 62 | 46 | 78 | 11,72 | 62 | |
Zobrazení uživatelů | 30 | 47 | 47 | 31 | 63 | 5,68 | 47 | |
Editace uživatele | 30 | 46 | 47 | 31 | 63 | 8,44 | 47 | |
Upravení dat | 30 | 92 | 94 | 78 | 141 | 13,43 | 94 | |
Celkem | 120 | 61 | 47 | 31 | 141 | |||
Třetí test | ||||||||
Zobrazení členů | 30 | 73 | 63 | 46 | 125 | 27,28 | 47 | |
Zobrazení uživatelů | 30 | 48 | 47 | 31 | 93 | 13,69 | 47 | |
Editace uživatele | 30 | 52 | 47 | 31 | 94 | 14,27 | 47 | |
Upravení dat | 30 | 98 | 94 | 62 | 156 | 17,16 | 94 | |
Celkem | 120 | 68 | 62 | 31 | 156 |
Obr. 23. Zend – průměrné časy jednotlivých akcí s eAcceleratorem.
Paměťové nároky:
Framework: 1228.24 kB
eAccelerator: 4536.32 kB
Celkem: 5764.56 kB
Zhodnocení
Ačkoli je Zend velmi populární a nabízí mnoho zajímavých možností, rychlosti přístupu do databáze bez použití eAcceleratoru jsou propastné. Podle výše uvedených skutečností potřebuje pro zobrazení dat průměrný čas kolem 1 s, a pro aktualizaci až 1,7 s. Jakmile zapneme eAccelerator, tak se jeho výkon několikanásobně zvedne a najednou se objevuje v průměrném časovém rozmezí 40–100 ms.
Příklad webu postaveného na tomto frameworku: www.vysledky.cz nebo www.shopio.cz
Nette
Jedná se o framework českého autora, který je stále ve fázi vývoje. Je dostupný na nettephp.com/cs/download ve verzi 0.7 vydané 17. července 2008.
Základní vlastnosti
- Pro práci s databází používá knihovnu dibi, což je databázová vrstva určená pro PHP 5.
- Prozatím neobsahuje žádné speciální moduly, kromě modulu pro autorizaci a práva.
- Pohledy používají vlastní šablonovací systém.
- Základní validační pravidla.
- Našel jsem pouze helper pro (X)HTML prvky – Nette::Web::Html.
- Konfigurace úpravou INI souborů a PHP souborů.
Dokumentace a uživatelská podpora
Jelikož framework teprve před pár měsíci oficiálně spatřil světlo světa, jeho dokumentace ještě není na takové úrovni, aby se s ním dalo efektivně pracovat. Na stránkách najdeme jen několik málo příkladů a API reference, takže se o nějaké dokumentaci skoro nedá ani mluvit. Rovněž nečekejte nějakou velkou komunitu či návody, jak co vytvořit.
Ukázka zdrojových kódů
Ukázka pohledu:
1 <h1>{$title}</h1>
2 <table border="1" cellspacing="5">
3 <tr>
4 <th>Id</th>
5 <th>Jmeno</th>
6 <th>Email</th>
7 <th>Telefon</th>
8 <th>Akce</th>
9 </tr>
10 {foreach $users as $user}
11 <tr>
12 <td>{$user->ID}</td>
13 <td>{$user->name} {$user->surname}</td>
14 <td>{$user->email}</td>
15 <td>{$user->phone}</td>
16 <td>
17 <a href="{$component->link('edit', $user->ID)}">Edit</a>
18 </td>
19 </tr>
20 {/foreach}
21 </table>
Ukázka modelu:
1 class Members extends DibiTable
2 {
3
4 public function get_member_name($id=0)
5 {
6 $row = $this->fetch(array('id' => $id));
7 return $row->name;
8 }
9 }
Ukázka kontroleru:
1 public function handleSave($id = 0)
2 {
3 $request = $this->request;
4 if (!$request->isPost()) return;
5
6
7
8 if ($id !== 0) {
9 $data = array(
10 'name' => trim($request->post['name']),
11 'surname' => trim($request->post['surname']),
12 'phone' => trim($request->post['phone']),
13 'email' => trim($request->post['email']));
14 $user = new Users();
15 $user->update($id, $data);
16
17 $this->redirect('default/'.$request->post['id_member']);
18 }
Výsledky testů bez použití eAcceleratoru
U všech testů byla použita vícesouborová verze knihovny dibi.
Akce | Vzorky | Průměr [ms] | Median [ms] | Min [ms] | Max [ms] | Sm. Odch. [ms] | Modus [ms] |
První test | |||||||
Zobrazení členů | 30 | 80 | 63 | 47 | 281 | 42,48 | 62 |
Zobrazení uživatelů | 30 | 66 | 62 | 46 | 172 | 26,17 | 62 |
Editace uživatele | 30 | 81 | 63 | 46 | 235 | 49,71 | 62 |
Upravení dat | 30 | 173 | 125 | 109 | 625 | 107,24 | 125 |
Celkem | 120 | 100 | 63 | 46 | 625 | ||
Druhý test | |||||||
Zobrazení členů | 30 | 68 | 63 | 47 | 109 | 17,73 | 62 |
Zobrazení uživatelů | 30 | 59 | 62 | 47 | 78 | 8,10 | 63 |
Editace uživatele | 30 | 59 | 62 | 47 | 63 | 5,79 | 62 |
Upravení dat | 30 | 124 | 125 | 109 | 235 | 26,58 | 125 |
Celkem | 120 | 78 | 63 | 47 | 235 | ||
Třetí test | |||||||
Zobrazení členů | 30 | 88 | 63 | 47 | 562 | 91,13 | 62 |
Zobrazení uživatelů | 30 | 71 | 62 | 46 | 281 | 48,85 | 63 |
Editace uživatele | 30 | 76 | 63 | 46 | 281 | 47,66 | 63 |
Upravení dat | 30 | 157 | 125 | 109 | 500 | 75,04 | 125 |
Celkem | 120 | 98 | 63 | 46 | 562 |
Obr. 24. Nette – průměrné časy jednotlivých akcí bez eAcceleratoru.
Paměťové nároky: 2432.74 kB
Akce | Průměrný čas [ms] |
Výpis všech členů | 2,26 |
Jméno člena | 8,52 |
Všichni uživatelé člena | 1,05 |
Načtení jednoho uživatele | 0,42 |
Update dotaz | 10,55 |
Celkem | 4,62 |
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 | 29 | 16 | 15 | 219 | 36,24 | 32 |
Zobrazení uživatelů | 30 | 26 | 16 | 15 | 47 | 13,51 | 16 |
Editace uživatele | 30 | 24 | 16 | 15 | 47 | 10,89 | 16 |
Upravení dat | 30 | 75 | 47 | 31 | 907 | 154,93 | 47 |
Celkem | 120 | 39 | 31 | 15 | 907 | ||
Druhý test | |||||||
Zobrazení členů | 30 | 30 | 16 | 15 | 187 | 32,34 | 16 |
Zobrazení uživatelů | 30 | 22 | 16 | 15 | 47 | 9,68 | 16 |
Editace uživatele | 30 | 23 | 16 | 15 | 47 | 9,72 | 16 |
Upravení dat | 30 | 45 | 47 | 31 | 63 | 8,30 | 47 |
Celkem | 120 | 30 | 31 | 15 | 187 | ||
Třetí test | |||||||
Zobrazení členů | 30 | 31 | 16 | 15 | 219 | 36,82 | 16 |
Zobrazení uživatelů | 30 | 18 | 16 | 15 | 31 | 6,17 | 16 |
Editace uživatele | 30 | 19 | 16 | 15 | 47 | 8,19 | 16 |
Upravení dat | 30 | 46 | 47 | 31 | 172 | 24,27 | 47 |
Celkem | 120 | 29 | 16 | 15 | 219 |
Obr. 25. Nette – průměrné časy jednotlivých akcí s eAcceleratorem.
Paměťové nároky:
Framework: 658.71 kB
eAccelerator: 1658.87 kB
Celkem: 2317.59 kB
Zhodnocení
Nette framework byl, a dá se říci, že stále je, nejočekávanějším frameworkem české PHP scény. Při práci v Nette jsem narazil na několik úskalí, kde mi chyběla dokumentace a musel jsem improvizovat a zkoušet, což zabralo dost času. Právě dokumentace je největší slabinou tohoto frameworku. Jako svou velkou výhodu uvádí Nette možnost práce s jmennými prostory (v prezentacích je uvedeno, že se jedná o první PHP framework s podporou jmenných prostorů, ale stále čeká na uvolnění PHP 5.3, ve kterém je možnost práce s namespaces). Jako další přednost uvádí používání routování, které se stará o převod URL adres. Příklad nastavení routování:
1 $router[] = new Route('<presenter>/<view>/<id>', array(
2 'presenter' => 'Members',
3 'view' => 'Show',
4 'id' => NULL,
5 ));
Jako plus bych viděl přehledné zpracování chybových hlášení, i když v některých případech jsem měl stále problémy s nalezením oznamované chyby.Příklad webu postaveného na tomto frameworku: www.bomba.cz nebo www.oh24.cz
Čisté PHP
Pro srovnání byla naprogramována testovací aplikace také s použitím čistého PHP. Časy u verzí s eAcceleratorem i bez něj byly téměř totožné, proto zde budou uvedeny pouze testy s vypnutým eAcceleratorem.
Akce | Vzorky | Průměr [ms] | Median [ms] | Min [ms] | Max [ms] | Sm. Odch. [ms] | Modus [ms] | |
První test | ||||||||
Zobrazení členů | 30 | 4 | 0 | 0 | 16 | 6,91 | 0 | |
Zobrazení uživatelů | 30 | 5 | 0 | 0 | 16 | 7,58 | 0 | |
Editace uživatele | 30 | 2 | 0 | 0 | 16 | 5,74 | 0 | |
Upravení dat | 30 | 44 | 31 | 15 | 453 | 78,40 | 31 | |
Celkem | 120 | 14 | 0 | 0 | 453 | |||
Druhý test | ||||||||
Zobrazení členů | 30 | 6 | 0 | 0 | 16 | 7,60 | 0 | |
Zobrazení uživatelů | 30 | 1 | 0 | 0 | 50 | 4,50 | 0 | |
Editace uživatele | 30 | 4 | 0 | 0 | 16 | 7,13 | 0 | |
Upravení dat | 30 | 37 | 16 | 15 | 484 | 83,25 | 16 | |
Celkem | 120 | 12 | 0 | 0 | 484 | |||
Třetí test | ||||||||
Zobrazení členů | 30 | 6 | 0 | 0 | 31 | 8,65 | 0 | |
Zobrazení uživatelů | 30 | 1 | 0 | 0 | 16 | 4,70 | 0 | |
Editace uživatele | 30 | 4 | 0 | 0 | 15 | 6,63 | 0 | |
Upravení dat | 30 | 36 | 16 | 15 | 469 | 80,62 | 16 | |
Celkem | 120 | 12 | 0 | 0 | 469 |
Obr. 26. Průměrné časy zpracovávaných akcí při použití čistého PHP
Akce | Průměrný čas [ms] |
Výpis všech členů | 0,20 |
Jméno člena | 0,20 |
Všichni uživatelé člena | 0,38 |
Načtení jednoho uživatele | 0,40 |
Update dotaz | 1,41 |
Celkem | 0,45 |
Zhodnocení
Čisté PHP využívá 55,57 kB paměti. Výše uvedené výsledky můžeme považovat za minimální dosažitelné na daném testovacím zařízení.
Ruby On Rails
Na závěr jsem stejnou aplikaci napsal v populárním frameworku Ruby On Rails, který ovšem není pro PHP, ale jak již název napovídá, běží pod jazykem Ruby. Pro tento srovnávací test jsem se rozhodl zejména díky stále větší popularitě tohoto programovacího jazyka, a také jsem se s ním chtěl konečně seznámit.
Ukázka zdrojových kódů
Ukázka pohledu:
1 <h1><%= @title %></h1>
2 <p style="color: green"><%= flash[:notice] %></p>
3 <table border="1" cellspacing="5">
4 <tr>
5 <th>Id</th>
6 <th>Jmeno</th>
7 <th>Email</th>
8
9 <th>Telefon</th>
10 <th>Akce</th>
11 </tr>
12
13 <% for users in @users %>
14 <tr>
15 <td><%= users.id %></td>
16 <td><%=h users.name+' '+users.surname %></td>
17 <td><%=h users.email %></td>
18 <td><%=h users.phone %></td>
19 <td><%= link_to 'Edit', '/users/edit/'+users.id.to_s %></td>
20 </tr>
21 <% end %>
22 </table>
Ukázka kontroleru:
1 class UsersController < ApplicationController
2
3 def index
4 @users = Users.find(:all, :conditions => [ "id_member = ?", params[:id]])
5 @member_name = Members.find(params[:id]).name
6 @title = 'Uživatelé člena ' + @member_name
7 end
8
9 def edit
10 @users = Users.find(params[:id])
11 @member_name = Members.find(@users.id_member).name
12 @title = 'Editace uživatele ' + @users.name + ' ' + @users.surname
13 end
14
15 def update
16 @users = Users.find(params[:id])
17
18 if @users.update_attributes(params[:users])
19 flash[:notice] = 'Users was successfully updated.'
20 redirect_to('/users/index/'+@users.id_member.to_s)
21 else
22 render :action => "edit"
23 end
24 end
25 End
Ukázka modelu:
1 class Users < ActiveRecord::Base 2 end
Akce | Vzorky | Průměr [ms] | Median [ms] | Min [ms] | Max [ms] | Sm. Odch. [ms] | Modus [ms] |
První test | |||||||
Zobrazení členů | 30 | 327 | 328 | 188 | 453 | 77,21 | 297 |
Zobrazení uživatelů | 30 | 345 | 312 | 203 | 500 | 72,19 | 297 |
Editace uživatele | 30 | 189 | 188 | 94 | 297 | 42,68 | 172 |
Upravení dat | 30 | 539 | 546 | 235 | 906 | 126,69 | 500 |
Celkem | 120 | 350 | 313 | 94 | 906 | ||
Druhý test | |||||||
Zobrazení členů | 30 | 331 | 328 | 203 | 453 | 80,61 | 297 |
Zobrazení uživatelů | 30 | 380 | 406 | 296 | 500 | 65,99 | 406 |
Editace uživatele | 30 | 187 | 187 | 78 | 422 | 66,77 | 187 |
Upravení dat | 30 | 520 | 547 | 218 | 813 | 148,46 | 500 |
Celkem | 120 | 355 | 360 | 78 | 813 | ||
Třetí test | |||||||
Zobrazení členů | 30 | 340 | 312 | 203 | 500 | 74,02 | 297 |
Zobrazení uživatelů | 30 | 343 | 390 | 188 | 500 | 71,22 | 297 |
Editace uživatele | 30 | 177 | 187 | 47 | 282 | 59,34 | 203 |
Upravení dat | 30 | 539 | 532 | 297 | 813 | 132,22 | 532 |
Celkem | 120 | 350 | 312 | 47 | 813 |
Obr. 27. Průměrné časy zpracovávaných akcí při použití Ruby On Rails
Zhodnocení
Programování v Ruby je jednoduché, avšak někdy mi chyběly funkce, na které jsem zvyklý z PHP. Rychlost RoR bych označil za průměrnou. Díky tomu, že je teď o Ruby obecně veliký zájem, je na internetu možno nalézt spoustu materiálů a návodů, které se hojně vyskytují i v českém znění. Tento test byl přidán opravdu jen jako letmé srovnání s jinou, poměrně novou technologií.
Příklad webu postaveného na tomto frameworku: www.shopify.com
Srovnání naměřených výsledků
V této kapitole budou, na základě výše uvedených testů, srovnány jednotlivé frameworky mezi sebou.
Srovnání rychlostí
Hodnoty uváděné v této kapitole byly dosaženy zprůměrňováním výsledků všech tří prováděných testů. Při pohledu na níže uvedený graf (obr. 28) vidíme, že výraznější problémy s rychlostí má hned několik frameworků, jejichž průměrný čas překračuje jednu vteřinu. Patří mezi ně Akelos, Fuse, Prado a překvapivě také Zend. Frameworku Fuse přitom nepomohl ani zapnutý eAccelerator. Ostatní testované frameworky si v tomto testu vedly výborně, a proto bych se pro reálnou aplikaci nebál nasazení kteréhokoliv z nich. Pro srovnání můžeme opět vidět, jak jsou na tom oproti čistému PHP či RoR.
Obr. 28. Celkové srovnání rychlostí jednotlivých frameworků
Při pohledu na graf je zřejmé, že v testu bez zapnutého eAcceleratoru dominuje Jelix s časem 68 ms. Ten je těsně následován frameworkem Nette, CodeIgniterem, Kohanou a Qcodem. Při zapnutí eAcceleratoru můžeme sledovat výrazné snížení časů u všech frameworků. Toto snížení je nejvíce znatelné u pomalejších frameworků. Při zapnutém eAcceleratoru se na první místo v našem rychlostním testu dostává Qcodo. O několik milisekund za ním se umisťuje CakePHP a Nette.
Průběh rychlostí v jednotlivých krocích testu
Při testování byly zaznamenávány dosažené časy v jednotlivých krocích. Díky tomu můžeme pozorovat, jak se měnila rychlost jednotlivých frameworků při připojení více uživatelů a tím způsobené hromadění některých požadavků. Zobrazená data jsou opět vypočítána jako průměr ze tří provedených měření.
Obr. 29. Průběh rychlostí v jednotlivých krocích – vypnutý eAccelerátor
Na uvedeném grafu můžeme zřetelně pozorovat vývojovou křivku Fuse, Zendu a Akelosu. V určitých momentech se tyto frameworky dostávají do svého maxima, které se blíží sedmi vteřinám. Po prozkoumání této abnormální odchylky bylo zjištěno, že v kritických krocích rapidně narostl čas potřebný ke zpracování a dosahoval až hodnot blížících se k 18 sekundám. To mohlo být způsobeno nějakým neidentifikovatelným zatížením počítače, na kterém běžely testované stránky, nebo se jednalo o prosté přetížení daného frameworku. Z grafu můžeme vidět, že s rostoucím počtem požadavků klesala rychlost většiny frameworků, což je pochopitelné. Největší vliv na rychlost mělo nahromadění požadavků na úpravu uživatele.
Obr. 30. Průběh rychlostí v jednotlivých krocích – bez pomalejších frameworků
Rozhodl jsem se znovu vložit graf, který jste mohli vidět na obr. 29 z důvodu, že pomalejší frameworky dosahovaly výrazně vyšších hodnot než jiné, a proto nebyly dostatečně vidět jejich průběhy. Pokud se podíváme na výkon ostatních frameworků zobrazený na obr. 30, vidíme, že nejhůře z tohoto výběru je na tom CakePHP. Naproti tomu ostatní se drží pod hranicí 200 ms a nevykazují žádné větší odchylky z normálu (až na několik hodnot u začátku). U CakePHP můžeme pozorovat kolísání při různém počtu požadavků. Při zkoumání příčiny výkyvů bylo zjištěno, že se ve většině případů jedná o UPDATE dotazy, které jsou slabinou každého ze zkoumaných objektů.
Na grafu níže (obr. 31) je zobrazeno porovnání rychlostí v jednotlivých krocích, tentokrát však se zapnutým eAcceleratorem (v grafu byl vynechán framework Fuse, který se pohyboval ve vysokých hodnotách a znemožňoval čitelnost zbytku grafu). Téměř pravidelné odchylky jsou způsobeny UPDATE dotazy. Ostatní data se prakticky v převážné míře načítají z cache paměti akcelerátoru, tudíž je jejich vykreslovací čas nízký. Na začátku hodnoty dosahují vyšších časů, protože ještě nejsou načteny do cache paměti.
Obr. 31. Průběh rychlostí v jednotlivých krocích – zapnutý eAccelerator
Srovnání paměťových nároků
Kromě rychlosti jednotlivých frameworků hraje důležitou roli také jejich paměťová náročnost. Jednotlivé paměťové nároky jsme mohli vidět v předchozích kapitolách u každého s frameworků. Zde bude uvedeno jejich vzájemné porovnání. Měření probíhalo v druhém kroku testu (více v kapitole 1.1.1).
V případě zapnutého eAcceleratoru byla výsledná velikost alokované paměti vypočítána jako součet paměti alokované frameworkem a paměti, kterou využíval samotný eAccelerator.
Jak můžeme vidět, samotné zapnutí eAcceleratoru nemá žádný podstatný negativní vliv na celkové paměťové nároky. Z grafu je vidět, že několik frameworků se dostává nad hranici 5 MB, ostatní se drží v přijatelných mezích. U CodeIgniteru, Jelixu a Kohany dokonce vidíme využití paměti jen něco okolo 1 MB. Musíme však pamatovat, že toto využití paměti je měřeno při standardní konfiguraci frameworků a nejsou zde používány žádné speciální moduly. Například při použití forge modulu v Kohaně využití paměti vzroste o několik stovek kilobajtů.
Obr. 32. Využití paměti u jednotlivých frameworků
Závěr
Ucelený test PHP frameworků je dosti vyhledávanou a unikátní věcí mezi PHP komunitou. Často kolují i určité mýty o tom, jak který framework vytěžuje systém a jak je rychlý. Z toho důvodu byl učiněn tento test.
Bylo vybráno několik frameworků, které jsou známé mezi PHP komunitou. Kvůli časové náročnosti, která je zapříčiněna hlavně nutností alespoň základního nastudování každého z frameworků, jich není otestováno více. V průběhu testování vycházely nové verze vybraných frameworků, či frameworky úplně nové. U testů může člověk pracující s daným frameworkem a znalý jeho detailů namítat, že některé z uvedených skutečností nejsou pravdivé. Pokud daný framework zná a pracuje s ním třeba několik let, je samozřejmé, že o něm ví více informací, než které byly zjištěny za několik týdnů testování. Informace zde uvedené jsou čerpány z krátkodobých zkušeností s danými frameworky, jejich testů, údajů nalezených na jejich oficiálních stránkách a částečně také z nejrůznějších diskusních fór.
Tento test vznikl také proto, že jsme sami hledali vhodný framework pro realizaci složitější aplikace pro správu a evidenci uživatelů rozsáhlých sítí a jejich zařízení. Pro realizaci tohoto projektu jsme osobně zvolili framework Kohana. Tato volba byla uskutečněna zejména díky jeho jednoduchosti, která je vhodná pro naučení se práce s frameworkem. Také jeho vysoká rychlost, nízké paměťové nároky a přehledná dokumentace byly jedním z hlavních argumentů pro jeho zvolení. Důležité bylo, že se v Kohaně dalo bez problému realizovat kompletní zadání se všemi požadavky.
Do budoucna jistě vyjdou nové verze testovaných frameworků, které budou opravovat jejich stávající nedostatky, kterými ve většině případů není ani framework samotný, ale spíše jeho dokumentace. Příkladem toho může být v Čechách hodně diskutovaný framework Nette. Ten dosahuje slušných rychlostí, ale kvůli jeho zatím nedostatečné dokumentaci je rozsáhlejší práce s ním takřka nemožná. Nezbývá nám, než se nechat překvapit, co nového nám přinese budoucnost vývoje frameworků, či zda vývojáři nepřejdou na úplně jiné technologie, než je PHP.