Zopár programátorských „vychytávok“ z tohoročnej PHPCE konferencie. Časť druhá.

Zopár programátorských „vychytávok“ z tohoročnej PHPCE konferencie. Časť druhá.

Odborná konferencia PHPCE 2017, ktorá sa konala na začiatku novembra v nádhernom poľskom Ossa Congres & Spa centre, nás v mnohom veľmi príjemne prekvapila a obohatila o nové poznatky v oblasti programovania. 

1. Prednáška Nikola Poša: Journey through "unhappy path" - Dealing with exceptional conditions

Zachytávanie nečakaného správania sa určitej aplikácie dá ešte aj v súčasnosti zabrať nejednému skúsenému programátorovi. Pre jednoduchšie odstraňovanie nečakaných situácií je preto dobré poznať niekoľko nápomocných zásad, ktoré nám pritom uľahčia prácu. Niektoré z nich si teraz predstavíme:

  • Do not accept or return null

Toto pravidlo nám hovorí, že nikdy nesmieme akceptovať a ani vracať späť hodnotu označenú ako null. Nezískame z nej žiadne relevantné údaje a pre neskoršie odstraňovanie problémov tak predstavuje nepoužiteľnú hodnotu.

  • Every module/component has to have its own exception

Každý modul či komponent by mal vracať vlastný typ chybového hlásenia, čo nám následne pomáha lepšie identifikovať zdroj problému aj samotný problém. Zároveň platí, že nie vždy je vhodné zobrazovať dané chybové hlásenie používateľovi.

  • User marker interface

Ak chceme, aby bolo možné poskytovať a spracovávať extra dáta, je dobré používať rozšírené triedy výnimiek (exceptions).

  • Encapsulate via named constructors

Pre vytváranie špecifických chybových hlásení zase môžeme používať menné konštruktory. Je to dobrý spôsob, ako pri rovnakej chybe vrátiť rovnaký popis chyby s použitím čo najkratšieho kódu. Zároveň nám to spája výnimku a logiku vytvárania chybových hlásení do jedného zdrojového kódu.

  • Save/provide extra content, Collect as much data as possible

Pri každom chybovom hlásení je dobré, ak dokážeme zaznamenať čo najväčšie množstvo relevantných údajov, ktoré nám neskôr umožnia pohodlnejšie spracovávanie výstupného chybového hlásenia a jednoduchšie identifikovať samotnú príčinu chyby.

  • Create central error handler

Odporúčame tiež používať centralizované error handler-y, ako sú napríklad nasledovné:

Uvedené error handler-y sa dokážu pekne postarať o korektné vypísanie detailov chybového hlásenia, naformátovanie výstupu chybového hlásenia a v neposlednom rade aj o jednoduchšie a pohodlnejšie odstraňovanie chýb.

2. Alain Schlesser: Uncommon (Ab) Uses of Composer

Z tejto nemenej zaujímavej prednášky sme si odniesli množstvo relevantných informácií, pričom by sme chceli upozorniť najmä na nasledovné zlepšováky. Composer možno označiť za vysoko flexibilný nástroj určený pre správu rôznych balíčkov. V súčasnosti ho už používa väčšina vývojárov. Jeho podstatou je správa závislostí medzi jednotlivými balíčkami, vytváranie optimalizovaných autoloader-ov a umožňuje aj správu balíčkov z decentralizovaných zdrojov. Composer však dovoľuje použiť i mnoho ďalších rozšírení, ktoré si priblížme nižšie:

Pomocou tohto rozšírenia možno po zbehnutí composer-a aplikovať dodatočne zadefinované patch-e. Platí však pritom, že tieto musia byť zadané vo formáte odkazu na *.diff súbor. Je výhodné ho použiť, ak potrebujete modifikovanú verziu balíčka, ale nechcete kvôli tomu vytvárať vlastný fork a vlastný balíček.

Výhodou uvedeného rozšírenia je, že nám umožňuje definovať vlastné namespace pre inštalované balíčky pomocou composera a tým pádom použiť viacero verzií toho istého balíčka.

  • Keep up to date

Keep up to date je nastavenie pre composer, v rámci ktorého možno pre určité balíčky vynucovať pri spustení composer-a update. Využitie je napríklad pre udržovanie aktuálnej geolokačnej databázy.

Toto nastavenie podporuje vytvorenie tried, ktoré dokážu spravovať a sledovať git hook-y pri každom spustení composera.

Boilerplate predstavuje rozšírenie, ktoré nám aj v BUXUSe umožňuje vytvárať nové balíčky z preddefinovaných šablón - BUXUS moduly.

Composer nám v neposlednom rade umožňuje používať svoju funkcionalitu pomocou externého skriptu. Funguje to tak, že pri spustení externého skriptu sú zavolané nadefinované súčasti composera.

Pomedzi vzdelávanie sme sa samozrejme aj najesť niečoho museli - jedno autentické, prudko amatérske, mobilom fotené foto nášho skvelého uičkárskeho tímu :-)

3. Holger Woltersdorf: Async PHP requests & reactive responses with php-fpm

Predstavme si teraz situácie, že potrebujeme vygenerovať niekoľko faktúr pomocou PHP. Ak chceme len pár kusov, server s tým nemá žiaden problém. Ak by sme však potrebovali vygenerovať napríklad 1.000 alebo 10.000 kusov, pri tejto práci sa už náš server celkom solídne zapotí. Čo sa s tým dá robiť a ako zachránime server pred potenciálnym pretečením RAM či 100% vyťažením? Na zrýchlenie spracovávania requestov na serveri možno využiť viacero spôsobov, ktoré sú bežne dostupné aj na internete a patria medzi ne napríklad pthreads, pcntl alebo Gearman. 

  • Pthreads je rozšírenie určené pre PHP a používané pre beh multi-thread aplikácií. Pthreads však beží v cli na serveri a nie je preto vhodné pre asynchrónne spracovávanie. 
  • Pcntl je ďalšie z riešení, ktoré by potenciálne prichádzalo do úvahy, dostupné je však len na ne-Unixových platformách.
  • Gearman je na druhej strane služba na serveri, ktorá dokáže spravovať paralelné spracovávanie procesov, vďaka čomu možno dosiahnuť vyšší výkon a rýchlejšie odozvy servera. Pre implementáciu je zároveň potrebné mať ďalšie php knižnice, komplexnejšiu infraštruktúru kódu a mnoho iných nastavení na serveri. Z pohľadu funkcionality je to dobrá voľba, existujú však aj iné riešenia.
  • PHP-FPM je služba na serveri, pomocou ktorej možno spravovať skupiny procesov (tzv. pools) s rôznymi nastaveniami. Medzi mnohé výhody PHP-FPM patrí napríklad aj cacheovanie častí kompilovaného kódu, ktoré možno zdieľať medzi poolmi, vďaka čomu sa odľahčuje pamäť servera. Jedným z možných nastavení je ďalej množstvo pool-ov, čo nám umožňuje spracovávať prijaté požiadavky súčasne a tým znížiť zaťaženie servera. Jeho výhoda spočíva napríklad aj v tom, že akonáhle už pool neobsluhuje žiaden request, tento zanikne a tým v podstate šetrí pamäť konkrétneho servera.

Na internete sú už dostupné aj rôzne PHP knižnice vhodné pre asynchrónne spracovanie pomocou PHP-FPM. Jednu z aktívne udržiavaných knižníc možno nájsť na hollodotme/fast-cgi-client. Jej autorom je mladý nemecký programátor Holger Woltersdorf. Pomocou tohto rozhrania tak možno spracovávať viaceré požiadavky súčasne a umožňuje i paralelné triedené a netriedené spracovávanie requestov. Triedené spracovávanie následne spočíva v tom, že naraz možno spracovávať viacero requestov, ktoré sa končia vždy v poradí, v akom boli iniciované. Netriedené spracovávanie procesov spočíva v tom, že nemusíme čakať na koniec predchádzajúceho requestu v poradí a requesty sú spracovávané v rámci nastavení php-fpm. Vďaka tomu možno dosiahnuť rýchlejšiu odozvu servera a celkové šetrenie systémových prostriedkov.