cs Mirin's blog Blog about coding, and other stuff Fri, 27 Aug 2010 19:09:18 +0200 Zend_Feed_Writer 1.10.6 (http://framework.zend.com) http://mirin.cz/blog/feed koubel@volny.cz (Mirek Kubelík) Koubel, all rights reserved Mirek Kubelík Zend vs. Nette Fri, 27 Aug 2010 19:09:18 +0200 http://mirin.cz/blog/zend-vs-nette http://mirin.cz/blog/zend-vs-nette Už před delší dobou jsem chtěl napsat nějaké menší srovnání Zend Frameworku a Nette Frameworku, ale pořád jsem to odkládal a odkládal, až už z toho Zend Frameworku pomalu nic neznám :-). U Nette jsem mnohem častěji, protože ho používáme v práci (když jsem nastoupil, už tam bylo a nedalo se s tím nic dělat :-(). Bude to také samozřejmě subjektivní a nějakou moc velkou obhajobu Nette nečekejte. Do velké míry je to tím, že Nette jsem byl nucen používat od jeho velmi rané fáze, ještě někdy před verzí 0.8. Zaměřím se hlavně na MVC, protože to je to nejdůležitější, co dělá framework frameworkem.

MVC je základ

V Zendu se jede podle klasiky MVC s front controllerem, view helpery a spoustou nachystaných pluginů a bohaté plugin architektury. Pluginy mohou být jak pro action (v Zendu se tomu říká action helpery, základem je Zend_Controller_Action_Helper), tak pro celý proces, kterým odbavení požadavku prochází - Zend_Controller_Plugin_Abstract. Současně framework už v základu poskytuje velké množství helperů, které zajišťují redirectování, inicializaci view, context switching a další. Je to velmi propracovaný a přitom poměrně volně vázaný systém.

Nette je založeno na MVP, P není tedy Controller, ale Presenter, který může obsluhovat více stránek. Proces dispatchnutí požadavku je jednodušší než v Zendu, ale co je horší, není zajištěna dobrá separace jednotlivých částí procesu odbavení požadavku a velmi špatná možnost pluginování. Nette obsahuje podivnou třídu Application, která umožňuje pověsit se na nějaké události, ale o přehlednosti plugin architektury jako je v ZF se nedá vůbec hovořit. Ono by se na první pohled mohlo zdát, že koncept Presenteru a Controlleru je v podstatě stejný, zejména proto, že presentery v Nette mohou být multiaction, ale opak je pravdou. Existuje zásadní rozdíl v práci s Controllery v Zendu a Presentery v Nette. Presenter je totiž od toho aby se dědil - viz. doporučení od autora frameworku, ale Controller, se naopak dědit nemá (může, ale nedoporučuje se to), společné prvky controllerů v aplikaci se zajišťují přes pluginy. Taková architektura je mnohem flexibilnější, na dědičnosti závislém presenteru se tak rozsáhlý systém v podstatě nedá postavit.

Presenter architektura v Nette naopak poskytuje jednu velmi pěknou vlastnost, kterou zřejmě nikde jinde nenajdete - komponenty. Funguje to velice pěkně, navíc s built-in podporou ajaxu a factory metod na komponenty. U Zendu se komponenty dají nahradit částečně view helpery, ale tak efektní to není, "widgetizovaný" web se tak dá s podporou presenterů postavit mnohem lépe. S odstupem času mi ta "ajaxovost" komponent už tak pěkná nepřijde, myslím si, že éra posílání a substituce kousků html je překonaná záležitost, i když pro oživení klasické webové presentace je to pořád asi nejčastější způsob.

Nette také obsahuje poměrně bohatý šablonovací systém, který je v podstatě nutné používat zejména kvůli komponentám a snippetům, bez nich by to nebylo ono. Naopak v Zendu jsou šablony klasické PHP soubory, kde velkou roli hrají view helpery, které umožňují tvořit znovupoužitelné části pro view a zjednodušit tvorbu šablon. Opět je poskytováno obrovské množství view helperů na všechno možné. Klasické PHP v šablonách velmi pěkně zapadá do MVC architektury a potřeba nějakého složitějšího šablonování tak v Zendu není.

Routing je Nette a v ZF dost podobný, v Nette je možná malinko propracovanější, ale na 90% věcí vám vyhoví oba zhruba stejně. ZF má podporu RESTu, Nette zatím ne.

Nezmínil jsem třeba takové věci jako formuláře, které jsou např. v Nette díky komponentové podpoře pěkně řešené a používají se lépe než v Zendu, ale jak jsem napsal, soustředil jsem se hlavně na MVC.

Komunita, koncepce vývoje

Tady už je to v podstatě nesrovnatelné i když autor se to snaží vyvracet. Je pravda, že Zend Framework je tažen především třemi full time vývojáři (spíše dvěma, že by Alex kromě Zend_Pdf nějak zásadně do frameworku přispíval …), ale pořád je o 100% více než Nette, kde ač se po různu vynořují magická spojení jako Nette Foundation, je to celé v podstatě na D. Grudlovi. No, spíše o 200% až 300% více, protože Zend vývojáři se opravdu věnují programování frameworku a nepatlají se tolik s věcmi okolo (design, wiki, bugtracker, školení, webcasty, manuál …), v tom jim firma poskytuje zázemí.

Na ZF je krásně vidět, jak do projektu zatáhl komunitu. Od začátku jasná pravidla pro komunitní vývoj komponent a jejich pravidelné zařazování do frameworku. Pak se přidaly pravidelné bug hunt days - to je naprostá bomba a klasická ukázka komunitního vývoje, dále delegování odpovědností za vývoj jednotlivých komponent a výbor expertů z řad komunity, která posuzuje framework jako celek je další nová věc. Nic takového v Nette není, všechno jede pod diktátem autora a bez něj v podstatě všechno stojí. Minimálně bug hunts by potřebovalo Nette jako koza drbání, ale je tu problém s testy, viz. dále.

Další velké koncepční problémy byly učiněny hned na začátku vývoje Nette. První byla neexistence testovaní a druhá nesmyslná "cool" podpora php 5.3 v době, kdy ani php 5.3 nebylo reálně použitelné. To vedlo k tomu, že Nette mělo naprosto strašné zdrojové kódy nutné pro generování 5.3 verze a doteď se tam vyskytují třídy pro kompatibilitu s 5.2. Navíc od začátku se poskytovala a preferovala neprefixovaná verze frameworku pro 5.2, což je z pohledu pojmenování a kolizí naprostá hrůza.

Zend od začátku zvolil klasiku PHPUnit a s 5.3 si hlavu nelámal. Prefixoval třídy klasicky ve stylu PEARu. Když nastala doba, učinil se stávající framework v pohodě kompatibilní s 5.3 a začalo se pracovat na nové major verzi. Naprostá pohoda, bez konfliktů a hromady ušetřené práce.

Ohledně testování v Nette se snad ledy hnuly a konečně i Nette bude mít testy pro PHPUnit, což by snad nakonec mohlo dospět i k tomu, že by mohlo dojít na ty bug hunt days :-). Sice se autor pokoušel o nějaký svůj koncept testů, ale jedině dobře, že mu to nakonec snad zametli pod stůl.

Přitom komunita je to, co by z Nette mohlo udělat přednost, je totiž pravda, že se kolem něj nabalila velká skupina především mladých a velmi schopných PHPčkařů a zapojit je více do vývoje frameworku by do frameworku přineslo naprosto novou kvalitu, spolu se standardním testováním by to neměl být problém. Jako příklad můžeme vzít šablonovací systém. Jak jsem již uvedl, Nette má svůj, je poměrně propracovaný a docela dobře se používá. Nicméně pod povrchem je to makroprocesor okolo reg. výrazů. Jakub Kulhan, jeden z těch, kteří se okolo Nette motají, má velmi dobré znalosti ohledně kompilátorů, lexerů, parserů, … a chuť něco takového udělat i pro Nette šablony. To by byl naprosto revoluční počin a posunul Nette šablony na naprosto jinou dimenzi. Minimálně za pokus by to stálo a takových lidí se motá okolo Nette více.

Další věc je verzování. U Zendu máte jistotu že pokud nepřijde major verze, tak se BC breaky nedělají a všechno jede jak má. Má to jasnou koncepci, která je možná trochu rigidní, ale pro udržování rozsáhlejších projektů nutná.

Naproti tomu Nette si klidně i do údajně stabilní větvě 0.9 švihá i zpětně nekompatibilní změny v API a to dost často velmi zásadní. Sice se to autor snaží vylepšovat tím, že do fóra napíše BC break, ale i tak se to s pojetím ZF nedá srovnat a pro reálné nasazení je tak každá taková "stabilní" verze dost velká komplikace.

Další věc je magičnost a WTF faktor. Ten je u Nette kupodivu mnohem větší než u Zendu a není to jen šablonami. Troufnu si tvrdit, že tenhle rozdíl se bude s příchodem ZF 2.0 a Nette 1.0 zvětšovat. Nette si dost zakládá na magických konstrukcích a různých nápravách a vylepšeních PHP jako jazyka, Zend se o nic takového nesnaží a naopak se magičnosti bude snažit zbavit. S tím souvisí i poněkud zavádějící slogan "Nette Framework is designed with simplicity in mind". Nenechte si mýlit rozsahem ZF, podle mých zkušeností je zvládnutí základu Zend Frameworku pro začátečníka jednodušší než Nette.

Závěr

Ačkoli už tu Nette nějaký ten pátek je, pořád bych se při rozhodování, co zvolit jako zásadní firemní framework, pro něj nerozhodl. Naopak jako framework pro nějakého člověka, který dělá zakázkové weby, se Nette hodí velmi dobře. Počkejme si, co přinese verze 1.0 a jestli se Nette opravdu otevře více komunitě. Uvidíme také, jak se frameworky vypořádají s integrací nějakého ORM řešení, které by přidalo alespoň nějakou podporu modelů.

]]>
0
Letem světem ZF a PHP Fri, 30 Jul 2010 19:56:35 +0200 http://mirin.cz/blog/letem-svetem-zf-a-php http://mirin.cz/blog/letem-svetem-zf-a-php Dnes jen tak zlehka nadhodím pár posledních událostí, které se udály ohledně PHP a Zend Frameworku. Ono už je to dost dlouho, co jsem psal něco k Zend Frameworku, takže to až zas tak horké nebude, k PHP to bude snad o něco čerstvější, ale taky už to až tak moc nesleduji, komentáře tedy vítány.

ZF 2.0 se blíží

Již někdy v prvním čtvrtletí se hlavní vývojáři Zend Frameworku po vlně různých dotazníků a průzkumů dohodli, že verze 2.0 Zend Frameworku, která dle dohody jako první verze po dlouhých letech může porušit zpětnou kompatibilitu, pojede jen na PHP 5.3 a bude tak moci naplno využívat všech nových možností, které PHP 5.3 nabízí - jmenné prostory, anonymní funkce, goto …. Začalo se na tom dělat ve stávajícím svn, ale za nějaký čas se dohodl přechod na dnes tak populární git. Takže ZF 2.0 už bude vyvíjen v gitu s hlavním repositářem na serverech Zendu (http://git.zendframework.com), mirrorovaným na githubu. Na wiki už se vyklubalo trochu dokumentace a Matthew napsal i nějaký ten článek a zprávu do mailing listu, jak to pokračuje a co se chystá.

Je pravda že změna to bude dost masívní, ale pořád se asi přesně neví jaká. Určitě lze čekat velké změny ve věcech MVC, databází a PDF, to jsou hlavní věci, které mají full time Zend Framework vývojáři na starosti. Mimochodem jsou tři - Matthew Weier O'Phinney, Ralph Schindler a Alexander Veremyev. Právě Matthew jako vedoucí projektu nakonec nastínil roadmapu spíš ve smyslu koncepce, nikoli už konkrétních změn. Důraz bude kladen na tyto věci:

  1. větší důraz na interface - umožnit vývojářům co největší volnost v pluginování, umožnit dobrou dependency injection všude, kde to dává smysl.
  2. zbavit se magie - ve frameworku se na pár místech intenzivně využívá magických metod __get(), __set() … To by mělo být zrušeno a nahrazeno explicitními zápisy, bude to mnohem přívětivější pro IDE a rychlejší, magic methods jsou v PHP dost velká brzda.
  3. pravděpodobně se zredukuje počet komponent - framework je dost nabotnalý a jsou komponenty, o které se nikdo moc nestará. Byl už ustaven nějaký "výbor", který by na to měl dohlídnout a sledovat to i nadále.

Už teď je toho spousta hotová, celý framework už se převeden do namespaces včetně hromady testů, průběžně se importují bugfixy ze stávající verze, lidé už rozjeli práci na komponentách, které mají na starosti pro verzi 2.0. Až mě to překvapuje, jak to sviští dopředu, no podívejte na ten github, budete koukat. Jen to převedení na namespaces bylo asi dost maso, myslím že většinu toho zmáknul Ralph s pomocí nějakého poloautomatizovaného nástroje, který také udělal.

Zatím mám z toho dost dobrý pocit, samozřejmě mezitím vychází dál bugfix verze pro 1.10 a připravuje se 1.11, která se dál jede v svn. Uvidíme, jak jim to půjde dál.

Mimochodem, trochu jsem upravil zdrojáky blogu a krásně to jede i na poslední verzi ZF - pro zájemce opět na stránce s informacemi. Moc dobrou práci odvádějí lidé okolo ZF, maximální spokojenost.

PHP 5.2 už nebrat, co s trunkem

Docela mě překvapilo, že moc lidí neprotestovalo ohledně konce aktivní podpory řešení chyb pro řadu 5.2. Není to sice úplný konec podpory 5.2, security patch asi nějaký bude, ale v reálu je lepší se soustředit na uprade na 5.3. Uvidíme, jak to bude dál, ale zatím nic nenasvědčuje tomu, že by se toho mělo moc změnit. V našich luzích a hájích v podstatě ticho po pěšině.

Jinak trunk PHP už toho poměrně dost spolkl, nějaké performance patche, dost z traitů a hlavně byl dost humbuk okolo kontroly primitivních typů v parametrech funkcí, jakmile Derick docela starý Iljův patch commitnul, tak se rozpoutala masivní diskuse. Zatím to tam pořád je, včetně testů, takže teoreticky se to může v nějaké z příštích verzí PHP objevit, mezitím vznikly na wiki další návrhy co s tím, tak uvidíme co se z toho nakonec vyklube.

Celkově se mi zdá, že už pomalu začíná být problém vyznat se v tom, co je v trunku, co v 5.3 a hlídat bugfixy, to byl asi také jeden z důvodů konce aktivní podpory 5.2.

A ještě jedna velmi příjemná změna v trunku, patch na podporu syntaxe referencování polí při volání funkce je už také commitnutý. Takže možná brzy už bude možné psát

function fruit () {
  return array('a' => 'apple', 'b' => 'banana');
}
 
echo fruit()['a']; // apple
]]>
0
PHP extension - základ modulu Wed, 30 Jun 2010 01:10:16 +0200 http://mirin.cz/blog/php-extension-zaklad-modulu http://mirin.cz/blog/php-extension-zaklad-modulu Z minula máme základní konfiguraci modulu pro PHP rozšíření, dnes tedy něco k tomu, jak v C vypadá taková kostra PHP modulu. Modul, jak jsme si řekli minule je v podstatě to samé co PHP extente. Není zvykem, že by jedna extenze obsahovala více modulů. Psaní kostry modulu je v podstatě rutina a proto vzniklo několik automatizovaných řešení. V PHP 4 se jednalo o shell skript ext_skel, pak vznikl Pecl_Gen, jediný PHP kód v Pecl repozitáři, který se posléze vrátil zpět do PEARu jako CodeGen_PECL. Takže buď použijte ten, nebo si to napište sami :-). Budu opět vycházet ze své incpath extenze.

Vždy je lepší se držet minimálního množství kódu v hlavičkách, tak i proto se ve hlavičkovém souboru nebudeme příliš rozepisovat, necháme jen základ a využijeme direktivy extern a vlastní definici struktrury modulu necháme ve zdrojovém kódu modulu (extname.c).

#ifndef PHP_EXTNAME_H
#define PHP_EXTNAME_H
 
extern zend_module_entry extname_module_entry;
#define phpext_extname_ptr &extname_module_entry
 
#ifdef ZTS
#include "TSRM.h"
#endif
 
#endif	/* PHP_EXTNAME_H  */

Tady opravdu není nic moc co dodávat, define pro zabránění opakované definici každý zná a Zend Enginu opravu stačí pouze externalizovaná definice modulu. O thread safe - TSRM někdy příště.

Modul samotný (extname.c) musí obsahovat už tuto strukturu definovanou. Tahle struktura je vlastně definice všeho, co naše extenze obsahuje a z ní Zend Engine načerpá informace o funkcích, třídách, konstantách a všem ostatním, co náš modul obsahuje. Základní věcí jsou funkce MINIT, MINFO a spol. To jsou takové styčné body naší extenze do core PHP a jsou volány v různých etapách přímo jádrem PHP. Názvy jsou samo vypovídající. M-funkce jsou volány při inicializaci a uvolnění modulu, typicky při restartu Apache a natažení PHP modulu a R-funkce při zahájení a konci nového požadavku (např HTTP). Málokterá extenze R-funkcí využívá, ale je dobré vědět o tom, že extension API má bod pro pověšení se na začátek a konec HTTP požadavku.

Trochu výjimka je MINFO, které slouží k výpisu informací o modulu ve výpisu generovaném funkcí phpinfo().

#include "php.h"
#include "php_extname.h"
 
#ifdef COMPILE_DL_EXTNAME
    ZEND_GET_MODULE(EXTNAME)
#endif
 
static PHP_MINIT_FUNCTION(extname)
{
	/* registrace konstant, tříd, .. */
	return SUCCESS;
}
 
static PHP_MINFO_FUNCTION(extname)
{
	php_info_print_table_start();
	php_info_print_table_row(2, "Extname support", "enabled");
	php_info_print_table_end();
}
 
static PHP_FUNCTION(extname_function)
{
 
}
 
static zend_function_entry extname_functions[] = {
	PHP_FE(extname_function, arginfo_my_function)
	{NULL, NULL, NULL}
};
 
zend_module_entry extname_module_entry = {
    STANDARD_MODULE_HEADER,
    "extname",
    extname_functions,
    PHP_MINIT(extname),
    NULL, //PHP_MSHUTDOWN(extname),
    NULL, //PHP_RINIT(extname)
    NULL, //PHP_RSHUTDOWN(extname)
    PHP_MINFO(extname),
    "0.1",
    STANDARD_MODULE_PROPERTIES
};

Součástí definice modulu je i struktra se seznamem našich funkcí - zend_function_entry. PHP si je zaregistruje a pak už nic nebrání tomu volat funkce našeho modulu z userspace PHP skriptu.

Při statické definici funkcí a struktur je dobré mít definici modulu nakonci, myslím, že i tak velí konvence Cčkového kompilátoru, ale už přesně nevím.

Jinak tady je pěkně vidět, jak silně jsou při psaní modulů využívány makra Cčkového preprocesoru. Je to poprvé, kdy jsem se setkal v Cčku s makrem pro funkce. To je jedna z velkých zbraní Cčka, přetavená v C++ do ultra silného nástroje - šablon. Třeba takové PHP_FUNCTION je makro, které se před kompilací přemění v Cčkový kód všude, kde je potřeba a takových maker je v API spousty a velmi často se s nimi setkáte, stačí si projít hlavičkové soubory adresáři Zend ve zdrojových kódech PHP.

Je dobré zdůraznit, že chyby v MINIT/RINIT_FUNCTION se dost špatně hledají a ladí (pokud tedy asi nepoužíváte gdb). Většinou se prostě modul nenatáhne a vy dostanete jen strohou hlášku do logu.

No a teď už v podstatě stačí zimplementovat všechny naše PHP_FUNCTION a je hotovo. Ještě jsem zapoměl na arginfo V PHP_FE položce zend_function_entry, to slouží hlavně pro účely reflexe, o tom a něčem dalším z tvorby php rozšíření zase někdy příště.

]]>
0
Jak se uplatnilo megaprase? Tue, 11 May 2010 20:49:44 +0200 http://mirin.cz/blog/jak-se-uplatnilo-megaprase http://mirin.cz/blog/jak-se-uplatnilo-megaprase Pokud se zajímáte o vývoj Nette Frameworku, tak jste se mohli před nedávnem na fóru dočíst o tom, jak jeho autor D. Grudl při předělávání nějakých věcí ve frameworku označil jednoho z core vývojářů PHP Marcuse Börgera. "Hlavně mi vadí, že Marcus je co se týče návrhu API megaprase, protože když někdo v roce 2005 vymyslí tohle , tak má šanci uplatnit se leda v PHP."

Podívejme se tedy na to, co je zač ten Marcus. Na jeho profilu se můžete dočíst něco málo o tomhle Švýcarovi a o tom co udělal pro PHP, dál pomůže třeba google (o tom i dále).

Marcus je přes 15 let aktivním vývojářem samotného PHP. Začal už pravděpodobně na vysoké škole v Aachenu a pokračoval i později. Marcus je několikrát zmíněn i v phpinfo(). Hodně pracoval na PDO a SPL, které nakonec dovedl z pecl php extenze do core. Některé části SPL jsou přímo součástí Zend Engine. V SPL má na svědomí zejména iterátory, záležitosti pro práci s objekty jako s poli, rozšíření výjimek atd. Prostě API, bez kterých by se v PHP 5 psalo o poznání hůře. Např. Nette by bez nich určitě nemohlo vypadat tak, jak dnes vypadá. Marcus se na začátku dost zapojil i do vývoje Phar extenze.

Marcus je také velmi často zván na různé mezinárodní PHP konference a zejména jeho přednášky o php internals a s tím související php pecl demoextension jsou jedinečné kousky. Troufnu si tvrdit, že každý, kdo někdy dělal nějakou php extension je použil prostě proto, že nic podobného neexistuje.

Je pravda, že třídy SplFileObject, ArrayObject, ArrayIterator nejsou zrovna krásnou ukázkou toho jak používat dědičnost a SRP, ale ostatní Marcusova práce pro PHP to vyvažuje stonásobně.

A jak se nám Marcus uplatnil? Nějakou chvíli byl zaměstnán ve Fordu a pak, světe div se, o něj projevil zájem Google. Takže teď je zaměstnán ve švýcarském Googlu a podílel se zejména na charts api. To a také narození jeho syna má asi vliv na to, že už se PHP nevěnuje tak jako dřív.

Co dodat? Pokud bych byl megaprase a uplatnil se stejně jako Marcus, tak by mě to tedy vůbec nevadilo.

]]>
0
Vývoj PHP 5.x Thu, 08 Apr 2010 15:58:25 +0200 http://mirin.cz/blog/vyvoj-php-5x http://mirin.cz/blog/vyvoj-php-5x Jak jste si mohli přečíst ve zprávičce na rootu, PHP rezignovalo na aktuální implementaci php 6 v trunku a pojede se v podstatě nanovo. Jeden z důvodů byl přilákat více přispěvatelů do PHP. Dost často se totiž v minulosti stalo, že člověku bylo řečeno, že "teď ne, až v šestce". A ten dotyčný se na to posléze vykašlal, když viděl jak se php 6 vyvíjí. Zdá se, že to pomalu začíná fungovat a už se začínají rýsovat věci, které by se mohly objevit v následujícím PHP 5.X.

FPM

Jde o podstatné rozšíření a vylepšení stávajícího SAPI pro CGI/FastCGI. Jednak dojde k oddělení kódu, který byl zatím pro CGI i FastCGI společný a hlavně process management FastCGI bude mít mnohem více možností, vylepšené logování atd. Souvisí to zejména s tím, jak se PHP začalo masivněji používat s lightweight servery jako LightHTTPd, ngingx a asi i IIS na Win.

Nové hash funkce, implicitní kódování

  • Přijaty byly implementace dvou nových hashovacích funkcí (prý Jenkins's one-at-a-time hash a FNV-1 - netuším moc o co jde).
  • default_charset bude nyní utf-8
  • Lepší podpora pro detekci zend rozšíření v reflections.
  • Podpora key-value databáze Tokyo Cabinet via ext/dba.
  • Odstranění fallback construktoru.

Odstranění fallback construktoru je poměrně zajímavá věc. Jeden ze tří full time Zend Framework vývojářů (zkuste si tipnout, kteří to jsou :-)) se zmínil o problémech při přechodu Zend frameworku na namespaces. Problém se týká kódu

namespace Foo\Bar;
 class Filter {
  public function __construct() { /* construct stuff */ }
  public function filter($value) { /* return filtered */ }
 }

Ono totiž pokud konstruktor není v PHP 5 definován přes __construct, tak se PHP shání po funkci, která se shoduje s názvem třídy. O téhle PHP 4 BC jsem tedy vůbec netušil. Bylo to uděláno zejména z důvodu hromady PEAR kódu. PHP dokonce vyhodí u výše uvedeného kódu notice. Další sranda přijde na řadu pokud si uvědomíte, že PHP je case insensitive u názvů funkcí. Nově by se tedy v namespaces neměl uplatňovat tenhle fallback pro konstruktor.

Hodně se rozjela diskuse o těchto tématech

  • podpora vláken - konečně by se z PHP mohl stát univerzálnější prostředek, zatím ale není jasné, jakým směrem se vydat. Zda se odrazit od stávajícího TSRM nebo se začít hrabat v semaforech, lockování atd. Moriyoshi (oniguruma san, mbstring master :-)) má fork php, který přináší podporu threadů do userspace.
  • podpora pojmenovaných parametrů pro funkce
  • horizontální kompozice - traits/grafts

Zatím se nic konkrétního nerýsuje, vetšinou to jako první dost smete Rasmus, ale naštěstí jsou tam i ostatní.

Je ale poměrně reálné, že ještě letos bychom se mohli dočkat nového php 5.x, kde by se mohlo pár nových užitečných věcí objevit.

]]>
0
Konfigurace pro extension Sun, 28 Mar 2010 15:25:47 +0200 http://mirin.cz/blog/konfigurace-pro-extension http://mirin.cz/blog/konfigurace-pro-extension Každá php extension je jedním modulem. Jak už jsem psal v předchozích částech, je modul sbírka funkcí, tříd, konstant atd. Modul se do PHP může dostat buď staticky, přímo se slinkuje s ostatními částmi PHP jako jediný celek, nebo dynamicky jako dynamická knihovna. Tu si pak uživatel můžeme přidat do PHP nejčastěji přes konfigurační direktivy v php.ini nebo pomocí funkce dl. Pokud píšeme extenzi do PHP platí pro modul pár zásad, které je třeba dodržet. První z nich je nutnost vytvořit konfiguraci pro kompilování modulu.

Když vytváříte nějakou PHP extension, je asi nejlepší jít cestou dynamické extenze. Dá se snadno testovat z adresáře, ve kterém máte zdrojové soubory extenze. Vývojáři PHP s tím dokonce počítají, pro testování dynamických extenzí je udělána v makefilu přímo podpora.

Doporučuji se nejdříve sestavit kostru modulu a tu si zkusit přeložit. Problém je trochu v tom, že k té kostře je toho potřeba docela dost a když něco chybí, dost špatně se hledá, co vlastně chybí. První věc je tedy konfigurace pro překlad modulu. PHP se drží klasické GNU autotools cesty, takže jde o soubor config.m4, kde kombinací shellu, autoconfu, automake atd. docílíte správné konfigurace pro kompilaci, slinkování a nainstalování vaší extenze. PHP vývojáři přidali do autoconfu některá makra, která vám ulehčí práci. Základní config.m4 pro jednoduchou extenzi bez použití externích knihoven je to, co je vidět v mé extenzi pro include path.

PHP_ARG_WITH(incpath, for OOP IncPath wrapper support,
[  --with-incpath          Include IncPath OOP wrapper support])

Makro PHP_ARG_WITH zajistí přítomnost přepínače ve vygenerovaném configure a pro podporu kompilace Vaší extenze.

if test "$PHP_INCPATH" != "no"; then
    PHP_NEW_EXTENSION(incpath, incpath.c, $ext_shared)
fi

Tady říkáte, že když si uživatel vybral kompilaci vaší extenze, tak jak se extenze bude jmenovat, jaké soubory jsou nutné k její kompilaci a že se bude jednat o sdílenou extenzi. Pokud děláte extenzi čistě jen jako PHP záležitost - není to wrapper nad nějakou C/C++ knihovnou - tak s tímto vystačíte. Pro wrapper máte v podstatě dvě možnosti.

Pokud je knihovna malá, tak je možné zdrojáky knihovny mít jako součást extenze, kompilovat to všechno jako jeden celek. Config.m4 pak zůstane v podstatě stejný, jen naroste definice souborů pro kompilaci. Takhle je to třeba s php extenzí pro dnes tak populární databázi mongodb.

Druhá možnost je kompilovat proti existující knihovně v systému. Tohle je ta správná voda na mlýn autoconfu, který je přesně na tohle určen. Zkontrolovat definované závislosti a provést testy tak, aby se komplilovalo a linkovalo s tím, s čím se má. Když něco chybí, tak zařvat. Tady už je to ale opravdu dost o tom znát shell a autoconf. Dost pomůže poučit se od ostatních, např. v geoIP extenzi je vidět, jak se kontroluje přítomnost hlavičkových souborů, vlastní knihovny, funkcí v knihovně atd.

Celá věc s config.m4 vyjde najevo v okamžiku, když spustíte phpize. To se pak ve Vašem adresáři s extenzí objeví hromada souborů z GNU autotools pro kompilaci (aclocal.m4, configure.in, libtool …), které jsou součástí systému, pokud jste instalovali php ze zdrojových souborů případně máte nějaký ten php-dev balíček. Váš config.m4 do nich krásně zapadne. Např. když spustíte configure --help uvidíte volbu pro kompilaci vaší extenze.

Jen tak na okraj, pár projektů - zejména celé KDE - začalo upouštět od klasického autotools a migrovat na cmake. Je pravda, že ta sbírka shellu a m4 mi tedy nebyla nikdy moc sympatická, tak uvidíme, jestli se toho někdy dočkáme i u php. V rámci GSOC už na to bylo vypsáno téma, zatím se ale nic zásadního neděje a určitě ještě dlouho nic dít nebude.

Příště až čas dovolí, tak už snad něco přímo ke zdrojáku modulu.

]]>
0
XHP - bohatší PHP syntaxe Sat, 13 Feb 2010 00:38:16 +0100 http://mirin.cz/blog/xhp-bohatsi-php-syntaxe http://mirin.cz/blog/xhp-bohatsi-php-syntaxe Už se o tom zmínil Jakub Vrána, ale jeho článek se je poměrně dost povrchní. Zkusím se na php extenzi XHP od Facebooku podívat trochu podrobněji. Z marketingového hlediska je nutné zdůraznit, že možnost používat XML literály v PHP je opravdu velké plus. Je to např. jedna z mála věcí, kterou příznivci C# závidí VBkářům. Na druhou stranu je pravda, že použití XHP je o dost pomalejší oproti přímému zápisu řetězců v PHP.

Co to vlastně jsou XML literály v podání XHP? Pokud máme tenhle XHP kód

$href = 'http://www.php.net';
$url = <a href={$href}>PHP web</a>;
echo $url;

nebo spíše přímo

$href = 'http://www.php.net';
echo <a href={$href}>PHP web</a>;

Tak výsledkem bude vypsání HTML linku na web PHP. Celá magie je v tom, že v proměnné $url není textový řetězec, ale objekt, který vznikl při kompilaci skriptu. Ten má samozřejmě i metody, např. lze psát toto

$list = <ul />;
foreach ($items as $item) {
  $list->appendChild(<li>{$item}</li>);
}

XHP má i další zajímavé vlastnosti.

  1. umožňuje v {} uvádět na rozdíl od PHP řetezců jakýkoli PHP výraz, ne jen pouze proměnnou
  2. kontextové escapování
  3. validaci již při kompilaci skriptu na serveru, $header = &lt;h1&gt;Header&lt;/h2&gt;; není validní XML literál, &lt;/h2&gt; není ukončení &lt;h1&gt;
  4. možnost definovat si vlastní třídy pro elementy, atributy a dokonce specifikovat hierarchii pro validaci

Definice vlastních elementů a atributů má speciální syntaxy, která není validní PHP syntaxe pro zápis PHP tříd. Je to další specifikum XHP. Příklady můžete najít adresáři v php-lib, kde je definice core xhp elementů a html elementů.

Podle dokumentace dělá XHP extenze to, že obsahuje parsování a kompilaci vlastního jazyka, který je nadmnožinou standardního PHP. Výsledek je pak předán dále do PHP, které ho pak vykoná. Kompilátor lze využít i v podobě dodávaného programu xhpize, který generuje z XHP standardní PHP, můžete tak XHP použít i na hostingu, kde žádná xhp extenze není.

Parser dokonce rozumí jedné konstrukci, která je v PHP už dlouho postrádána - podpora operátoru [] jinde než jen na proměnné. V XHP tedy můžete napsat

$bar = foo()['bar'];

a v $bar dostanete hodnotu prvku s indexem 'bar' z pole, které vrátila funkce foo.

Je zde také zřejmý ten problém s výkonem. Každý vypisovaný XML literál se zkompiluje do objektu a volání metody render, což je samozřejmě mnohem náročnější, než vypisování řetezců v PHP. Už samotná bytecode cache to dokáže docela zlepšit.

Celkově je to velmi zajímavé řešení, které velmi rozšiřuje možnosti PHP jako prostředku pro frontend. Killer feature je právě parser nadmnožiny standardního PHP, který přináší výše zmíněnou validaci již při kompilaci skriptu, to pravděpodobně žádný dosud existující PHP šablonový systém neumí a jen tak umět nebude. I když ono se to ani se šablonovacímy systémy moc srovnávat nedá.

]]>
0
Co to je PHP extension Sun, 31 Jan 2010 23:59:00 +0100 http://mirin.cz/blog/co-to-je-php-extension http://mirin.cz/blog/co-to-je-php-extension Tak tedy zkusím něco začít o tom jak na PHP rozšíření. Tenhle a další zápisky budou spíš takové povídací, jako ukázka nějakého základního kódu může posloužit třeba include_path wrapper, můžete si ho projít projít a stáhnout z repository. Není to sice úplné hello world, ale zas tak daleko to od něj není. Psát PHP rozšíření není tak přímočarý proces jako psát PHP skript. Postup budu popisovat na Linuxu i když bych se opravdu neoznačil za nějakého Linuxového profíka, 90% času za počítačem trávím na Windows. Linux/Unix je ale základnou pro vývoj PHP a jeho použití pro vývoj extenze je zdaleka nejjednodušší a nejpoužívanější. Tak proč si to zbytečně komplikovat.

Příprava prostředí

Jako první krok by bylo vhodné stáhnout si zdrojové kódy aktuální verze PHP a přeložit si je klasickou kombinací

$ ./configure
$ make
$ make install

./configure --help vám sdělí množství voleb pro různé moduly, co zvolíte je na Vás. Samozřejmě můžete používat různé php-dev balíčky vaší distribuce a nainstalovat si tak pohodlně jen hlavičkové a .lib knihovny, ale doporučuji raději si PHP zkompilovat ručně někam do /usr/local apod.

Po make install budete mít nainstalovánu i podporu pro tvorbu a instalaci rozšíření pomocí skriptů phpize a pecl. Navíc zdrojáky PHP budete potřebovat stejně, protože v nich budete hledat jak o život, jak se co vlastně dělá.

Takže máme nainstalováno. Teď něco k tomu, z čeho se extenze skládá. Většinou jde o 3 a více souborů. Typicky je to

  1. extname.c - vlastní zdrojový kód pro naše rozšíření
  2. php_extname.h - hlavičkový soubor pro naše rozšíření
  3. config.m4 - trochu shellu a m4 vám zajistí, že si vaší extension všichni zkompilují pomocí staré známé výše popsané trojkombinace.

Extenze můžete psát jak v C, tak v C++. C drtivě převažuje. Exteze v C++ byste spočítali na prstech jedné ruky, většinou jde o wrappery nad C++ knihovnami. Jak extenze vlastně fungují a co v PHP představují? PHP core se skládá v podstatě ze tří částí:

  • Zend Engine
  • SAPI vrstva
  • Core rozšíření

Zend Engine obsahuje takové ty všemožné kompilátory našich skriptů do bytecode, a virtuální stroj, který ho interpretuje. Dále pak poskytuje základní API pro extenze, takže manipulaci s pamětí, manipulace s proměnnými, funkcemi, třídami, základními typy. Tuhle část budete v rozšíření velmi často používat.

SAPI vrstva zprostředkovává komunikaci s prostředím, ve kterém PHP běží. Může to být Apache Modul, IIS modul na Windows, CGI, nebo commnad line (CLI) SAPI. Poskytuje také stream přístup k I/O, stará se o save_mode, open_basedir.

Core rozšíření tvoří velkou část PHP. Když si stáhnete zdrojové kódy PHP, tak všechno co je v adresáří ext je rozšíření. Takže funkce na práce s poli, řetězci, datumy, matematické funkce, databáze, atd. To vše je v PHP jako rozšíření.

Rozšíření se dá charakterizovat zjednodušeně jako seznam funkcí, kterým Zend Engine předá řízení, když při vykonávání skriptu narazí na volání, které spadá do nějaké extenze. Až tahle zkompilovaná funkce v extenzi doběhne, tak vrátí hodnotu zpět Zend Engine a ten už s ní naloží dále tak, jak mu velí uživatelův skript. Většinou si jí uloží do proměnné a za chvíli zavolá další funkci z nějaké extenze atd.

Proč vlastně psát nějaké nativní extenze a co k tomu lidi vede?

  • Wrapper nad nějakou C/C++ knihovnou. Tady je to asi jasné. Máme nějakou pěknou céčkovou knihovnu a přihlásí se nám pár lidí, že by jí rádi využili i z PHP, tak holt budeme muset napsat rozšíření. Spousta příkladů se válí v PECLu, další tisíce různě po internetu.
  • Potřebujeme mít nějakou část naší aplikace opravdu rychlou. PHP je jak známou dost velký šnek co se týče rychlosti vykonávání kódu skriptů. Hůř už na tom bývalo jen Ruby a to se z příchodem Ruby 1.9 také změnilo. Tohle byl určíte důvode pro vznik spousty rozšíření u Yahoo a Facebooku.
  • Jen tak, když už vám to PHP leze vším možným a trochu céčka by nezaškodilo :-).

Proč se vlastně extenze píšou více v C a nikoli v C++ když C++ toho nabízí mnohem více? Důvod bude asi ten, že takové ty základní věci, se kterými se v C pracuje ne úplně dobře (řetězce, pole) jsou součástí Zend Engine. Dále pak každá extension nemusí pouze rozšiřovat PHP směrem do user space, ale také směrem k extension api, takže její funkcionalitu můžete využít přímo i ve své extension bez volání oklikou přes Zend Engine. Když si tedy vezmete Zend Engine jako základ pro práci s poli a řetězci a extensions v core, tak pak není moc důvodů používat C++.

Jinak samotné extension api je velmi konzervativní a od PHP 4 se příliš nezměnilo, jen se rozšířilo o objekty. Něco většího přijde až s PHP 6, ale to je ještě někde za horami. Jinak samozřejmě i PHP třídy a objekty se v extension píší v C, jen je tam trochu více maker. Obecně je psaní extension zejména ve stylu "všude nějaké makro", ale tak to bude asi ve všech jazycích, které mají API do C.

Příště možná něco k základu modulu a konfiguraci.

]]>
0
Aktualizovaný výhled produkce ropy - Listopad 2009 Wed, 09 Dec 2009 16:25:25 +0100 http://mirin.cz/blog/aktualizovany-vyhled-produkce-ropy-listopad-2009 http://mirin.cz/blog/aktualizovany-vyhled-produkce-ropy-listopad-2009 Už delší dobu jsem se nepsal o tom, co je děje na poli energií a ropy zejména. Nemám už moc čas a také nečekám žádné velké změny, ropný zlom se zdá být realitou, která klepe na dveře (s největší pravděpodobností už vešla) a nikoho to moc nezajímá. Dokud prostě lidé budou mít levné pohonné hmoty, levné spotřební zboží a levné energiie o nic moc se zajímat nebudou a budou nad tím mávat rukou. Podívejme se tedy na to, jak to vypadá s výhledem zásob ropy se zahrnutím posledních trendů, jak ho prezentuje na oildrumu klasická analýza od Aceho.

Analýza v sobě zahrnuje i srovnání s posledním World Energy Outlook od IEA. Čekalo se, že IEA realitu ropného zlomu konečně připustí a zohlední ve svém výhledu, nicméně nic zásadního se nestalo. V podstatě říkají, že v nejbližší době to nebude dvakrát růžové, ale po roce 2012 budeme zase v klidu a užívat si plných nádrží. To je pochopitelně v příkrém rozporu s tím, co je vidět z Aceho grafů a analýz.

 Budoucí produkce ropy do roku 2012 První graf výhledu produkce ropy do roku 2012 ukazuje zvlněné platau od poloviny roku 2005 do začátku roku 2009 s vrcholem v červenci 2008. Aceho analýza zahrnující přes 300 projektů na těžbu ropy ukazuje na pokles v produkci o 2.2 milionů barelů denně. Ani optimističtější analýza Colina Cambela není o nic lepší. IEA pro toto období uvádí setrvalý stav zapříčiněný zejména podinvestováním stávajících projektů, který má kořeny v hospodářské krizi.

Výhled za rok 2012 je už rapidně odlišný. Zatímco Ace a ostatní kalkulují s více méně ověřenými zásobami (včetně Iráků, nových objevů v Brazílii, arktickými zásobami). IEA používá stále stejnou metodiku z roku 2000, kde více méně věří tomu co říká OPEC o potvrzených rezervách. IEA tedy říká, že pokud se investice do ropných projektů vrátí na původní úrovně jsme v pohodě. Jeden se nestačí divit.

Shoda více měně panuje v tom, jak jsou na tom země OECD. Tam produkce klesá a klesat bude. Pro nás v Evropě to znamená jediné, se Severním Mořem je ámen a rýsuje se nám tu pěkná závislost celé Evropy na Rusku, přičemž Rusové se samozřejmě pokoušejí tuto závislost prohloubit čím dál více. Doporučuji si v archivu Českého rozhlasu najít záznamy rozhovorů s panem Bartuškou (níže citovaný záznam zde), expertem pro energetickou bezpečnost. Má poměrně jasné vyjadřování, ze kterého opravdu pochopíte jak na tom v nejbližší době budeme s energiemi v Evropě, potažmo u nás - dost bídně. Volně cituji a dvakrát podtrhuji.

Náš problém není atom, nebo uhlí. Náš problém je velmi velmi jednoduchý. Máme nádherný životní styl, luxusní, příjemný, který je neudržitelný. Něco budeme muset obětovat. Část našeho životního stylu, peněženky nebo životního prostředí. A tento výběr bude zásadní téma příštích let. Bude to nepříjemná a bolestná změna ale bude nutná.

 oil crunch v roce 2012

Ačkoli se to nezdá, tento rok byla uvedena do provozu kapacita 1 mbd Saudské Arábie, 0.4 mbd Brazílie, 0.5 mbd Ruska a 0.3 mbd USA. Další větší novou produkci lze očekávat až okolo roku 2013 od Saudské Arábie. Proto Ace očekává první náraz (world crude oil crunch) okolo roku 2012. Pak se produkce pomalu zvedne, vrcholů z roku 2008 a 2005 však dosáhne těžko. Přes ujišťování médií čekejme spíše temnou budoucnost. Nutnost uspokojit energetické nároky našeho životního standardu bude mít za následek prolomení limitů těžby uhlí a zahrabání do země jakýchkoli snah o snížení emisí jinde ve světě. Kanada, která těžbou ropných písků naprosto devastuje krajinu okolo Alberty, je první ze zemí, která se bude snažit bojkotovat tyto snahy. Zároveň tyto okolnosti pravděpodobně zabrzdí jakoukoli snahu o hospodářský růst v nejbližších letech.

]]>
0
Co nás možná čeká v PHP 6 Thu, 03 Dec 2009 13:54:11 +0100 http://mirin.cz/blog/co-nas-mozna-ceka-v-php-6 http://mirin.cz/blog/co-nas-mozna-ceka-v-php-6 Trochu se divím, že se zatím nikdo moc nezmiňoval o proběhlém php core developer summitu v rámci akce php|tek 2009 v květnu tohoto roku. Šlo o dva dny a php vývojáři se sešli na půdě pobočky Microsoftu :-). Probíraly se témata týkající se nadcházejících vydání PHP 5 (5.3, 5.4) a PHP 6. Probíraly se i problémy, které brzdily v té době ještě připravovanou verzi 5.3, ty už by tedy měly být aktuálně vyřešeny.

Unicode

V prvním dni se probíralo hlavně unicode. Spousta věcí na Unicode ještě není hotova. Velký kus práce je třeba udělat na PDO, některé api access knihovny mají přímo zabudovanou podporu pro unicode, jiné ne. Databáze (resp. jejich dřívější verze), jejichž access API nemají podporu konverze znakových sad asi nebudou vůbec do PDO zahrnuty. PDO na unicode obecně není připraveno.

Další věci související s unicode:

  1. PHP parser sám o sobě nerozumí UTF-16 kódování
  2. Problémy jsou zatím s podporou unicode u globálního pole $_SERVER, cookies, sessions, filter extenze.
  3. Není uspokojivě vyřešena normalizace názvů tříd a identifikátorů.
  4. String konverze uvnitř Zend Engine nejsou optimální, týká se i operátoru []

Ostatní změny v engine

Další věci už s unicode nesouvisí. Stačí shrnutí v bodech.

  1. PDO bude preferovaným DB interfacem pro PHP. Z ostatních by měly zůstat mysql, mysqli, pgsql, sqlite3, oci8.
  2. Extenze mbstring nebude umožňovat přímou integraci s enginem (zástupce strlen apod.), ale bude dále součástí core PHP.
  3. Je potřeba fixnout spoustu valgrind hlášek (memory leaks) a nefunkční testy.
  4. Testovací aplikace pro PHP 6 budou Wordpress, Drupal, Wikimedia a frameworky ezComponents, Zend Framework.
  5. Short tags definitivně zůstává.
  6. Více tlačit na používaní filter extenze, lidi to moc neznají a nepoužívají.
  7. Rezervovat si namespace "PHP" :-).

A teď zajímavější věci:

  1. Začíná se uvažovat o case sensitive pro identifikátory - názvy tříd, proměnné atd.
  2. Traits (kompozice tříd nahrazující vícenásobnou dědičnost), pokud bude reálně použitelný patch.
  3. Podpora vynucení návratového typu funkcí a s tím související podpora skalárních typu (int, string, bool) u vynucování parametrů funkcí. Opět je třeba funkční patch od komunity.
  4. Řešit callback podobně jako jsou teď closures (internal třídou), vylepšit fungováni closures s třídami.
  5. Možnost automatického volání konstuktoru předka.
  6. Vyhazovat exception pro nevalidní parametry při volání funkcí.
  7. Magic metoda __cast() pro přetypování.
  8. Read only pro členské proměnné tříd a možná normální proměnné, urychlilo by to zejména věci ohledně DB.
  9. Objekty třídy ArrayObject, resp. ArrayAccess by měly být akceptovány všude, kde je akceptováno klasické pole.
  10. Něco na způsob safe_mode, ale lepší :-)
  11. Function call chaining, když už je funkce plnohodnotným typem/objektem - f()() - pokud f() vrací funkci.
  12. Array dereferencing, pokud funkce vrací pole - f()[0].
  13. Property ve stylu C#, syntaxe asi ve stylu:
  class Foo {
     public $bar
         getter { return $this->bar; }
         setter { $this->bar = strtolower($value); }
     ;
   }
 

Je RFC, ale patch zatím žádný.

  1. Podpora vnořování ini souborů.
  2. Statické třídy - pokud bude nějaký rozumný use case a patch.
  3. Striktní třídy - zakázat vytváření dynamických členských proměnných (nepovolí $this→foo = bar;), patch zatím žádný.
  4. Odstranění final z členských proměnných Exception tříd.

Některé věci z tohoto by se možná mohly objevit ještě v PHP 5.

Na php wiki jsou i některé další věci, ale to výše zmíněné je asi nejzajímavější. Co na to říci? Zní to zajímavě, ale bůh ví, kdy se alespoň zlomku toho v PHP dočkáme a jak to ovlivní "pomalost" PHP, a hlavně jak bude zajištěna zpětná kompatibilita :-).

]]>
0