Det kan være på vogue ,men er det en praktisk grunn til å vedta Node.js? Lee Boynton viser hvordan det kan brukes til å legge til en sanntids nyhetsfeed TIL PHP-siden din.

denne artikkelen tar sikte på å vise deg hvordan Du kan begynne å bruke Node for å legge til sanntidsfunksjoner PÅ DITT PHP-baserte nettsted. Først skal vi se litt mer på hva Som gjør Node til en god passform for real-time apps, før du fortsetter å demonstrere hvordan du bygger en sanntids nyhetsfeed og innlemme den i PHP-nettstedet ditt.

Trådbasert vs Hendelsesbasert

TRADISJONELT SERVERES PHP Med Apache og mod_php-modulen. Hvis du kjører kommandoen ‘topp’ på Din Unix-baserte webserver, vil du sannsynligvis se Et stort antall Apache-prosesser som serverer webklienter. I dette oppsettet gir hver klientforespørsel vanligvis En Ny Apache-prosess til alt tilgjengelig RAM er brukt opp. Nylig har nginx og php-fpm dukket opp som den mest effektive metoden for Å betjene PHP-nettsteder, men selv i dette oppsettet serveres hver klient av en annen PHP-prosess. Hovedpoenget her er at fra start til slutt bruker en klientforespørsel EN PHP-prosess for hele varigheten. Hvis det tar lang tid å behandle hver forespørsel, kan serverens ressurser brukes opp veldig raskt.

i Node tjener en Enkelt Nodeprosess vanligvis hver klient i en hendelsesløkke. For langvarige, dyre prosesser som å få tilgang til filsystemet, en database eller en ekstern API, anbefales det å bruke asynkrone metodekall i stedet for å blokkere dem. Dette oppnås ved bruk av tilbakeringinger som utløses når en handling som å få tilgang til filsystemet er ferdig. Dette betyr at en Enkelt Knuteprosess kan fortsette å behandle nye forespørsler mens den dyre operasjonen kjøres i bakgrunnen. Når den dyre operasjonen er fullført, går den tilbake til hendelsessløyfekøen som skal behandles videre Av Node.I hovedsak Kan Node ses som et lignende miljø for å bygge applikasjoner som Python ‘ S Twisted eller EventMachine I Ruby. Node har også en innebygd PRODUKSJONSKLAR HTTP-server, slik at den ikke trenger en egen server for å kjøre Den som Apache eller Nginx, noe som ytterligere forbedrer sine magre ressursbehov (sperring av minnelekkasjer).

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

kodeeksemplet ovenfor viser hvordan du kan skrive en obligatorisk» hello world » webserver i bare noen få linjer med kode. Den første linjen viser bruk av modulsystemet Kjent Som CommonJS Som Node bruker til å inkludere separate moduler. Require-funksjonen er innebygd, og i dette tilfellet importerer Nodens HTTP-modul for bruk i applikasjonen. Den andre linjen oppretter et nytt webserverobjekt. Legg merke til at den første parameteren til createServer-metoden er en anonym funksjon. De fleste Metoder i Node godtar en tilbakeringingsfunksjon som parameter, og dette er nøkkelen til å bygge hendelsesdrevne applikasjoner.

den neste utførelseslinjen er linje 5, som bruker metodekobling til å kalle lyttemetoden på returverdien til createServer-metoden(VERDIEN som returneres ER HTTP-modulforekomsten). Lytt-metoden får serveren til å begynne å godta HTTP-forespørsler på port 1337 på localhost. Den siste linjen skriver en melding til konsollen for å si at serveren har startet. Bare når en forespørsel til serveren er gjort, kalles den anonyme funksjonen, som setter HTTP-statuskoden til 200 OK og angir Innholdstypehodet. Hello World-meldingen er endelig skrevet TIL HTTP-responsorgan på linje 4.

Hvorfor Skal Jeg Bruke Node.js Da?

Nodes hendelsesdrevne modell er spesielt egnet til sanntidsapplikasjoner som spill, nyhetsfeeder og chatprogrammer. I tillegg kan du også bruke det samme språket på frontend og backend. JavaScript blir bare mer populært ettersom flere rike klientapplikasjoner er bygget og nettlesere blir raskere ved å utføre JavaScript. Å måtte bytte mellom språk kan være frustrerende.

WordPress Spezial

Entwickler Magazin Spezial Vol. 10: WordPressEntwickler Magazin Spezial Vol. 10: WordPress
Alle innlegg om WordPress og Spezial Vol. 10-ab 18.11.2016 im Handel.
wordpress er en av de mest brukte wordpress-Bloggene. I tillegg Er det Ingen tvil Om At noen Av de Mest Populære CMS-ENE er Web; og de har ikke noe å gjøre med Affiliate Markedsføring, E-Handel u.v.m.

div >

For Det Andre har den god støtte for websockets. Mens Det er mulig å støtte WebSockets I PHP, Nodes asynkron natur og dens innebygde HTTP-server gjør det en bedre passform. WebSockets er en måte å opprettholde en vedvarende tilkobling til nettleseren for å presse data til klienten raskt. Sammenlignet med tidligere løsninger som long polling eller comet, Innebærer WebSockets mye lavere ventetid, da Det ikke er noe overhead for å starte EN HTTP-tilkobling hver gang noen data må sendes. Ulempen Til WebSockets er at Det er EN HTML5-funksjon, og som sådan er ikke så godt støttet i nettlesere som vanlig gammel Ajax er. Det er imidlertid mulig å grasiøst falle tilbake til alternative teknikker som lang avstemning i nettlesere som ikke støtter WebSockets.

på årets INTERNASJONALE PHP-Konferanse kan du lære mer om integrering Av Noder.js med PHP!

Den Internasjonale PHP-Konferansen er verdens første PHP-konferanse og har vært et landemerke for topp pragmatisk kompetanse innen PHP og webteknologi i mer enn et tiår . PÅ IPC møter internasjonalt anerkjente eksperter FRA PHP-bransjen PHP-brukere og utviklere fra store og små bedrifter. Sjekk Ut Våre Early Bird Priser for gode rabatter!

Her er noen høydepunkt-økter FRA IPC:

  • Gjør Din Vinkel.Js Søknad tilgjengelig
    Dirk Ginader (Google)
  • TypeScript – Gjør JavaScript Utvikling Mer Produktiv og Robust
    Rainer Stropek (software architects gmbh)
  • HVORDAN bli klar FOR PHP 7
    Sebastian Bergmann (thePHP.cc)

Husk Skjønt, Node er en umoden plattform i forhold TIL PHP. Opprinnelig opprettet i 2009, er det fortsatt i sin barndom og har ikke nådd versjon 1.0 ennå – hvis det betyr noe for deg. Du kan finne At Apier du bruker endring i fremtiden, eller være ute av stand til å finne et rammeverk som har samme funksjonssett som din FAVORITT PHP rammeverk. Faktisk, etter min erfaring, har tredjepartsbiblioteker og rammer som er tilgjengelige, en tendens til å bestå av mye mindre bunter av funksjonalitet som du trenger å sette sammen.

det er også en større risiko for minnelekkasjer bringe programmet til en sliping stans. Node prosesser kjører vanligvis kontinuerlig, MENS PHP prosesser pleier å bli respawned periodisk for å negere effekten av minnelekkasjer.

Den Integrerte Delen

nyhetsfeeden vil bli integrert med et grunnleggende PHP-nettsted som håndterer brukerinnlogging og økter, ved hjelp av et felles oppsett av php-fpm og nginx. Vi skal bruke JavaScript for å kommunisere med En Node program på serversiden og dynamisk oppdatere nyhetsfeed uten å laste siden. Først skjønt, en rask side på økter.

hvis du ikke allerede gjør det, bør du bruke et sentralisert lagringsområde for øktene dine (Figur 1). Memcached kan enkelt brukes til denne oppgaven ved å bruke den innebygde økten lagre handler I PECL memcached forlengelse. Hvis Du vil ha muligheten til å starte serveren på nytt og lagre øktene dine uten å miste data, Er Redis en god innsats. Uansett, en sentralisert økt lagring kan du laste balansere programmet på tvers av flere webservere. Det gjør det også mulig å dele øktdata med programmer bygget med andre programmeringsspråk.

Figur 1: Delt øktarkitektur.

det er imidlertid et lite problem med å analysere øktdata. Nedenfor viser standard serialiseringsformatet FOR EN PHP-økt:

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

Det kan se ut som om du kan bruke strengmanipulering til å analysere det, men det kan være kantsaker som er vanskelige å løse. Det ville være fint om økten ble serialisert i det kjære json-formatet:

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

Mye bedre. Det er ganske enkelt å skrive din egen session serialiser som vil konvertere hva du lagrer i $_SESSION TIL JSON format, se min versjon.

Alternativt kan du vurdere msgpack som kan konfigureres til å serialisere økter, som i koden nedenfor, som også viser hvordan du bruker memcached som session save handler.


Det er et tredjepartsbibliotek tilgjengelig For Node som kan serialisere og deserialisere msgpack, tilgjengelig i npm (Node Package Manager, inneholder et stort antall moduler som kan brukes i søknaden din med bare en enkel npm-installasjon ). Vi skal nå se på å bygge nyhetsfeeden ved Hjelp Av Node og inkorporere dette i ET PHP-program.

PHP App

PHP-programmet håndterer bare brukerinnlogging og økter. Økter lagres i memcached, men kan ganske enkelt lagres i redis. Koden nedenfor viser utdrag av simple one page-programmet (for hele kilden gå til github.com/lboynton/phphants-march-php).

// // <!]>

den første linjen i skriptet inkluderer Komponistens autolaster-fil, noe som betyr at alle avhengigheter automatisk lastes inn, og unngår behovet for separate inkluder eller krev linjer (Redaktørens notat: for mer Om Komponist, se Jefersson Nathan De O. Chaves ‘ artikkel). I dette tilfellet er session save handler den eneste delen av ekstern kode som kreves. Det er imidlertid veldig enkelt å inkludere tredjepartspakker som er tilgjengelige på packagist eller andre steder på et senere tidspunkt ved å bruke Komponist som også automatisk legges til autoloading. Linjer 3 og 4 sette opp en tilkobling til memcached, mens økten lagre handler er initialisert og registrert MED PHP i linjene 5-14. Brukere er logget inn ved å angi brukernavnet SOM EN get-parameter, men i et ekte system bør dette erstattes med et mer funksjonelt autentiseringssystem.

På JavaScript-siden bruker vi noen tredjepartsbiblioteker: jQuery, understrek.js og Socket.IO klient, som er nettleserdelen av Nodemodulen vi skal bruke til å skyve data til nettleseren. Io.connect method call oppretter en tilkobling Til Node-programmet, som kan bruke en av en rekke transporter som websockets Eller Ajax, avhengig av nettleserstøtte. Socket.on method setter opp en hendelsesbehandler som vil gjengi et nyhetselement på siden når en nyhetshendelse utløses av serversiden.

Merk: Programmet bruker Komponist for å installere økten lagre handler og Bower, en pakkebehandling for å installere klientsiden eiendeler. For å installere Bower, kjør ‘npm-g install bower’. Deretter installerer du eiendelene ,gjør ‘bower install’. Alternativt kan du oppdatere skriptkodene og stilarkene med lokale versjoner.

søknaden serveres ved hjelp av nginx. Her er nginx-konfigurasjonsfilen:

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

Linjer 1-3 definerer en oppstrøms server som kjører Node-appen. Enhver forespørsel slutter på .php vil bli sendt til php-fpm (linjer 15-20), mens eventuelle forespørsler med /socket.io I NETTADRESSEN vil bli sendt til Noden app (linjer 22-27). Linjer 25 og 26 forteller nginx å støtte protokollveksling og aktivere websockets å bli proxied Til Node. DETTE betyr at PHP app og Node app er begge kjøres på samme port, så langt som klienten er bekymret.

Node.js App

Noden.js app håndterer bare eventuelle klientforespørsler om nyhetsfeeden. Utdrag av det vises nedenfor (se github.com/lboynton/phphants-march-node for hele kilden).

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

Stikkontakt.io er et bibliotek som leverer en ENKELT API for å utføre WebSocket kommunikasjon mellom klient og server. Den støtter også grasiøs fallback når WebSockets ikke er tilgjengelig i nettleseren, og andre nyttige funksjoner i en meldingsprotokoll som hjerteslag, tidsavbrudd og frakobling støtte som ikke støttes ut av boksen MED HTML5 WebSocket API.

den første kodekonfigurerer autorisasjon for forespørsler som Socket.io mottar. Når en ny forespørsel kommer inn, vil den analysere informasjonskapslene i forespørselen og forsøke å hente en memcached-nøkkel som tilsvarer verdien AV phpsessid-informasjonskapselen (standardnavnet for PHP-økt-informasjonskapselen). Hvis funnet, vil det lagre analyseres verdien av memcached nøkkelen i data.sesjon som kan nås senere.

den neste kodebiten konfigurerer hva som skal skje når Socket.io utløser ’tilkobling’ – hendelsen. Denne hendelsen utløses under den første tilkoblingen fra klienten, når den er autorisert. Øktdataene som tidligere ble hentet fra memcached, kan nå refereres via kontakten.håndtrykk variabel. Når klienten kobler seg til, er socket-forekomsten knyttet til klientens brukernavn, slik at meldinger kan sendes til individuelle brukere.

den siste tekstutdrag inneholder en funksjon for å se etter nye nyheter i en redis kø. Den bruker blpop-kommandoen i redis, noe som betyr at hvis køen er tom, vil den blokkere til noen data legges til køen før du spretter den. Når noen data kan poppet av køen, det analyseres SOM JSON før avgjøre om innholdet skal sendes til hver tilkoblet klient eller bare en enkelt bruker. Nyhetsinnholdet sendes til riktig kontakt ved å ringe emit () – metoden på kontakten som var knyttet til brukeren tidligere i tilkoblingshendelsesbehandleren.

Endelig Nodes prosess.nextTick () – metoden kalles med getnews-funksjonen som et argument. Dette betyr at getnews-funksjonen vil bli kalt neste gang hendelsessløyfen kjører, og vil fortsette å sjekke redis-køen for data til programmet er stoppet.

for å installere, bruk npm til å laste ned de nødvendige avhengighetene. Kjør deretter programmet med node app.js.

Du skal nå kunne åpne en nettleser og navigere til http://localhost:8080/?username=bob og se news feed-programmet. Åpne nå en annen nettleserfane eller-vindu med et annet brukernavn, for eksempel http://localhost:8080/?username=sally.

Oppdatering Av Feeden

Oppdatering av feeden er bare et tilfelle av å skyve en ny nyhet inn i køen. Koble til redis cli-grensesnittet ved hjelp av kommandoen redis-cli. Dette er et interaktivt skall for redis, slik at du kan sende kommandoer til serveren direkte. Kodeeksemplet nedenfor viser hvordan du skyver til køen:

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

i nettleservinduet du åpnet for bruker bob, bør du se nyhetselementet skyve ned fra toppen av siden. Alternativt kan du skyve nyheter ut til både bob, sally og andre alle tilkoblede klienter ved å ekskludere «til» – parameteren, som følger:

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

I et ekte program vil du skyve data inn i køen FRA PHP, for eksempel ved hjelp av php-redis-utvidelsen eller predis.

Konklusjon

Dette er bare et enkelt eksempel for å demonstrere hvordan Node kan integreres med PHP-programmet. Det er noen begrensninger i implementeringen. For eksempel vil det bare huske en tilkobling fra hver bruker. Derfor, hvis en bruker har flere faner eller vinduer åpne for nyhetsfeeden, vil bare en side oppdateres. Dette kan løses ved å lagre en rekke stikkontakter per bruker, og holde styr på hver tilkobling og frakobling for å legge til eller fjerne kontaktene fra matrisen. Det er overlatt til leseren å implementere en bedre løsning. Det viste også frem verktøy som Komponist og Bower som jeg anbefaler at du vurderer å bruke i programmene dine.Lee Boynton Er en utvikler basert I Hampshire, STORBRITANNIA, med en spesiell interesse i sanntidsapplikasjoner som direktemeldinger og aktivitetsstrømmer. Han har kunnskap om server side utvikling og administrasjon samt frontend utvikling. Han jobber på lokale selskapet Symbios Group og er også medlem AV PHP Hampshire for hvem han hjelper organisere arrangementer.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.