lehet, hogy divatos, de van-e gyakorlati oka a Node elfogadásának.js? Lee Boynton megmutatja, hogyan lehet valós idejű hírcsatornát hozzáadni a PHP webhelyéhez.

Ez a cikk bemutatja, hogyan kezdheti el a Node használatát valós idejű funkciók hozzáadásához a PHP-alapú webhelyhez. Először is, meg kell nézni egy kicsit többet, hogy mi teszi Node egy jó illeszkedés a valós idejű alkalmazások, mielőtt megy, hogy bemutassa, hogyan kell építeni egy valós idejű hírcsatorna és bele a PHP honlapján.

Thread-based vs Event-based

a PHP-t hagyományosan az Apache és a mod_php modul szolgálja ki. Ha a’ top ‘ parancsot futtatja a Unix-alapú webkiszolgálón, valószínűleg nagyszámú Apache folyamatot fog látni, amelyek webes klienseket szolgálnak fel. Ebben a beállításban minden kliens kérés általában új Apache folyamatot hoz létre, amíg az összes rendelkezésre álló RAM el nem fogy. Az utóbbi időben az nginx és a php-fpm a leghatékonyabb módszer a PHP weboldalak kiszolgálására, de még ebben a beállításban is minden ügyfelet más PHP folyamat szolgál ki. A lényeg itt az, hogy az elejétől a végéig, egy ügyfél kérés egy PHP folyamatot használ fel a teljes időtartamra. Ha az egyes kérelmek feldolgozása hosszú időt vesz igénybe, a szerver erőforrásait nagyon gyorsan fel lehet használni.

a csomópontban egy csomópont folyamat általában minden ügyfelet szolgál ki egy eseményhurokban. Hosszú távú, drága folyamatokhoz, például a fájlrendszerhez, az adatbázishoz vagy a távoli API-hoz való hozzáféréshez aszinkron módszerhívásokat kell használni a blokkolás helyett. Ez olyan visszahívások használatával érhető el, amelyek akkor aktiválódnak, amikor egy olyan művelet, mint a fájlrendszer elérése, befejeződött. Ez azt jelenti, hogy egyetlen csomópont-folyamat folytathatja az új kérések feldolgozását, miközben a drága művelet a háttérben fut. Amikor a drága művelet befejeződött, visszatér az eseményhurok sorába, amelyet csomópontonként tovább kell feldolgozni.

lényegében a Node hasonló környezetnek tekinthető olyan alkalmazások építéséhez, mint a Python Twisted vagy az EventMachine a Ruby-ban. A Node rendelkezik egy beépített gyártásra kész HTTP szerverrel is, így nincs szüksége külön szerverre a futtatásához, mint például az Apache vagy az Nginx, tovább növelve a lean erőforrásigényét (kizárva a memóriaszivárgást).

var http = require('http');http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Worldn');}).listen(1337, '127.0.0.1');console.log('Server running at http://127.0.0.1:1337/');

a fenti kódpélda megmutatja, hogyan lehet egy kötelező” hello world ” webszervert néhány sornyi kódba írni. Az első sor a CommonJS néven ismert modulrendszer használatát mutatja be, amelyet a csomópont külön modulokat tartalmaz. A require függvény beépített, és ebben az esetben importálja a node HTTP modulját az alkalmazásban való használatra. A második sor létrehoz egy új webszerver objektumot. Figyeljük meg, hogy a createServer metódus első paramétere egy névtelen függvény. A legtöbb módszer a Node-ban elfogadja a visszahívási függvényt paraméterként, és ez a kulcs az eseményvezérelt alkalmazások felépítéséhez.

a következő végrehajtási sor az 5. sor, amely metódus láncolással hívja meg a listen metódust a createServer metódus visszatérési értékén (a visszaadott érték a HTTP modul példány). A listen metódus hatására a kiszolgáló elkezdi elfogadni a HTTP kéréseket a localhost 1337-es portján. Az utolsó sor üzenetet ír a konzolra, hogy elmondja, hogy a szerver elindult. Csak akkor hívják meg a névtelen függvényt, amikor a kiszolgálóhoz kérést intéznek, amely a HTTP állapotkódot 200 OK-ra állítja, és beállítja a Content-Type fejlécet. A ‘Hello World’ üzenet végül a HTTP választesthez kerül a 4. sorban.

miért kell használni Node.akkor js?

a Node eseményvezérelt modellje különösen alkalmas valós idejű alkalmazásokhoz, például játékokhoz, hírcsatornákhoz és csevegőalkalmazásokhoz. Ezenkívül lehetővé teszi, hogy ugyanazt a nyelvet használja a frontenden és a backenden. A JavaScript csak egyre népszerűbb, mivel több gazdag kliens oldali alkalmazás épül fel, és a webböngészők gyorsabban hajtják végre a JavaScript-et. A nyelvek közötti váltás frusztráló lehet.

WordPress Spezial

Entwickler Magazin Spezial Vol. 10: WordPressEntwickler Magazin Spezial Vol. 10: WordPress
Alles rund um WordPress im Entwickler Spezial Vol. 10-ab 18.11.2016 im Handel.
WordPress ist l XXI. ngst weit mehr als ein simples Blogsystem. A következő cikkekben az alábbi cikkek találhatók: ; és a következő témakörökben: Affiliate Marketing, E-Commerce u.v.m.

Másodszor, ez jó támogatást WebSockets. Bár lehetséges a WebSockets támogatása PHP – ben, a Node aszinkron jellege és beépített HTTP szervere jobban illeszkedik. A WebSockets a böngészővel való tartós kapcsolat fenntartásának egyik módja annak érdekében, hogy az adatokat gyorsan eljuttassa az ügyfélhez. A korábbi megoldásokhoz képest, mint például a long polling vagy a comet, a WebSocket-ek sokkal alacsonyabb késéssel járnak, mivel nincs költség a HTTP-kapcsolat példányosításának minden egyes alkalommal, amikor bizonyos adatokat el kell küldeni. A WebSockets hátránya, hogy ez egy HTML5 funkció, és mint ilyen, nem olyan jól támogatott a böngészőkben, mint a sima régi Ajax. Lehetőség van azonban kecsesen visszatérni az alternatív technikákhoz, például a hosszú lekérdezéshez olyan böngészőkben, amelyek nem támogatják a WebSocket-eket.

az idei nemzetközi PHP konferencián többet megtudhat a csomópontok integrálásáról.JS PHP-vel!

a nemzetközi PHP Konferencia a világ első PHP konferenciája, amely több mint egy évtizede mérföldkő a PHP és a webes technológiák terén szerzett kiemelkedő gyakorlati szakértelem terén . Az IPC-n a PHP iparág nemzetközileg elismert szakértői találkoznak a PHP felhasználókkal és fejlesztőkkel nagy és kis cégekből. Nézze meg a korai madár árainkat a nagy kedvezményekért!

íme néhány kiemelés-ülések IPC:

  • így a szögletes.js alkalmazás elérhető
    Dirk Ginader (Google)
  • TypeScript-így JavaScript fejlesztés hatékonyabb és robusztus
    Rainer Stropek (software architects gmbh)
  • hogyan készülj fel a PHP 7
    Sebastian Bergmann (thePHP.cc)

ne feledje azonban, hogy a Node egy éretlen platform a PHP-hez képest. Eredetileg 2009 – ben készült, még gyerekcipőben jár, és még nem érte el az 1.0 verziót-ha ez számít neked. Előfordulhat, hogy az Ön által használt API-k a jövőben megváltoznak, vagy nem talál olyan keretet, amely ugyanazzal a funkcióval rendelkezik, mint a kedvenc PHP-keretrendszere. Valóban, tapasztalatom szerint a rendelkezésre álló harmadik fél könyvtárak és keretek általában sokkal kisebb funkcionalitási kötegekből állnak, amelyeket össze kell rakni.

nagyobb a memóriaszivárgás kockázata is, amely az alkalmazás őrlését leállítja. A csomópontfolyamatok általában folyamatosan futnak, míg a PHP folyamatok általában időszakosan újraterveződnek, hogy tagadják a memóriaszivárgások hatását.

az integráló rész

a hírcsatorna integrálva lesz egy alapvető PHP weboldallal, amely kezeli a felhasználói bejelentkezéseket és munkameneteket, a php-fpm és az nginx közös beállításával. Javascriptet fogunk használni, hogy kommunikáljunk a szerver oldalon lévő Node alkalmazással, és dinamikusan frissítsük a hírcsatornát az oldal újratöltése nélkül. Először is, egy gyors félre az üléseken.

Ha még nem tette meg, akkor a munkamenetekhez központi tárolót kell használnia (1.ábra). Memcached könnyen használható erre a feladatra segítségével a beépített munkamenet menteni kezelő a PECL memcached kiterjesztése. Ha azt szeretné, hogy újraindítsa a munkameneteket tároló szervert az adatok elvesztése nélkül, akkor a Redis jó fogadás. Akárhogy is, a központosított munkamenet-tároló lehetővé teszi az alkalmazás egyensúlyának betöltését több webszerveren keresztül. Ezenkívül lehetővé teszi a munkamenet adatainak megosztását más programozási nyelvekkel épített alkalmazásokkal.

1.ábra: megosztott munkamenet-architektúra.

van azonban egy kis probléma a munkamenet adatainak elemzésével. Az alábbiakban egy PHP munkamenet alapértelmezett sorosítási formátumát mutatjuk be:

not|a:2:{i:0;s:4:"easy";i:1;a:1:{s:2:"to";s:5:"parse";}}

úgy tűnhet, hogy a karakterlánc-manipulációval elemezheti, de lehetnek olyan edge esetek, amelyeket nehéz megoldani. Jó lenne, ha a munkamenetet a nagyon szeretett JSON formátumban sorosítanák:

{"this":{"is": "easier", "to": "parse"}}

sokkal jobb. Ez meglehetősen könnyű írni a saját munkamenet serialiser, amely átalakítja, amit tárolni $_SESSION JSON formátumban, lásd a saját verzió.

Alternatív megoldásként érdemes megfontolni az msgpack-et, amely konfigurálható a munkamenetek sorosítására, mint az alábbi kódban, amely azt is bemutatja, hogyan kell használni a memcached-et munkamenet-mentéskezelőként.


van egy harmadik féltől származó könyvtár a Node számára, amely képes sorosítani és deserializálni az msgpack-et, elérhető az npm-ben (a Node Package Manager nagyszámú modult tartalmaz, amelyek az alkalmazásban csak egy egyszerű npm telepítéssel használhatók ). Most megvizsgáljuk a hírcsatorna felépítését a Node használatával, és beépítjük ezt egy PHP alkalmazásba.

PHP App

a PHP alkalmazás egyszerűen kezeli a felhasználói bejelentkezéseket és munkameneteket. A munkameneteket a memcached tárolja, de meglehetősen könnyen tárolható a redis-ben. Az alábbi kód az egyszerű egyoldalas alkalmazás töredékeit mutatja (a teljes forráshoz menjen github.com/lboynton/phphants-march-php).

// // <!]>

a szkript első sora tartalmazza a Composer autoloader fájlt, ami azt jelenti, hogy minden függőség automatikusan automatikusan betöltődik, kiküszöbölve a különálló include vagy require sorok szükségességét (a szerkesztő megjegyzése: a zeneszerzőről bővebben lásd: Jefersson Nathan de O. Chaves cikke). Ebben az esetben a munkamenet-mentéskezelő az egyetlen külső kód, amelyre szükség van. Azonban nagyon könnyű felvenni a packagist-en vagy másutt elérhető harmadik féltől származó csomagokat egy későbbi időpontban a Composer használatával, amely szintén automatikusan hozzáadódik az autoloadinghoz. A 3-as és 4-es vonalak kapcsolatot létesítenek a memcached-rel, míg a munkamenet-mentéskezelő inicializálódik és regisztrálva van a PHP-vel az 5-14-es sorokban. A felhasználók egyszerűen bejelentkeznek a felhasználónév GET paraméterként történő megadásával, bár egy valós Rendszerben ezt egy funkcionálisabb hitelesítési rendszerrel kell helyettesíteni.

a JavaScript oldalon néhány harmadik féltől származó könyvtárat használunk: jQuery, aláhúzás.js és a Socket.IO kliens, amely a csomópont modul böngésző része, amelyet az adatok böngészőbe történő továbbításához használunk. Az io.a connect method call kapcsolatot hoz létre a Node alkalmazással, amely a böngésző támogatásától függően számos szállítás, például websockets vagy Ajax egyikét használhatja. A foglalat.az on metódus egy eseménykezelőt állít be, amely híreket jelenít meg az oldalon, amikor egy ‘hír’ eseményt elindít a szerver oldal.

Megjegyzés: Az alkalmazás a Composer-t használja a session save handler és a Bower telepítésére, amely egy csomagkezelő az ügyféloldali eszközök telepítéséhez. A Bower telepítéséhez futtassa az ‘npm-g install bower’ parancsot. Ezután telepítse az eszközöket, do ‘bower install’. Alternatív megoldásként frissítse a szkriptcímkéket és stíluslapokat a helyi verziókkal.

az alkalmazást Nginx segítségével szolgálják fel. Itt van az nginx konfigurációs fájl:

upstream node { server localhost:3000;}server { listen 8080; server_name php-node-demo.localhost; root /home/lee/public_html/php-node-demo; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ .php$ { include fastcgi_params; fastcgi_index index.php; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ /socket.io { proxy_pass http://node; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }}

Az 1-3 vonalak meghatározzák a csomópont alkalmazást futtató upstream szervert. Bármely kérés véget ér .a php-t a php-fpm-re (15-20-as sorok) küldjük, míg a /socket kéréseket.az URL-ben lévő io átkerül a Node alkalmazásba (22-27 vonalak). A 25.és 26. sor azt mondja az nginx-nek, hogy támogassa a protokollváltást, és engedélyezze a WebSocket-ek proxyját a Node-hoz. Ez azt jelenti, hogy mind a PHP alkalmazás, mind a Node alkalmazás ugyanazon a porton fut, ami az ügyfelet illeti.

csomópont.js App

a csomópont.a js app egyszerűen kezeli a hírcsatorna minden ügyfélkérését. A részleteket az alábbiakban mutatjuk be (lásd github.com/lboynton/phphants-march-node a teljes forrás).

io.set('authorization', function(handshake, callback) { var cookies = cookie.parse(handshake.headers.cookie); mcClient.get('sessions/' + cookies.PHPSESSID, function(error, result) { if (error) { callback(error, false); } else if (result) { handshake.session = JSON.parse(result); callback(null, true); } else { callback('Could not find session ID ' + cookies.PHPSESSID + ' in memcached', false); } });});io.sockets.on('connection', function(socket) { var session = socket.handshake.session; sockets = socket;);function getNews() { redis.blpop('news', 0, function(err, data) {news = JSON.parse(data);if (typeof news.to !== 'undefined') { if (typeof sockets !== 'undefined') {sockets.emit('news', news.content); }} else { io.sockets.emit('news', news.content);}process.nextTick(getNews); });}

foglalat.az io egy olyan könyvtár, amely egyetlen API-t biztosít az ügyfél és a szerver közötti WebSocket kommunikáció végrehajtásához. Támogatja a kecses tartalékot is, ha a WebSocket nem érhető el a böngészőben, valamint az üzenetküldési protokoll egyéb hasznos funkcióit, például a szívverést, az időtúllépést és a leválasztás támogatását, amelyet a HTML5 WebSocket API nem támogat.

az első snippetconfigurálja az olyan kérések engedélyezését, amelyek Socket.io kap. Amikor egy új kérés érkezik, akkor elemzi a cookie-kat a kérelemben, és megpróbálja letölteni a memcached kulcsot, amely megfelel a PHPSESSID cookie értékének (a PHP munkamenet cookie alapértelmezett neve). Ha megtalálható, tárolja a memcached kulcs elemzett értékét az adatokban.session, amely később elérhető.

a következő kódrészlet beállítja, hogy mi történjen, ha Socket.io elindítja a ‘kapcsolat’ eseményt. Ez az esemény az ügyféltől való kezdeti kapcsolat során aktiválódik, miután engedélyezte. A munkamenet adatokat, amelyeket korábban letölteni memcached most hivatkozni a socket.kézfogás változó. Amikor az ügyfél csatlakozik, a socket példány társítva van az ügyfél felhasználónevével, így üzeneteket lehet küldeni az egyes felhasználóknak.

az utolsó részlet tartalmaz egy funkciót, amely ellenőrzi az új híreket a redis sorban. A REDISBEN a BLPOP parancsot használja, ami azt jelenti, hogy ha a sor üres, akkor blokkolni fog, amíg néhány adat hozzá nem kerül a sorhoz, mielőtt felbukkanna. Ha néhány adat kiugrik a sorból, akkor JSON-ként értelmezik, mielőtt meghatároznák, hogy a tartalmat minden csatlakoztatott ügyfélnek vagy csak egyetlen felhasználónak kell-e elküldeni. A hírelem tartalmát a megfelelő aljzatba küldi a socket emit() metódusának meghívásával, amely korábban a felhasználóhoz volt társítva a csatlakozási eseménykezelőben.

végül a csomópont folyamata.a nextTick() metódust a getnews függvény argumentumként hívja meg. Ez azt jelenti, hogy a getnews függvény az eseményhurok következő futtatásakor lesz meghívva, és az alkalmazás leállításáig továbbra is ellenőrzi a redis várólistát.

a telepítéshez használja az npm-et a szükséges függőségek letöltéséhez. Ezután futtassa az alkalmazást a node alkalmazással.js.

most már megnyithat egy webböngészőt, és navigálhat a http://localhost:8080/?username=bob oldalra, és megtekintheti a hírcsatorna alkalmazást. Most nyisson meg egy második böngésző fület vagy ablakot egy másik felhasználónévvel, például http://localhost:8080/?username=sally.

A hírcsatorna frissítése

A hírcsatorna frissítése egyszerűen egy új hír elemnek a sorba helyezése. Csatlakozzon a redis CLI felülethez a redis-cli paranccsal. Ez egy interaktív héj a redis számára, amely lehetővé teszi parancsok közvetlen küldését a szerverre. Az alábbi kódminta megmutatja, hogyan kell a sorba lépni:

rpush news '{"content": "Testy test", "to": "bob"}'

A bob felhasználó számára megnyitott webböngészőablakban látnia kell, hogy a hírek lecsúsznak az oldal tetejéről. Alternatív megoldásként a híreket mind bob, sally, mind bármely más csatlakoztatott klienshez továbbíthatja a “to” paraméter kizárásával, az alábbiak szerint:

rpush news '{"content": "Everyone should see this"}'

egy valós alkalmazásban az adatokat a PHP-ből a sorba tolná, például a php-redis kiterjesztés vagy a predis használatával.

következtetés

Ez csak egy egyszerű példa annak bemutatására, hogy a Node hogyan integrálható a PHP alkalmazásba. Van néhány korlátozás a megvalósításban. Például csak egy kapcsolatot fog emlékezni minden felhasználótól. Ezért, ha egy felhasználónak több lapja vagy ablaka van nyitva a hírcsatornához, csak egy oldal frissül. Ezt úgy lehet megoldani, hogy felhasználónként egy sor aljzatot tárolunk, és nyomon követjük az egyes csatlakozásokat és leválasztásokat, hogy hozzáadjuk vagy eltávolítsuk az aljzatokat a tömbből. Az olvasónak jobb megoldást kell végrehajtania. Azt is megmutatta olyan eszközöket, mint a Composer és a Bower, amelyeket nagyon ajánlom, hogy fontolja meg az alkalmazásokban való használatát.

Lee Boynton egy Fejlesztő székhelye Hampshire, Egyesült Királyság, egy különösen érdekes a valós idejű alkalmazások, mint például az azonnali üzenetküldés és a tevékenység stream. Ismeri a szerver oldali fejlesztést és adminisztrációt, valamint a frontend fejlesztést. A Symbios Group helyi vállalatnál dolgozik, és tagja a PHP Hampshire-nek is, ahol rendezvényeket szervez.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.