může být v módě, ale existuje praktický důvod k přijetí uzlu.js? Lee Boynton ukazuje, jak jej lze použít k přidání zpravodajského kanálu v reálném čase na váš web PHP.

tento článek si klade za cíl ukázat vám, jak můžete začít používat uzel k přidání funkcí v reálném čase na web založený na PHP. Za prvé, podíváme se trochu více na to, co dělá Node dobrou volbou pro aplikace v reálném čase, než ukážeme, jak vytvořit informační kanál v reálném čase a začlenit jej do vašeho webu PHP.

Thread-based vs Event-based

tradičně se PHP podává s apache a mod_php modulem. Pokud spustíte příkaz “ top “ na vašem Unixovém webovém serveru, pravděpodobně uvidíte velké množství procesů Apache obsluhujících webové klienty. V tomto nastavení každý požadavek klienta obvykle vytvoří nový proces Apache, dokud nebude vyčerpána veškerá dostupná paměť RAM. V poslední době se nginx a php-fpm ukázaly jako nejúčinnější způsob obsluhy webových stránek PHP, ale i v tomto nastavení je každý klient obsluhován jiným procesem PHP. Klíčovým bodem je, že, od začátku do konce, požadavek klienta používá proces PHP po celou dobu trvání. Pokud zpracování každého požadavku trvá dlouhou dobu, lze zdroje serveru spotřebovat velmi rychle.

v uzlu proces jednoho uzlu obvykle slouží každému klientovi ve smyčce událostí. Pro dlouhodobé, drahé procesy, jako je přístup k souborovému systému, databázi nebo vzdálenému API, se doporučuje používat asynchronní volání metod namísto blokování. Toho je dosaženo použitím zpětných volání, která jsou spuštěna po dokončení akce, jako je přístup k systému souborů. To znamená, že proces jednoho uzlu může pokračovat ve zpracování nových požadavků, zatímco nákladná operace je spuštěna na pozadí. Když je nákladná operace dokončena, vrátí se zpět do fronty smyčky událostí, která má být dále zpracována uzlem.

v podstatě lze uzel považovat za podobné prostředí pro vytváření aplikací, jako je Python Twisted nebo EventMachine v Ruby. Node má také vestavěný HTTP server připravený na výrobu, takže k jeho spuštění nepotřebuje samostatný server, jako je Apache nebo Nginx, což dále zvyšuje jeho požadavky na štíhlé zdroje(brání únikům paměti).

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/');

výše uvedený příklad kódu ukazuje, jak můžete napsat povinný webový server „hello world“ v několika řádcích kódu. První řádek ukazuje použití modulového systému známého jako CommonJS, který uzel používá k zahrnutí samostatných modulů. Funkce require je vestavěná a v tomto případě importuje modul HTTP uzlu pro použití v aplikaci. Druhý řádek vytvoří nový objekt webového serveru. Všimněte si, že prvním parametrem metody createServer je anonymní funkce. Většina metod v uzlu přijímá funkci zpětného volání jako parametr, a to je klíč k vytváření aplikací řízených událostmi.

další řádek provedení je řádek 5, který používá metodu chaining k volání metody listen na návratovou hodnotu metody createServer (vrácená hodnota je instance modulu HTTP). Metoda listen způsobí, že server začne přijímat požadavky HTTP na portu 1337 na localhost. Poslední řádek zapíše do konzoly zprávu, že server byl spuštěn. Pouze při požadavku na server je vyvolána funkce anonymous, která nastaví stavový kód HTTP na 200 OK a nastaví hlavičku typu Content. Zpráva „Hello World“ je nakonec zapsána do těla odpovědi HTTP na lince 4.

proč bych měl používat uzel.tak js?

model řízený událostmi uzlu je zvláště vhodný pro aplikace v reálném čase, jako jsou hry, zpravodajské kanály a chatovací aplikace. Kromě toho vám také umožňuje používat stejný jazyk na frontendu a backendu. JavaScript je stále populárnější, protože jsou vytvářeny bohatší aplikace na straně klienta a webové prohlížeče se zrychlují při provádění JavaScriptu. Nutnost přepínat mezi jazyky může být frustrující.

WordPress Spezial

Entwickler Magazin Spezial Obj. 10: WordPressEntwickler Magazin Spezial Vol. 10: WordPress
Alles rund um WordPress im Entwickler Spezial Vol. 10-z 18.11.2016 im Händel.
WordPress ist längst weit mehr als ein simples Blogsystem. In diesem Sonderheft sich beschäftigen zahlreiche Spezialisten mit allen wichtigen Fragen rund um das verbreitetste CMS im Web, und dabei geht es nicht nur um klassische vyloučit všechny silné, sondern auch um Affiliate Marketing, E-Commerce u.v.m.

za Druhé, má dobrou podporu WebSockets. I když je možné podporovat WebSockets v PHP, asynchronní povaha uzlu a jeho vestavěný HTTP server z něj činí lepší fit. WebSockets jsou způsob, jak udržovat trvalé připojení k prohlížeči, aby bylo možné rychle zasunout data klientovi. Ve srovnání s předchozími řešeními jako long polling nebo kometa, WebSockets za následek mnohem nižší latenci, jak tam je žádná režie konkretizaci připojení HTTP, pokaždé, když některá data musí být odeslána. Nevýhodou WebSockets je, že se jedná o funkci HTML5, a jako takový není tak dobře podporován v prohlížečích jako obyčejný starý Ajax. Je však možné elegantně ustoupit od alternativních technik, jako je dlouhé dotazování v prohlížečích, které nepodporují WebSockets.

na letošní mezinárodní konferenci PHP se můžete dozvědět více o integraci uzlů.js s PHP!

Mezinárodní konference PHP je první konference PHP na světě a je mezníkem pro špičkové pragmatické odborné znalosti v oblasti PHP a webových technologií již více než deset let . Na IPC se setkávají mezinárodně uznávaní odborníci z odvětví PHP s uživateli a vývojáři PHP z velkých i malých společností. Podívejte se na naše ceny Early Bird pro skvělé slevy!

zde jsou některé highlight-sessions z IPC:

  • vytváření Úhlové.js Aplikace přístupné
    Dirk Ginader (Google)
  • Strojopis – Tvorba JavaScript Vývoj Více Produktivní a Robustní
    Rainer Stropek (software architects gmbh)
  • Jak se připravit na PHP 7
    Sebastian Bergmann (thePHP.cc)

mějte na paměti, i když, Uzel je nezralý platforma, ve srovnání s PHP. Původně vytvořený v roce 2009, je stále v plenkách a dosud nedosáhl verze 1.0-pokud vám na tom záleží. Možná zjistíte, že API, které používáte, se v budoucnu změní, nebo nebudete moci najít rámec, který má stejnou sadu funkcí jako váš oblíbený rámec PHP. Podle mých zkušeností mají knihovny a rámce třetích stran tendenci sestávat z mnohem menších svazků funkcí,které musíte dát dohromady.

existuje také větší riziko úniku paměti, které zastaví vaši aplikaci. Procesy uzlů obvykle běží nepřetržitě, zatímco procesy PHP mají tendenci být periodicky respawnovány, aby se vyloučil účinek úniků paměti.

integrační část

informační kanál bude integrován se základním webem PHP, který zpracovává přihlašovací údaje uživatelů a relace pomocí společného nastavení php-fpm a nginx. Budeme používat JavaScript pro komunikaci s aplikací uzlu na straně serveru a dynamicky aktualizovat zdroj zpráv bez opětovného načtení stránky. Nejprve však, rychlé stranou na zasedáních.

Pokud tak ještě neučiníte, měli byste pro své relace používat centralizovaný úložný prostor (Obrázek 1). Memcached lze snadno použít pro tento úkol pomocí vestavěné relace uložit handler v PECL memcached rozšíření. Pokud chcete mít možnost restartovat server, který ukládá vaše relace bez ztráty dat, pak je Redis dobrá sázka. Ať tak či onak, centralizované úložiště relací vám umožní načíst rovnováhu aplikace mezi více webovými servery. Umožňuje také sdílet data relace s aplikacemi vytvořenými s jinými programovacími jazyky.

Obrázek 1: Architektura sdílené relace.

existuje však malý problém s analýzou dat relace. Níže ukazuje výchozí sériové podobě PHP session:

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

To může vypadat, můžete použít řetězec manipulace analyzovat to, ale mohlo by být okraj případech, které jsou složité k řešení. Bylo by hezké, kdyby zasedání bylo serializovány v mnohem-miloval formátu JSON:

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

Mnohem lepší. Je to docela snadné napsat svůj vlastní session serialiser, který převede vše, co uložíte ve formátu $_SESSION do formátu JSON, viz moje verze.

Případně můžete zvážit msgpack, který lze nakonfigurovat pro serializaci relací, jako v níže uvedeném kódu, který také ukazuje, jak používat Memcached jako obslužnou rutinu pro uložení relace.


knihovny třetích stran jsou k dispozici pro Uzel, který může serialise a deserialise msgpack, k dispozici v npm (Node Package Manager, obsahuje velké množství modulů, které mohou být použity v aplikaci s jen jednoduchý npm nainstalovat ). Nyní se podíváme na budování news feed pomocí uzlu a začlenění do PHP aplikace.

PHP App

PHP aplikace jednoduše zpracovává uživatelské přihlášení a relace. Relace jsou uloženy v memcached, ale mohly by být docela snadno uloženy v redis. Kód níže ukazuje, úryvky z jednoduché jednu stránku aplikace (pro všechny zdroje jít do github.com/lboynton/phphants-march-php).

// // <!]>

první řádek skriptu obsahuje Composer autoloader souboru, což znamená, že všechny závislosti jsou autoloaded automaticky, upřednostňuje oddělené zahrnují nebo vyžadují linky (poznámka Redakce: více o Skladatele, viz Jefersson Nathan de O. Chavesův článek). V tomto případě je obslužná rutina pro uložení relace jediným požadovaným kusem externího kódu. Je však velmi snadné zahrnout jakékoli balíčky třetích stran dostupné na packagist nebo jinde později pomocí Composeru, který bude také automaticky přidán k autoloadingu. Řádky 3 a 4 nastavují připojení k memcached, zatímco obslužná rutina pro uložení relace je inicializována a zaregistrována v PHP v řádcích 5-14. Uživatelé jsou přihlášeni jednoduše zadáním uživatelského jména jako parametru GET, i když v reálném systému by to mělo být nahrazeno funkčnějším ověřovacím systémem.

na straně JavaScriptu používáme některé knihovny třetích stran: jQuery, podtržítko.js a Socket.IO klient, který je součástí modulu uzlu prohlížeče, který budeme používat k posunutí dat do prohlížeče. Io.volání metody connect vytvoří připojení k aplikaci Node, která by mohla v závislosti na podpoře prohlížeče používat jeden z mnoha transportů, jako jsou websockets nebo Ajax. Zásuvka.na metoda nastaví obslužnou rutinu události, který bude poskytovat zprávy položku na stránce vždy, když se „news“ akce je spuštěna na straně serveru.

Poznámka: Aplikace používá Composer Pro instalaci session save handler a Bower, správce balíčků pro instalaci aktiv na straně klienta. Chcete-li nainstalovat Bower, spusťte ‚npm-g install bower‘. Poté nainstalujte aktiva ,proveďte „bower install“. Případně aktualizujte značky skriptů a styly s místními verzemi.

aplikace se podává pomocí nginx. Zde je konfigurační soubor nginx:

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"; }}

řádky 1-3 definují upstream server, který spouští aplikaci Node. Každá žádost končí .php bude odeslán do php-fpm (řádky 15-20), zatímco všechny požadavky s / socket.io v URL bude předán aplikaci uzlu (řádky 22-27). Řádky 25 a 26 říkají nginx, aby podporovaly přepínání protokolů a umožnily proxy websockets k uzlu. To znamená, že aplikace PHP a aplikace Node jsou spuštěny na stejném portu, pokud jde o klienta.

uzel.js App

uzel.aplikace js jednoduše zpracovává všechny požadavky klientů na zpravodajský kanál. Úryvky z ní jsou zobrazeny níže (viz github.com/lboynton/phphants-march-node pro úplný zdroj).

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); });}

Socket.io je knihovna, která dodává jediné API pro provádění WebSocket komunikace mezi klientem a serverem. To také podporuje elegantní fallback, když WebSockets nejsou k dispozici v prohlížeči, a další užitečné funkce v messaging protokol, jako jsou srdeční tep, časové limity a odpojení podporu, která není podporována z krabice s HTML5 WebSocket API.

první snippetconfigurations autorization for requests that Socket.io přijímá. Když přijde nový požadavek, analyzuje soubory cookie v požadavku a pokusí se načíst klíč memcached, který odpovídá hodnotě souboru cookie PHPSESSID (výchozí název souboru cookie relace PHP). Pokud je nalezen, uloží analyzovanou hodnotu klíče memcached do dat.relace, která je přístupná později.

následující úryvek konfiguruje, co se má stát, když Socket.io spustí událost „připojení“. Tato událost se spustí během počátečního připojení od klienta, jakmile je autorizován. Na data relace, která byla dříve načtena z memcached, lze nyní odkazovat prostřednictvím soketu.podání ruky. Když se klient připojí, instance soketu je spojena s uživatelským jménem klienta, takže zprávy mohou být odesílány jednotlivým uživatelům.

Poslední úryvek obsahuje funkci pro kontrolu nových novinek ve frontě redis. Používá BLPOP příkaz v redis, což znamená, že pokud je fronta prázdná, to bude blokovat, dokud některá data je přidán do fronty před praskání. Když některá data mohou být vyskočil z fronty, je analyzován jako JSON před určením, zda obsah by měl být odeslán do každého připojeného klienta nebo jen jeden uživatel. Obsah novinek je odeslán do správného soketu voláním metody emit () na soketu, který byl dříve přidružen k uživateli v obslužné rutině událostí připojení.

konečně proces uzlu.metoda nextTick () je volána s funkcí getNews jako argument. To znamená, že funkce getNews bude volána při příštím spuštění smyčky událostí a bude pokračovat v kontrole fronty redis pro data, dokud nebude aplikace zastavena.

Chcete-li nainstalovat, použijte npm ke stažení požadovaných závislostí. Poté spusťte aplikaci s aplikací node.js.

nyní byste měli mít možnost otevřít webový prohlížeč a přejděte na http://localhost:8080/?username=bob a podívejte se na aplikaci news feed. Nyní otevřete druhou kartu prohlížeče nebo okno s jiným uživatelským jménem, například http://localhost:8080/?username=sally.

aktualizace zdroje

aktualizace zdroje je jednoduše případ zatlačení nové zprávy do fronty. Připojte se k rozhraní redis CLI pomocí příkazu redis-cli. Jedná se o interaktivní shell pro redis, který umožňuje odesílat příkazy přímo na server. Ukázkový kód níže ukazuje, jak se tlačit do fronty:

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

V okně webového prohlížeče jste otevřeli pro uživatele bob, měli byste vidět zpráva posunutím dolů z horní části stránky. Alternativně, můžete posílat zprávy z obou bob, sally a žádné otherall připojených klientů tím, že s výjimkou „k“ parametr, a to následovně:

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

V reálné aplikaci byste tlačit data do fronty z PHP pomocí například php-redis extension nebo predis.

závěr

Toto je jen jednoduchý příklad, který ukazuje, jak lze Node integrovat s vaší PHP aplikací. V implementaci existuje několik omezení. Například si bude pamatovat pouze jedno připojení od každého uživatele. Pokud má tedy uživatel více karet nebo oken otevřených pro informační kanál, aktualizuje se pouze jedna stránka. To lze vyřešit uložením pole soketů na uživatele a sledováním každého připojení a odpojení pro přidání nebo odebrání soketů z pole. Je ponecháno na čtenáři, aby implementoval lepší řešení. Také předváděl nástroje jako Composer a Bower, které vřele doporučuji zvážit použití ve vašich aplikacích.

Lee Boynton je vývojář se sídlem v Hampshire ve Velké Británii, se zvláštním zájmem o aplikace v reálném čase, jako jsou rychlé zasílání zpráv a toky aktivit. Má znalosti o vývoji a správě na straně serveru i o vývoji frontendů. Pracuje v místní společnosti Symbios Group a je také členem PHP Hampshire, kterému pomáhá organizovat akce.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.