Node.js vagy PHP

A napjainkat leginkább meghatározó két szerveroldali szkript nyelv között a sync és async folyamatok támogatottságában van a legnagyobb különbség. A PHP alapértelmezetten a sync feldolgozást, a Node.js az async-et támogatja.

Az eltérés legésszerűbb oka az, hogy mindkét technológiát más-más időben és technológiai klímában vezették be (PHP – 1995, Node.js – 2009), mindkettő erős alternatívának számít a webalkalmazások hátterében, nyílt forráskódúak, és jelentős támogató közösséggel rendelkeznek.

sync-vs-async-schema.svg

Az aszinkron programozás előnyei

Nincs egymásra várakozás a processeknél. Mindegyik egymástól függetlenül, azonos sebességgel futhat. Egyik process hibája nincs hatással a többi processre. A holtidők megszüntetése sokkal gyorsabb futási sebességet ígér.

Az egyes folyamatokat jobban ki tudjuk dolgozni, a felhasználó igényeihez jobban tudjuk igazítani.

Az aszinkron programozás hátrányai

Az előnyöket csak akkor tudjuk kihasználni, ha a processek között valóban nincs kapcsolat! Ha a processek azonos erőforrásokat használnak, akkor előfordulhat a szakirodalomban Race Condition-nek nezevett jelenség.

A sok alfolyamat közötti összefüggés nem csak a programozók, de a keresőmotorok számára is nehezebben átlátható.

Melyiket válasszam?

Itt meghatározó, hogy milyen feladatot kell megoldani. Amennyiben nincsenek nyelvi problémák és mindkét nyelvet megfelelően ismerem:

Ha a projekt nagyobb részt statikus, amely kevés ügyfélkérést igényel, és a célközönsége kisebb teljesítményű eszközöket használ, a PHP a megfelelő választás.

Ha a használati eset olyan dinamikus webhelyeket tartalmaz, amelyek gyakran küldenek szerverkéréseket, és dinamikus felhasználói felülettel rendelkezik, akkor érdemes a Node.js-t használni.

Ha olyan felhasználói felületet igénylő alkalmazást hoz létre, amelyben a felhasználói élmény az elsődleges szempont. Ebben az esetben az aszinkron hívások lehetővé teszik, hogy a felhasználói felület gyorsan épüljön fel.

Fogalmak

Multitasking

valamikor, a messzi-messzi múltban, amikor még csak egymagos processzorok léteztek, okos programozók kiokoskodták annak a módját, hogy hogyan tudnának időben kvázi párhuzamosan végrehajtatni műveleteket. A DOS például nem tudott ilyet. Ha elindult egy program, annak minden releváns művelete le kellett, hogy fusson, mielőtt ismét valami másba kezdhetett a számítógép. A megoldás az lett, hogy az operációs rendszerbe képletesen beépítettek egy "billenő kapcsolót", ami ciklikusan körbe-körbe váltogat a "futó" alkalmazások aktu­ ális műveletei között. Ez a kapcsoló kissé tudományosabban a scheduler, azaz ütemező néven ismert. Ha a dolog elég gyorsan törté­nik, azt kvázi párhuzamos futásnak érzékeljük. Valójában nem párhuzamos, de olyan, mintha az lenne. Sok csicsával kiegészítve ugyan, de az alapelv a mai napig ugyanez és már a 16 bites programok is képesek voltak erre a trükkre.

Szál (angolul: "thread")

Egy szál egy adott programon belül egy kü­lönálló végrehajtási műveletsorozat. Alkalmazásunk legalább egy szállal fut akkor is, ha még sosem hallottunk szálprogramozásról, tehát alapesetben minden program egy szálban fut. Több szál teljesen különállóan is képes futni, másrészt viszont képesek hozzáférni a program által használt, lefoglalt erőforrásokhoz, akár ugyanazokhoz is. Egy végrehajtási szál külön tárol processzorállapotot stb., ami szintén a párhuzamos végrehajtást segíti. Ez egyrészt nagyon kényelmes dolog, viszont felvet szinkronizációs kérdéseket is: mi van, ha két szál ugyanazzal a fájllal dolgozik és az egyik szál ír, míg a másik olvas a fájlból? Érdekesség: a szálakhoz prioritást is lehet rendelni, ami az ütemező számára jelent fontos információt.

Folyamat (angolul:'"process")

Egy vagy több szálat fog egybe a process. Ne keverjük össze a programmal! A különbség nem annyira egyértelmű, de attól még megvan: a program a programunkat jelenti szőröstül-bőröstül, míg egy folyamat egy konkrét végrehajtási folyamot jelent, amihez több szál is tartozhat. Ettől függetlenül nem baj, ha általában úgy gondolunk a processzre mint a programunkra, de tudni kell, hogy a kettő nem teljesen ugyanaz.

Threads.svg

PHP Threads

A szálak egymástól független feladatok egy folyamaton belül. Midegyik szálnak saját memória, regiszter és verem igénye van, ezért a számítógép-architektúra meghatározza, mennyi szálat índíthatunk a folyamaton belül.

PHP Asynchronous functions

A PHP-hoz készült egy Spatie csomag, amelynek használatával Async műveleteket tudunk indítani. Telepítése a composer require spatie paranccsal megoldható. Használatba vétele a use Spatie\Async utasítás kiadása

Laravel Async

Symphony Async

Zend Async