ORM test PHP frameworků – CakePHP, CodeIgniter

V prvním díle tohoto seriálu jsme se seznámili se základní problematikou, s postupem a nástroji použitými pro testování. A zde se podíváme na jednoduché informace a výsledky frameworků CakePHP a CodeIgniter.
Seriál: ORM test PHP frameworků (9 dílů)
- Spouštíme letní ORM test PHP frameworků 3. 7. 2013
- ORM test PHP frameworků – CakePHP, CodeIgniter 10. 7. 2013
- ORM test PHP frameworků – DooPHP, Jelix 17. 7. 2013
Nálepky:
CakePHP 2.2.5
CakePHP patří mezi PHP frameworky používané pro tvorbu webových aplikací. Ve své základní struktuře využívá velké množství vlastností z Ruby on Rails. Je zaměřen na rychlý vývoj celé aplikace při využití návrhového vzoru MVC. Jeho struktura je srozumitelně uspořádána a tím je zajištěna i snadná orientace v celém kódu. Poskytuje velké množství nástrojů používaných například pro jednoduché ověřování uživatelů nebo důkladnou validaci vstupních dat. Komunikuje s téměř všemi nejpoužívanějšími typy databází a při jejich obsluze využívá ActiveRecord.
Vlastnosti:
- srozumitelná struktura
- jednoduché přidávání validací
- programování v PHP a HTML
- využívá Model-View-Controller strukturu
- využívá ActiveRecord
- propojení s nejpoužívanějšími databázemi
- snadná rozšiřitelnost
Požadavky pro použitou verzi:
- HTTP server
- PHP 5.2.8 nebo vyšší
- databáze MySQL, Microsoft SQL server, SQLite, Postgre SQL
Dokumentace a podpora:
Díky jeho velké popularitě lze nalézt velké množství již hotových ukázkových aplikací nebo výukové kusy kódu. Na oficiálních stránkách lze informace čerpat z velmi rozsáhlé dokumentace, která je rozdělena na část věnovanou jednotlivým funkcím a část zabývající se návody a postupy. K dispozici jsou i stránky na nejpoužívanějších sociálních sítích a fórech a IRC kanál.
Výsledky testů:
- Test výběr (SELECT)
Test | Požadavků | Průměr [ms] | Medián [ms] | Min [ms] | Max [ms] | Prům. rychlost [KB/s] | Odchylka [ms] |
1. Měření | 3000 | 1524 | 1570 | 136 | 3709 | 1902,3 | 391 |
2. Měření | 3000 | 1479 | 1539 | 159 | 2896 | 1928,3 | 346 |
3. Měření | 3000 | 1596 | 1592 | 138 | 5631 | 1763,6 | 544 |
Průměr | 3000 | 1533,0 | 1567,0 | 144,3 | 4078,7 | 1864,7 | 427,0 |
- Test vložení (INSERT)
Test | Požadavků | Průměr [ms] | Medián [ms] | Min [ms] | Max [ms] | Prům. rychlost [KB/s] | Odchylka [ms] |
1. Měření | 3000 | 1493 | 1509 | 156 | 2992 | 33,6 | 410 |
2. Měření | 3000 | 1147 | 1149 | 133 | 2364 | 42 | 333 |
3. Měření | 3000 | 1215 | 1195 | 141 | 5679 | 40,1 | 442 |
Průměr | 3000 | 1285,0 | 1284,3 | 143,3 | 3678,3 | 38,6 | 395,0 |
- Test úprava (UPDATE)
Test | Požadavků | Průměr [ms] | Medián [ms] | Min [ms] | Max [ms] | Prům. rychlost [KB/s] | Odchylka [ms] |
1. Měření | 3000 | 1181 | 1179 | 137 | 2715 | 40,8 | 358 |
2. Měření | 3000 | 1165 | 1173 | 136 | 2659 | 41,6 | 346 |
3. Měření | 3000 | 1233 | 1217 | 130 | 2799 | 39,2 | 360 |
Průměr | 3000 | 1193,0 | 1189,7 | 134,3 | 2724,3 | 40,5 | 354,7 |
- Test smazání (DELETE)
Test | Požadavků | Průměr [ms] | Medián [ms] | Min [ms] | Max [ms] | Prům. rychlost [KB/s] | Odchylka [ms] |
1. Měření | 3000 | 1127 | 1134 | 130 | 2533 | 42,6 | 330 |
2. Měření | 3000 | 1143 | 1143 | 136 | 3169 | 42,2 | 333 |
3. Měření | 3000 | 1238 | 1203 | 142 | 2928 | 39,2 | 389 |
Průměr | 3000 | 1169,3 | 1160,0 | 136,0 | 2876,7 | 41,3 | 350,7 |
- Test vše zároveň (ALL)
Test | Požadavků | Průměr [ms] | Medián [ms] | Min [ms] | Max [ms] | Prům. rychlost [KB/s] | Odchylka [ms] |
1. Měření | 12000 | 1124 | 1197 | 133 | 3026 | 42,6 | 346 |
2. Měření | 12000 | 1257 | 1218 | 135 | 3422 | 621,6 | 362 |
3. Měření | 12000 | 1280 | 1257 | 138 | 7721 | 618,8 | 469 |
Průměr | 12000 | 1220,3 | 1224,0 | 135,3 | 4723,0 | 427,7 | 392,3 |
Grafické znázornění:
CodeIgniter 2.1.3
Tento framework je vyvíjen společností EllisLab, která na tvorbě spolupracuje s veřejnou komunitou programátorů. Jedná se o další známý projekt využívající veškeré moderní nástroje. Jádro je velice úsporně navrženo a lze ho rozšířit o velkou řadu doplňků. Díky tomu je celá struktura přehledná. Mezi jeho základní vlastnosti se řadí využívání návrhového vzoru MVC, zanechávání malého otisku v celé aplikaci a takzvaná čistá URL. V důsledku jeho velké popularity a veřejného kódu může každý schopný programátor vytvořit nějaký doplněk. Díky tomu existuje mnoho nástrojů na práci s e-maily, obrázky a hlavně dostupná komunikace s téměř každým používaným typem databáze. Rozdílem od jiných frameworků je, že nevyužívá šablony a tudíž není potřeba se učit nějaký jazyk určený právě k jejich tvorbě.
Vlastnosti:
- srozumitelná a intuitivní struktura
- jádro nepotřebuje velké množství knihoven
- používá „čistou URL“, jednoduché příkazy pomocí URL
- využívá Model-View-Controller strukturu
- dobrá rozšiřitelnost na práci s emaily, XML dokumenty, obrázky…
- propojení s nejpoužívanějšími databázemi
- nepoužívá šablony (templates)
Požadavky pro použitou verzi:
- HTTP server
- PHP 5.1.6 nebo vyšší
- Databáze MySQL(4.1+), Microsoft SQL server, SQLite, Postgre SQL, MySQLi …
Dokumentace a podpora:
Komunikace mezi jednotlivými příznivci probíhá přes oficiální IRC kanál nebo diskuzní fóra. Jako podpora velmi dobře poslouží i rozsáhlá dokumentace s mnoha ukázkovými příklady dostupnými na oficiálních stránkách.
Výsledky testů:
- Test výběr (SELECT)
Test | Požadavků | Průměr [ms] | Medián [ms] | Min [ms] | Max [ms] | Prům. rychlost [KB/s] | Odchylka [ms] |
1. Měření | 3000 | 302 | 292 | 26 | 1656 | 2627,5 | 172 |
2. Měření | 3000 | 306 | 280 | 27 | 1687 | 2647,3 | 174 |
3. Měření | 3000 | 295 | 284 | 25 | 3553 | 2644,7 | 168 |
Průměr | 3000 | 301,0 | 285,3 | 26,0 | 2298,7 | 2639,8 | 171,3 |
- Test vložení (INSERT)
Test | Požadavků | Průměr [ms] | Medián [ms] | Min [ms] | Max [ms] | Prům. rychlost [KB/s] | Odchylka [ms] |
1. Měření | 3000 | 241 | 232 | 58 | 718 | 20,6 | 101 |
2. Měření | 3000 | 195 | 196 | 57 | 601 | 26,3 | 67 |
3. Měření | 3000 | 196 | 193 | 65 | 529 | 23,2 | 79 |
Průměr | 3000 | 210,7 | 207,0 | 60,0 | 616,0 | 23,4 | 82,3 |
- Test úprava (UPDATE)
Test | Požadavků | Průměr [ms] | Medián [ms] | Min [ms] | Max [ms] | Prům. rychlost [KB/s] | Odchylka [ms] |
1. Měření | 3000 | 129 | 140 | 15 | 240 | 33,6 | 54 |
2. Měření | 3000 | 176 | 175 | 59 | 402 | 25,2 | 65 |
3. Měření | 3000 | 216 | 209 | 61 | 561 | 21,8 | 92 |
Průměr | 3000 | 173,7 | 174,7 | 45,0 | 401,0 | 26,9 | 70,3 |
- Test smazání (DELETE)
Test | Požadavků | Průměr [ms] | Medián [ms] | Min [ms] | Max [ms] | Prům. rychlost [KB/s] | Odchylka [ms] |
1. Měření | 3000 | 185 | 181 | 59 | 641 | 24,5 | 74 |
2. Měření | 3000 | 179 | 177 | 61 | 444 | 24,8 | 65 |
3. Měření | 3000 | 217 | 217 | 48 | 555 | 21,8 | 88 |
Průměr | 3000 | 193,7 | 191,7 | 56,0 | 546,7 | 23,7 | 75,7 |
- Test vše zároveň (ALL)
Test | Požadavků | Průměr [ms] | Medián [ms] | Min [ms] | Max [ms] | Prům. rychlost [KB/s] | Odchylka [ms] |
1. Měření | 12000 | 199 | 204 | 25 | 722 | 1114,8 | 66 |
2. Měření | 12000 | 218 | 221 | 26 | 814 | 1047,8 | 74 |
3. Měření | 12000 | 235 | 219 | 25 | 1048 | 958,7 | 110 |
Průměr | 12000 | 217,3 | 214,7 | 25,3 | 861,3 | 1040,4 | 83,3 |
Grafické znázornění:
Opravdu má tohle smysl? Radši zrušit jako seriál o ZF, lepší než si způsobit ještě větší ostudu. Nebo spojit do jednoho článku a vynechat zbytečný balast. Jen ať se z toho nestane prázdninový seriál, který pomalinku pohřbívá Zdroják.
Tak redakce při smyslech nebyla nikdy, jinak by to nemohla vůbec dělat 8-) BTW ZF seriál tehdy skončil odchodem autora, který vše zabalil a přestal zcela komunikovat. S autorem tohohle seriálu se snažím spojit a rozmyslet další kroky, ale už týden od něj nemám žádnou reakci, tak ještě uvidíme.
Rozhodně taky doporučuju znovu zvážit koncept seriálu… tohle je opravdu, ale opravdu špatné.
Přiznávám se, že výkon mě u frameworků až tak moc nezajímá. Tuším, že Cake a Symfony dopadnou blbě, Yii, Nette, Code Igniter dobře. Ale stejně by mě to nedonutilo projekt, který mám v Cake přepsat do Code Igniteru.
Co mi naopak v seriálu chybí:
1) srovnání, jak se dělají formuláře (přímo se zdrojáky)
2) jak vypadá db vrstva (má migrace? ORM? optimální dotazy jako v NotORM?)
3) jak udělám základní věci, jako routování, připojení do db, redirect, 404 Not Found
4) co umí šablonovací vrstva
5) jak je framework bezpečný (automatická ochrana proti CSRF, automatické escapování)
6) jak v tom udělám přihlášení/uživ.práva/administraci
7) jestli má nějaké pluginy a kolik práce je s jejich instalací
8) jak framework podporuje AJAXové dotazy, automatické REST služby apod.
Ikdyby byla frekvence článků čtvrtinová, myslím, že tak by to mělo význam a bylo by to vodítkem, které může někoho při výběru FW ovlivnit. Dělat benchmarky na laboratorních dotazech nepovažuju za věc, která by cokoliv užitečného pro praxi ukázala.
Kéž bych měl o trochu víc času s tím autorovi pomoci, protože je to chvályhodná aktivita a byla by škoda takovou šanci zahodit.
Já vám nevím… http://docs.phalconphp.com/en/latest/reference/benchmark/hello-world.html
čekal jsem že nette nebude žádnej rychlík ( rychlík byl opravdu pouze ve verzích 0.x ), ale že dopadne až tak špatně, to jsem nečekal ( i šnek zend je rychlejší to je pro mě překvapení ).
ja som nette opustil uz davno prave koli rychlosti.. niektore pomalsie casti nette by bolo lepsie prepisat do C++ ako PHP moduly.
Len jedno nechapem, ze preco ma v tom teste na phalconphp.com Nette taky obrovsky prenos dat oproti inym fw.
Total transferred: 50370200 bytes
co je napr. 120x viac ako Phalcon.
Vie to niekto vysvetlit?
Tak v tom teste Nette nie ze pohorelo, ale zhorelo. Otazkou je, ci to je nieco realne alebo…
Ci je to uplne realne neviem, ale nieco pravdy na tom bude, pretoze Nette som taktiez zahodil po par rokoch kvoli rychlosti a komplikovanosti a presiel na rychlejsi a prijemnejsi CodeIgniter
Také mě zaujalo, jak v tom testu nette propadlo, tak jsem se schválně podíval na zdrojáky toho testu. Jsou k dispozici zde:
https://github.com/phalcon/framework-bench/tree/master/helloworld
Ten test je bohužel naprosto zfixlovaný, a to z těchto důvodů:
– phalcon má v testu pouze jeden controller a jedno view, které obsahuje pouze samotný text „Hello!“ bez ničeho dalšího. To pak při 2000x opakování dá těch 32kB přenesených HTML dat
– nette má v testu z neznámých důvodů controllery dva, v testu přenáší celé HTML včetně HEAD části, navíc používá i šablonovací systém a includuje šablonu do nadřazené šablony. V šabloně pak kromě textu nepochopitelně generuje navíc i odkaz. Dále má v bootstrapu zapnutý debugger, který je součástí stránky, proto ve výsledku při 2000x opakování přenese 50MB HTML dat!
Srovnávají se naprosto nesrovnatelné věci. Pro stejné porovnání by nette muselo mít v šabloně také pouze samotný text bez ničeho dalšího. A samozřejmě vypnutý debugger.
No to vypada jako jasna vyzva na pull request…
Je to tam: https://github.com/phalcon/framework-bench/pull/25.
Off topic: Jak se podařil příspěvek s datem 11.7.2013 ve 22:56, když teď je teprve 11.7.2013 10:02?
Vojta je prostě napřed 8-) Díky za upozornění, podíváme se na to.
Tak bylo to poslední aktualizací WP, teď už se čas zobrazuje v pořádku.
Ještě je tam další rozdíl. Ve phalcon testu není žádný .htaccess, zatímco v nette testu .htaccess je, přitom pro tento test, kde se nepoužívá url rewrite, není potřeba, stačí jen samotný index.php. I to bude mít vliv na ApacheBench.
Díky za upozornění, poslední pull request, který hýbal s Nette v tom testu, zdá se zavedl naprosto zvláštní úpravy…
nechtěl by to tedy někdo naklonovat a udělat rychlej testík? Teď mě to zajímá ještě víc :D
BTW, k čemu je benchmark webu, který nedělá nic? Až budu tvořit stránku, která vypíše jenom
<h1>Hello!</h1>
, obejdu se bez frameworku i PHP ;)Davide ( pokud mohu tykat ), každý druhý dnes „honí“ rychlost, u menších webu to nevadí, ale na větších webech ( rozumněj s větší návštěvností ) se už každá milisekunda „neberte to doslovně“ počítá :).
Na nette webu je „Dle nezávislého testu je Nette Framework jedním z nejrychlejších frameworků vůbec.“ proto by bylo pěkné kdyby tomu tak opravdu bylo i v tomto testu / dnešní době, nicméně i po pull req. co zaslal [vojtech.dobes] je na tom nette stále nejhůře a to už stojí za zamyšlení. ( na to jak bylo nette pěkné, malé, rychlé, tak teď docela nabobtnalo a rapidně zpomalilo a to není dobré do budoucna )
Vy tam někde vidíte nové výsledky toho testu? Já tam vidím pořád ty staré.
Výsledky tam samozřejmě nejsou, ale nic Vám nebrání v tom, si stáhnout všechny zdrojáky z GITu a udělat si vlastní měření ;) ( zabere to tak 15 minut max. )
Tak se o výsledky poděl.
Zkusil jsem to a u mě byl rozdíl mezi Nette a Zendem ještě větší. Dva requesty sice skončily error 500 z nějakého cache-related důvodu (Nette\InvalidStateException: Malformed journal file), ale to by takový vliv mít nemělo.
Každopádně až budu tvořit stránku, která vypíše jenom
<h1>Hello!</h1>
, také se obejdu bez PHP. Pro srovnání jsem zkusil ještě hello world v Node.js a to je teprve rozdíl…Tak taketo porovnanie by mi osobne ovela viac dalo, ako toto aktualne porovnavanie rychlosti.
Vim že porovnání vámi zmíněných parametrů by možná bylo vhodné otestovat, ale tento test jsem vytvářel sám a bez předchozích znalostí použitých frameworků. Proto byl také zaměřen na lépe měřitelné aspekty než na vámi zmíněné parametry, ke kterým si myslím, že je potřeba hlubší znalost využití frameworků. Jsem rád, že patříte do velice malé skupiny lidí, kterým je líto že se nemohli podílet na testování a přispět do něj svými znalostmi.
Omlouvám se, ale nechápu ten přístup, kdy nemůžu mít kritický názor jen proto, že nejsem autor článku nebo že jsem se nějak nepodílel. Slepá adorace autorů čehokoliv vede pouze ke snížení kvality.
Zkuste si někdy vzít do hospody jednoho programátora (skutečného, řekněme seniora u velké firmy nebo zkušeného freelancera) který miluje třeba Symphony, druhý Zend a třetí Nette. Stačí je jen poslouchat… a jestli byste byl pak schopen nějak stanovit, který FW je nejrychlejší, nejlepší, nej*
zde nejspíše došlo k mýlce. Já uznávám každý kritický názor a to že jsem na projektu pracoval sám jsem nemyslel jako výtku. Spíše jako, že kdybych věděl, že mi chcete pomoci zlepšit celý test, určitě bych vaši pomoct uvítal.
Dále bych chtěl jen zopakovat, to co zde již bylo řečeno. Já nikomu výsledky nenutím a nedělám závěr, který framework je úplně ten nejlepší. Pouze jsem porovnal 14 vybraných FW v určitém testu a chci se podělit o jeho výsledky, protože si myslím, že pro některé programátory budou užitečné.
Také jsem vděčný za jakoukoli kritiku ať už pozitivní nebo negativní. Je to reakce komunity dalších programátorů, ze které se rád poučím:-)
mne to praveze pride dobry clanok pretoze opisuje vyhody a rozdiely frameworkov.a casovy test je tiez dost dolezity kedze si clovek vie porovnat co je vyhodnejsie pouzit pre projekt. Ostatne veci sa uz najdu v dokumentacii. nieco taketo som hladal.
diki
Vy vážně věříte, že když napíšete aplikaci na FW, který tento test vyhrál, že ta apliakce bude v reálném provozu rychlejší než dejme tomu tem FW, který skončil na posledním místě ? :)
Počujte, Kefalín. A čo si vy predstavujete pod takým slovom, „Postgre SGL“?
„Rozdílem od jiných frameworků je, že nevyužívá šablony a tudíž není potřeba se učit nějaký jazyk určený právě k jejich tvorbě“
to je nějaký apríl, ne?
Teď jsem zjistil, že tuhle killer feature má nette taky, stačí přejmenovat .latte na .phtml :) Proč to není na nette.org mezi výhodami?
Co přesně znamenají poslední hodnoty „all“ ? Průměrnou odezvu čtení i zápisu ? :)
Průměrná rychlost kiloBajtů/s čeho? Jak to souvisí s frameworkem?
děkuji
Poslední hodnoty „ALL“ jsou naměřené pri testu ve kterém se prováděly všechny funkce. V prvním testu se pouze vypisovalo, v druhém pouze vkládalo, ve třetím pouze upravovalo a ve čtvrtém pouze mazalo. V posledním testu prováděl každý uživatel všechny požadavky a tim byl získán takový „průměr“ při různých požadavcích.
Stále nechápu tu průměrnou rychlost kiloBajtů/s.
Přesto jsou ty výsledky na nic. Aplikace většinu času masivně čte a to hlavně z cache (file, memory). Triviální zapis do databáze je většinou rychlý, pokud nezatěžujeme tabulku nějakým složitějším dotazem (nebo zprasenym). Tzn rychlost zápisu nijak nesouvisí s FW.
Z tohoto hlediska by mě u FW spíše zajímalo, jak je řešene cache resp. typická situace, kdy provádím update a potřebuji invalidovat cache. Samotný update do db je hned, ale invalidace cache může trvat i několik vteřin v závislosti na velikosti cache nebo množství tagů apod.
Myslím, že by redakce měla zvážit vložení zvýrazněného perexu před každý díl tohoto seriálu, kde by bylo uvedeno, že se jedná pouze o náhodně seřazený neúplný seznam php frameworků.
Dobře, chápu že autor neví, jak by se mělo psát srovnání FW. Ale jak tohle může projít redakcí… Autorovi doporučuji, aby se s někým spojil a zkusil napsat článek pořádně (např. příklady kódů řešení, ve kterých FW vyniká, či principy, které jinde nejsou a naopak nedostatky).
BTW neexistence šablonovacího systému opravdu výhoda není. A co se týká benchmarků, jeden test přece nemůže rozhodnout o celkové rychlosti. A to ať je to test hello wordu, nebo databázový test. Smysl dává jedině kombinace několika běžných use cases. A nezapomeňte na cache (na různých úrovních). Takže nakonec záleží jen na tom, jak dobře se v tom a tom FW dá web navrhnout a v něm následně optimalizovat na rychlost.
Tak toto je divny test. Codeigniter ORM nema, da sa doinstalovat, najznamejsi je DataMapper. O tom sa ale autor v clanku nezmienuje. Taktiez mi to pride skor test databazy ako samotneho frameworku.