20.11.2007
IPC 2007 – 3. dan
Ne, nisem pozabil na IPC, le časa ni bilo za dobra poročila, danes bom pisal o PHP 6, PHP 5.3, o PHP frameworkih, test-driven developmentu, o code reviewih in o tem kako izboljšati hitrost vaših php aplikacij
PHP6 – A look Ahead
Stefan Priebsch
Večino featurjev, za katere marsikdo misli, da bodo v PHP 6, so razvijalci prestavili v PHP 5.3, tako da je bilo predavanje pravzaprav v večini o PHP 5.3.
Največji feature PHP 6 naj bi bil unicode, ki pa razvijalcem dela kar veliko težav. PHP 6 kaže na konec leta 2008, če ne celo 2009, PHP 5.3 pa v začetku leta 2008.
Za PHP 6 smo že rekli, da bo (če bo vse po sreči) unicode, in se bomo končno znebili uporabe mb_* funkcij
Sicer pa v PHP 6 bodo med drugim odstranjene naslednje dosti uporabljene php.ini nastavitve:
- register globals
- magic quotes
- safe_mode
- short open tags (<?, <%..)
Ker pa je PHP 6 še daleč, se sedaj najprej osredotočimo na PHP 5.3. Nekatere stvari mogoče še niso 100 %, tako da me ne držat za besedo
Uporabljajte preg_* funkcije, saj bo ereg_* lib premaknjen v PECL. Za bazo uporabljajte PDO (vse non-PDO razširitve za delo z bazami bodo premaknjene v PECL, mysql[i]_* naj bi vseeno pustili, ampak ni še dorečeno).
Velika novost bodo namespaces, ki bodo gotovo dodani že v PHP 5.3. Sedaj bomo lahko končno imeli classe z enakimi imeni tudi v PHPju
V PHP 6 bo dodan APC Code Cache po defaultu, zato je priporočljivo, da je to cache system, ki ga boste uporabljali že sedaj.
Za vse tiste, ki si želite bolj podrobno ogledati vsebino predavanja si lahko downloadate slajde iz predavanja:
http://inside.e-novative.de/uploads/PHP6ALookAhead.pdf
Panel-Diskussion 1
Frameworks
Bila je kratka debata o frameworkih, pravzaprav smo si ogledali le Zend Framework in Symfony. Govorili smo o tem ali so frameworki primerni za vse strani ali ne, vsi so zatrjevali da ja (še posebno tisti od Zenda), če je pravilno uporabljan (cache, cache, cache). Tudi meni se je zdel Zendov bolj zanimiv, zato si ga imam enkrat, ko bo čas, tudi pobližje ogledati.
Levo predstavim eZ components, nato Lars, nato predstavnik Zend Frameworka, nato predstavnik Symfony and desno povezovalec diskusije.
Test-Driven Development
Derick Rethans
Derick je zanimiv predavatelj, med drugim avtor nam developerjem vsem znanega orodja Xdebug.
Derick Rethans ravno kaže poročilo PHPUnit testa.
Derick je govoril o razvijanju aplikacij s stalnim testiranjem. O tem sem že pisal že v prejšnjem postu, tako da priporočam da si prebere le-tega
Zanimiv pregovor: “It’s OK to write code that does not work” .. “Just don’t ship it!”.
Sicer pa pregovor za zapomnit je: “Feature without a test is not a feature.”
Pa še nekaj študijev primerov:
- Microsoft je ugotovil, da pisanje testov vzame 15 % več časa.
- IBM je ugotovil, da ima koda za katero so spisani testi, 40 % manj napak.
- Ericsson je ugotovil, da se je po pisanju testov, produktivnost ekipe povečala za 16 %.
- Pri vseh so ugotovili višjo kvaliteto kode!
Nekaj hitrih nasvetov:
- za teste php kode uporabljajte PHPUnit
- za system teste (npr. da avtomatsko testirate ali stran deluje v različnih brskalnikih) uporabite Silenium
- load, stress, security, itd. testi: ab, siege, httperf, chorizo (niso vsi brezplačni)
Za vse tiste, ki še vedno ne veste o čem govorim, govorim o tem, da se da avtomatizirati testiranje kode (ali deluje pravilno), testirati v različnih brskalnikih stran na več različnih računalnikih naenkrat in dobiti report tega, testirati performance, itd. vse to popolnoma avtomatično!
Slajdi predavanja so na voljo na tem naslovu:
http://derickrethans.nl/files/tdd-ffm2007.pdf
Managing Code Reviews
Max Horváth
Za code review štejemo, ko nekdo za nekom pregleda kodo ali je kvalitetno spisana (ponavadi to delajo senior developerji) . Max je razlagal o tem kako delati code reviewe v velikih skupinah kjer ne moreš ravno vsakemu programerju rečt “hej, daj povej zakaj si dodal tole kodo v ta fajl?”.
Orodje Jupiter je plugin za Eclipse, ki vam bo zelo pomagal pri code reviewih, vi (kot senior developer) boste vnesli opombo na neko vrstico kode in programerju se bo v Eclipsu pokazalo sporočilo na tej vrstici na določeni datoteki in tako bo vsak programer dobil informacijo o kodi oz. vprašanje točno tam kjer bi se moralo pojaviti, pa čeprav ga ni 1 teden v službi (ponavadi, se kaj najde, ampak če je ta oseba na dopustu, se v nekaj dneh že pozabi kaj je bilo narobe).
Eno boljših (sicer komercialnih) orodij za delati code reviewe je tudi Cruicible.
Max Horvath
Improving PHP performance.
Johannes Schlüter
Johannes je govoril profilingu in kako pohitriti strežnik na katerem teče php.
Za profiling priporoča:
- Apache benchmark
- http_load
- Xdebug + Kcachegrind
MySQL optimizacija:
- omogočite keširanje “enable query cache”
- increase buffers (key_buffer_size, table-cache, sort_buffer_size).
- uporabljajte čim manj queryev
- iz baze izberite le tiste kar rabite (SELECT * FROM je BAD!, uporabljajte SELECT stolpec1, stolpec2 FROM.. saj je veliko hitrejše, če naštejete zahtevane stolpce)
- joini so hitrejši od subselectov
- EXPLAIN pove veliko, poglejte si ta ukaz (postavite ga pred SELECT in izpisal bo veliko uporabnih informacij)
Če imate statične vsebine (npr. slike, videe, statične html strani, itd.) jih ne poganjajte preko Apacheja, ampak uporabite Lighttpd.
Če res ne rabite .htaccess datotek (tako ali tako si lahko vse namečete v virtualconfig), potem izklopite ta feature, ker drugače apache v vsaki mapi za vsak request išče .htaccess datoteko (vsaka slika posebej se npr. šteje za 1 request, tako da ko odprete eno večjo stran je to lahko tudi 300 requestov, kar veliko loada po nepotrebnem). Hint: AllowOveride None.
php.ini nastavitve:
- include_path – ne uporabljajte
- magic_quotes_gpc dajte na off!
- register globals dajte na off!
Priporoča OpCode keširajte (o tem sem danes že pisal), nekaj opcode cache sistemov:
- PHP Accelerator
- Zend Platform (plačljivo)
- eAccelerator – najmanj priporoča (za php4 je dober, za php5 pa ne)
- xcache – je optimiziran za fastcgi
- APC – pravi da je najboljši!
include_once in require_once delujeta počasi, če se le da uporabljajte le include in require in sami pazite kolikokrat kaj includate. Za vse tiste, ki ne veste razlike med require in include.. ni razlike! Razen tega da require vrne fatal error, če ne obstaja datoteka, include pa warning (ja, je pa res, da je bila še ena razlika v php3, od php4 dalje pa ni več).
V PHPju se izgibajte regular expressionom, če se le da in uporabite vgrajene string funkcije (kdaj se da enak rezultat doseči s string funkcija, kot če bi klicali regex).
Funckcije so počasne v PHPju, npr. PHP_VERSION je veliko hitrejši kot phpversion().
Magic klici v classih so počasni (__set(), __get(), __call()). Tudi __autoload je počasen.
Veliko ljudi se je navadilo uporabljati @ operator, ki izklopi poročanje napak za trenutni ukaz. Ne uporabljajte tega operatorja, saj je počasen! Raje pišite dobro kodo, ki ga ne bo potrebovala. Če uporabite @ operator na E_ALL error reporting levelu, da vam nebi izpisalo noticea, pomeni, da vaša koda ni prav dobra.
Generiranje napak je počasno, zato vedno na production serverju nastavimo error_reporting na 0.
Reference v PHPju niso hitrejše (npr. klic funkcije po referenci, namesto vrednosti)!
Casino night!
Po vseh teh predavanjih je sledil casino night na katerem smo se programerji lahko pomerili v Hold’Em Poker, BlackJack in Ruleti.
Na ruleti ni nihče zdržal prav dolgo.. se hitro vse izgubi
Na žalost smo igrali z nepravim denarjem.. zakaj na žalost? Ker sem v blackjacku rulal, pravzaprav dokaj ponesreči, malo sem se po več kot eni uri naveličal in začel staviti vedno več, potem je prišlo do maximalne stave na mizi in rokorda večera, 1000 kreditov:
Prva max stava večera!
In sem dobil! Nato sem imel še ploščico za 1000 in igral naprej. Počasi sem potem stavil vedno po 1000 in seveda na koncu vse izgubil, kot je standard v casinojih
Če bi bilo le tako tudi v pravih casinojih, tam pa ponavadi dokaj hitro vse izgubim, ampak saj je samo zabava
Uf.. ne morem verjet koliko časa vzame napisati en takole obsežen post, čeprav sem preletel na hitro predavanja in marsikaj izpustil, no saj zato sem pa dodal tudi povezave do slajdov




“Generiranje napak je počasno, zato vedno na production serverju nastavimo error_reporting na 0.”
am, a jest tole mal narobe razumem al si ti mal narobe napisal?
drugace pa super zapis, me mika it pogledat naslednje leto
david: mišljeno je bilo, da je generiranje napak počasno in jih zato izklopimo (in NE le da ne prikazujemo errorjev na ekran preko display_errors na off in potem pišemo napake v error log).
Je le ena možnih optimizacij, ki pa se je sam ne poslužujem, saj je uporabno videti v logih kaj je šlo narobe na production serverjih, ker nekako koda ni nikoli 100 % perfect (če ne drugega bo kje kak timeout, ko se kaj dela prek stream resourcev)
Torej bo šel ves backward compatibility po zlu? To nebi bilo najboljš, ker jaz trenutno še zmeraj pišem brez PDO. Razlog? Moj hosting še po tednih teženja ni vklopil PDO :S
No res, da queryji požrejo dost časa za izvajanje, ampak fatg je 1x rekel, da je hardware cenejš kot programer in tle se moram nekako strinjat, če boš ti 2x več časa porabil, da boš iz dveh queryjev naredil enega, je izguba časa.
Tole je relativno, v določenih primerih je RegEx hitrejši (sem delal benchmark :p ).
Ja je počasen, ampak meni prihrani ogromno dela, ker mi ni treba za vsak class razmišljat kam sem ga vtaknil… ampak ta metoda sama poskrbi zato.
Veliko ljudi se je navadilo uporabljati @ operator, ki izklopi poročanje napak za trenutni ukaz.
Res, zadeva je počasna, ampak ponekod je potrebno zadevo uporabit npr. v kombinaciji z funkcijo fopen (vnaprejšnje preverjanje zna biti počasnejše, saj moraš preveriti vsaj 2 stvari: če datoteka obstaja in če je berljiva).
sverde1:
saj bodo gotovo večinoma vsi dodajali mysql[i] extension zaradi uporabnikov, ker drugače bi bila kar kriza, ker bi crknilo 99 % strani.
Pri queryih je tako.. če znaš v enem, naredi v enem, sicer pa se programerji vedno radi kaj novega naučimo, ker drugače nebi nihče uporabljal JOINov
Predlagam, da objaviš benchmarke na svojem blogu, bo gotovo dobro bran post
Se strinjam, je kul, če imaš standardiziran library in se ti vse avtomatsko includa.
@ je še vedno lenoba
p.s.
post odraža v večini mnenja predavateljev, kar pa še ne pomeni, da vse principe uporabljam tudi sam v praksi (čeprav se trudim čim več meni smiselnih idej za optimizacijo kode uvesti v vsakodnevno pisanje kode)
p.p.s.
sverder1: tnx, naučil si me nekaj novega, prej še nisem vedel, da lahko uporabljam blockquote v komentarjih
Vem, vem
O tem sem pa že 1x pisal na blogu