denne artikel har til formål at vise dig, hvordan du kan begynde at bruge Node til at tilføje realtidsfunktioner til din PHP-baserede hjemmeside. Først skal vi se lidt mere på, hvad der gør Node en god pasform til real-time apps, før de går på at demonstrere, hvordan man opbygger en real-time nyhedsfeed og indarbejde det i din PHP hjemmeside.
trådbaseret vs begivenhedsbaseret
traditionelt serveres PHP med Apache og mod_php-modulet. Hvis du kører kommandoen ‘top’ på din unikke server, vil du sandsynligvis se et stort antal Apache-processer, der betjener internetklienter. I denne opsætning gyder hver klientanmodning typisk en ny Apache-proces, indtil al den tilgængelige RAM er opbrugt. For nylig, har ngink og php-fpm vist sig som den mest effektive metode til servering PHP hjemmesider, men selv i denne opsætning hver klient betjenes af en anden PHP proces. Det centrale punkt her er, at en klientanmodning fra start til slut bruger en PHP-proces i hele varigheden. Hvis det tager lang tid at behandle hver anmodning, kan serverens ressourcer bruges meget hurtigt.
i Node tjener en enkelt Node-proces typisk hver klient i en begivenhedssløjfe. Til langvarige, dyre processer som adgang til filsystemet, en database eller en ekstern API, anbefales det at bruge asynkrone metodeopkald i stedet for at blokere dem. Dette opnås ved brug af tilbagekald, der udløses, når en handling som at få adgang til filsystemet er afsluttet. Dette betyder, at en enkelt Knudeproces kan fortsætte med at behandle nye anmodninger, mens den dyre operation køres i baggrunden. Når den dyre operation er afsluttet, går den tilbage i begivenhedssløjfekøen, der skal behandles yderligere af Node.
i det væsentlige kan Node ses som et lignende miljø til opbygning af applikationer som Pythons snoet eller EventMachine i Ruby. Node har også en indbygget produktionsklar HTTP-server, så den ikke har brug for en separat server for at køre den, f.eks.
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 “hej verden” – server på blot et par kodelinjer. Den første linje demonstrerer brugen af modulsystemet kendt som CommonJS, som Node bruger til at inkludere separate moduler. Den kræver funktion er indbygget, og i dette tilfælde importerer Node s HTTP-modul til brug i programmet. Den anden linje opretter et nyt serverobjekt. Bemærk, at den første parameter til createServer-metoden er en anonym funktion. De fleste metoder i Node accepterer en tilbagekaldsfunktion som en parameter, og dette er nøglen til at opbygge hændelsesdrevne applikationer.
den næste udførelseslinje er linje 5, der bruger metodekædning til at kalde lyt-metoden på returværdien af createServer-metoden (den returnerede værdi er HTTP-modulforekomsten). Lyt-metoden får serveren til at begynde at acceptere HTTP-anmodninger på port 1337 på localhost. Den sidste linje skriver en besked til konsollen for at sige, at serveren er startet. Først når en anmodning til serveren er lavet, kaldes den anonyme funktion, som indstiller HTTP-statuskoden til 200 OK og indstiller indholdstypehovedet. Den ‘Hej Verden’ besked er endelig skrevet til HTTP svar krop på linje 4.
hvorfor skal jeg bruge Node.js så?
Nodes begivenhedsdrevne model er specielt velegnet til realtidsapplikationer såsom spil, nyhedsfeeds og chatapplikationer. Derudover giver det dig også mulighed for at bruge det samme sprog på frontend og backend. JavaScript bliver kun mere populært, da flere rige applikationer på klientsiden er bygget, og internetsøgere bliver hurtigere til at udføre JavaScript. At skulle skifte mellem sprog kan være frustrerende.
ordtryk Special
Alle runde ordtryk jeg vil tale med Vol. 10-ab 18.11.2016 im Handel.
Jeg vil gerne vide mere om et enkelt Blogsystem. I denne artikel vil jeg gerne fortælle dig, at du ikke er i stand til at gøre noget ved det, og du vil ikke være i stand til at gøre noget ved det klassiske tema, sondern auch um Affiliate Marketing, E-handel u.v.m.
for det andet har den god støtte til netbockets. Selvom det er muligt at understøtte Netbockets i PHP, gør Node ‘ s asynkrone natur og dens indbyggede HTTP-server det bedre egnet. Det er en måde, hvorpå man hurtigt kan sende data til klienten. Sammenlignet med tidligere løsninger såsom lang afstemning eller komet, Netbockets medfører meget lavere latenstid, da der ikke er nogen overhead for at instantiere en HTTP-forbindelse, hver gang nogle data skal sendes. Problemet er, at det er en HTML5 funktion, og som sådan er ikke så godt understøttet i Bro.Serere som almindelig gammel ajaks er. Imidlertid, det er muligt at yndefuldt falde tilbage til alternative teknikker såsom lang polling i Bro.sere, som ikke understøtter Netbockets.
på dette års internationale PHP-konference kan du lære mere om integrering af noder.JS med PHP!
den internationale PHP-konference er verdens første PHP-konference og har været et vartegn for førsteklasses pragmatisk ekspertise inden for PHP og internetteknologi i mere end et årti . På IPC mødes internationalt anerkendte eksperter fra PHP-branchen med PHP-brugere og udviklere fra store og små virksomheder. Tjek vores Early Bird priser for store rabatter!
Her er nogle highlight-sessioner fra IPC:
- gør din vinkel.js ansøgning tilgængelig
Dirk Ginader (Google) - TypeScript – gør JavaScript udvikling mere produktiv og Robust
Rainer Stropek (programmel arkitekter gmbh) - Sådan gør du klar til PHP 7
Sebastian Bergmann (thePHP.cc)
Husk dog, Node er en umoden platform sammenlignet med PHP. Oprindeligt oprettet i 2009, er den stadig i sin barndom og har endnu ikke nået version 1.0 – hvis det betyder noget for dig. Du kan opleve, at API ‘ er, du bruger forandring i fremtiden, eller ikke kan finde en ramme, der har samme funktionssæt som din foretrukne PHP-ramme. Ja, i min erfaring tredjeparts biblioteker og rammer til rådighed tendens til at bestå af meget mindre bundter af funktionalitet, som du har brug for at stykke sammen.
der er også en større risiko for, at hukommelseslækager stopper din applikation. Nodeprocesser kører typisk kontinuerligt, mens PHP-processer har tendens til at blive genoptaget med jævne mellemrum for at negere effekten af hukommelseslækager.
den integrerende del
nyhedsfeeden integreres med en grundlæggende PHP-hjemmeside, der håndterer brugerlogins og sessioner ved hjælp af en fælles opsætning af php-FPM og ngink. Vi bruger JavaScript til at kommunikere med en Node-applikation på serversiden og dynamisk opdatere nyhedsfeeden uden at genindlæse siden. Først dog, en hurtig til side på sessioner.
Hvis du ikke allerede gør det, skal du bruge et centraliseret lagerområde til dine sessioner (Figur 1). Memcached kan nemt bruges til denne opgave ved hjælp af den indbyggede session save handler i PECL memcached udvidelse. Hvis du vil have muligheden for at genstarte serveren, der gemmer dine sessioner uden at miste data, er Redis en god indsats. Uanset hvad, en centraliseret session storage giver dig mulighed for at indlæse balance din ansøgning på tværs af flere hjemmesider. Det giver dig også mulighed for at dele sessionsdata med applikationer bygget med andre programmeringssprog.
Figur 1: delt session arkitektur.
der er dog et lille problem med at analysere sessionsdata. Nedenfor viser standard serialiseringsformatet for en PHP-session:
not|a:2:{i:0;s:4:"easy";i:1;a:1:{s:2:"to";s:5:"parse";}}
det kan se ud som om du kan bruge strengmanipulation til at analysere det, men der kan være kantsager, der er vanskelige at løse. Det ville være rart, hvis sessionen blev serialiseret i det meget elskede JSON-format:
{"this":{"is": "easier", "to": "parse"}}
meget bedre. Det er ret nemt at skrive din egen session serialiser, som vil konvertere hvad du gemmer i $_SESSION til JSON format, Se min version.
Alternativt kan du overveje msgpack, som kan konfigureres til at serialisere sessioner, som i koden nedenfor, som også viser, hvordan du bruger memcached som session save handler.
Der er et tredjepartsbibliotek til rådighed for Node, der kan serialisere og deserialisere msgpack, tilgængelig i npm (Node Package Manager, indeholder et stort antal moduler, der kan bruges i din applikation med bare en simpel npm-installation ). Vi skal nu se på at opbygge nyhedsfeeden ved hjælp af Node og indarbejde dette i en PHP-applikation.
PHP App
PHP-applikationen håndterer simpelthen brugerlogins og sessioner. Sessioner gemmes i memcached, men kunne ganske let gemmes i redis. Koden nedenfor viser uddrag af den enkle one page-applikation (for den fulde kilde gå til github.com/lboynton/phphants-march-php).
// // <!]>
den første linje i scriptet inkluderer komponist autoloader-filen, hvilket betyder, at alle afhængigheder automatisk indlæses, hvilket undgår behovet for separate inkluderer eller kræver linjer (Redaktørens note: for mere om komponist, se Jefersson Nathan de O. Chaves ‘ artikel). I dette tilfælde er session save handleren det eneste stykke ekstern kode, der kræves. Det er dog meget nemt at inkludere tredjepartspakker, der er tilgængelige på packagist eller andre steder på et senere tidspunkt ved hjælp af Composer, som også automatisk tilføjes til autoloading. Linje 3 og 4 opretter forbindelse til memcached, mens session save handleren initialiseres og registreres hos PHP i linje 5-14. Brugere er logget ind ved blot at angive brugernavnet som en GET-parameter, men i et rigtigt system skal dette erstattes med et mere funktionelt godkendelsessystem.
på JavaScript-siden bruger vi nogle tredjepartsbiblioteker:.js og Socket.IO vi vil bruge til at skubbe data til bro.sereren. Io.connect method call opretter en forbindelse til Node-applikationen, som kan bruge en af en række transporter, f.eks. Socket.on method opretter en begivenhedshandler, der gengiver en nyhed på siden, når en ‘nyhed’ – begivenhed udløses af serversiden.
Bemærk: Programmet bruger Composer til installation af session save handler og bur, en pakkehåndtering til installation af klientsideaktiver. For at installere bur skal du køre ‘npm-g installer bur’. Derefter skal du installere aktiverne. Alternativt kan du opdatere script-tags og stilark med lokale versioner.
programmet serveres ved hjælp af nginks.
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 opstrømsserver, der kører Node-appen. Enhver anmodning slutter i .php vil blive sendt til php-fpm (linjer 15-20), mens eventuelle anmodninger med /socket.IO i URL ‘ en sendes til Node-appen (linjer 22-27). Linje 25 og 26 fortæller ngink at støtte protokolskift og gøre det muligt for netbockets at blive fuldmægtig til Node. Dette betyder, at PHP-appen og Node-appen begge køres på den samme port, for så vidt angår klienten.
Node.js App
noden.js app håndterer simpelthen alle klientanmodninger til nyhedsfeeden. Uddrag af det vises nedenfor (se github.com/lboynton/phphants-march-node for den fulde kilde).
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 er et bibliotek, der leverer en enkelt API til at udføre Netbocket kommunikation mellem klient og server. Det understøtter også yndefuld fallback, når netadresser ikke er tilgængelige i bro.ser, og andre nyttige funktioner i en messaging-protokol såsom hjerteslag, timeouts og frakobling støtte, som ikke understøttes ud af boksen med HTML5 netadresser API.
det første uddrag konfigurerer autorisation for anmodninger, der Socket.io modtager. Når en ny anmodning kommer ind, vil den analysere cookies i anmodningen og forsøge at hente en memcached nøgle, der svarer til værdien af PHPSESSID-cookien (standardnavnet for PHP-sessionscookien). Hvis den findes, gemmer den den parsede værdi af den memcached nøgle i data.session, som kan tilgås senere.
det næste uddrag konfigurerer, hvad der skal ske, når Socket.io udløser ‘forbindelse’ begivenhed. Denne begivenhed udløses under den første forbindelse fra klienten, når den er godkendt. De sessionsdata, der tidligere blev hentet fra memcached, kan nu henvises til via stikket.håndtryk variabel. Når klienten opretter forbindelse, er socket-forekomsten knyttet til klientens brugernavn, så meddelelser kan sendes til individuelle brugere.
det sidste uddrag indeholder en funktion til at kontrollere, om der er nye nyheder i en redis-kø. Det bruger kommandoen BLPOP i redis, hvilket betyder, at hvis køen er tom, vil den blokere, indtil nogle data er tilføjet til køen, før de springer den. Når nogle data kan poppes ud af køen, analyseres det som JSON, før det bestemmes, om indholdet skal sendes til hver tilsluttet klient eller bare en enkelt bruger. Nyhedsindholdet sendes til det korrekte stik ved at kalde emit () – metoden på stikket, der tidligere var forbundet med brugeren i forbindelseshændelseshandleren.
endelig nodens proces.metoden kaldes med funktionen getnyheder som et argument. Dette betyder, at funktionen Hent nyheder kaldes næste gang begivenhedssløjfen kører og fortsætter med at kontrollere redis-køen for data, indtil applikationen er stoppet.
Hvis du vil installere, skal du bruge npm til at hente de nødvendige afhængigheder. Kør derefter applikationen med node app.js.
Du skal nu kunne åbne en netsøgemaskine og navigere til http://localhost:8080/?username=bob og se nyhedsfeed-applikationen. Åbn nu en anden bro.ser-fane eller et vindue med et andet brugernavn, for eksempel http://localhost:8080/?username=sally.
opdatering af feedet
opdatering af feedet er simpelthen et tilfælde af at skubbe en ny nyhed ind i køen. Opret forbindelse til redis CLI-grænsefladen ved hjælp af kommandoen redis-cli. Dette er en interaktiv shell til redis, så du kan sende kommandoer til serveren direkte. Kodeeksemplet nedenfor viser, hvordan du skubber til køen:
rpush news '{"content": "Testy test", "to": "bob"}'
i det netsøgervindue, du åbnede for bruger bob, skal du se nyhedsemnet glide ned fra toppen af siden. Alternativt kan du skubbe nyheder ud til både bob, sally og andrealle tilsluttede klienter ved at ekskludere parameteren “til” som følger:
rpush news '{"content": "Everyone should see this"}'
i et rigtigt program vil du skubbe data ind i køen fra PHP ved hjælp af f.eks.
konklusion
Dette er bare et simpelt eksempel for at demonstrere, hvordan Node kan integreres med din PHP-applikation. Der er nogle begrænsninger i implementeringen. For eksempel vil den kun huske en forbindelse fra hver bruger. Derfor, hvis en bruger har flere faner eller vinduer åbne for nyhedsfeeden, opdateres kun en side. Dette kan løses ved at gemme en række stikkontakter pr.bruger og holde styr på hver forbindelse og afbrydelse for at tilføje eller fjerne stikkene fra arrayet. Det overlades til læseren at implementere en bedre løsning. Det viste også værktøjer som komponist og bur, som jeg stærkt anbefaler, at du overvejer at bruge i dine applikationer.Lee Boynton er en udvikler baseret i Hampshire, UK, med en særlig interesse i real-time applikationer såsom instant messaging og aktivitetsstrømme. Han har kendskab til server side udvikling og administration samt frontend udvikling. Han arbejder hos det lokale firma Symbios Group og er også medlem af PHP Hampshire for hvem han hjælper med at organisere begivenheder.