tämän artikkelin tarkoituksena on näyttää, miten voit alkaa käyttää solmua lisätäksesi reaaliaikaisia ominaisuuksia PHP-pohjaiseen verkkosivustoosi. Ensimmäinen, tarkastelemme hieman enemmän, mikä tekee solmu hyvä sovi reaaliaikaisia sovelluksia, ennen kuin menee osoittaa, miten rakentaa reaaliaikainen uutissyötteen ja sisällyttää sen PHP verkkosivuilla.
Säiepohjainen vs tapahtumapohjainen
perinteisesti PHP: tä tarjoillaan Apachen ja mod_php-moduulin kanssa. Jos suoritat ” top ” – komennon Unix-pohjaisella web-palvelimella, näet todennäköisesti suuren määrän Apache-prosesseja, jotka palvelevat web-asiakkaita. Tässä setup, jokainen asiakkaan pyyntö tyypillisesti poikii uuden Apache prosessi, kunnes kaikki käytettävissä RAM on käytetty loppuun. Viime aikoina nginx ja php-fpm ovat nousseet tehokkaimmaksi tavaksi palvella PHP-sivustoja, mutta jopa tässä asetuksessa jokaista asiakasta palvelee erilainen PHP-prosessi. Avainasia tässä on, että, alusta loppuun, asiakkaan pyyntö kuluttaa jopa PHP prosessi koko keston. Jos jokaisen pyynnön käsittely kestää kauan, palvelimen resurssit voidaan käyttää hyvin nopeasti.
solmussa yksittäinen Solmuprosessi palvelee tyypillisesti jokaista tapahtumasilmukan asiakasta. Pitkäaikaisissa, kalliissa prosesseissa, kuten tiedostojärjestelmään pääsyssä, tietokannassa tai ETÄLIITTYMÄSSÄ, suositellaan käyttämään asynkronisia menetelmäkutsuja estämisen sijaan. Tämä saavutetaan käyttämällä takaisinsoittoja, jotka käynnistyvät, kun toiminto, kuten pääsy tiedostojärjestelmään, on päättynyt. Tämä tarkoittaa, että yksi Solmuprosessi voi jatkaa uusien pyyntöjen käsittelyä samalla, kun kallis operaatio ajetaan taustalla. Kun kallis operaatio on valmis, se menee takaisin tapahtumasilmukkajonoon, jota käsitellään edelleen solmulla.
pohjimmiltaan Node voidaan nähdä samanlaisena ympäristönä rakennussovelluksille, kuten Pythonin Twisted tai EventMachine Rubyssa. Node on myös sisäänrakennettu tuotanto-valmis HTTP-palvelin, joten se ei tarvitse erillistä palvelinta ajaa sitä, kuten Apache tai Nginx, edelleen parantaa sen lean resursseja vaatimukset (estäen muistivuodot).
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/');
yllä oleva koodiesimerkki näyttää, miten pakollisen ”hello world” – verkkopalvelimen voi kirjoittaa vain muutamalla koodirivillä. Ensimmäinen rivi osoittaa commonjs-nimellä tunnetun moduulijärjestelmän käytön, jota solmu käyttää erillisten moduulien sisällyttämiseen. Require-toiminto on sisäänrakennettu, ja tässä tapauksessa tuo Node ’ s HTTP-moduulin käytettäväksi sovelluksessa. Toinen rivi luo uuden www-palvelinobjektin. Huomaa, että ensimmäinen parametri createServer menetelmä on anonyymi funktio. Useimmat menetelmät solmussa hyväksyvät takaisinkutsutoiminnon parametrina, ja tämä on avain tapahtumapohjaisten sovellusten rakentamiseen.
seuraava suoritusrivi on rivi 5, joka käyttää method chainingia kutsuakseen listen-menetelmää createServer-menetelmän paluuarvosta (palautettu arvo on HTTP-moduulin ilmentymä). Listen-menetelmä aiheuttaa sen, että palvelin alkaa hyväksyä HTTP-pyyntöjä portissa 1337 localhostissa. Viimeinen rivi kirjoittaa konsolille viestin, jossa kerrotaan palvelimen käynnistyneen. Vain kun palvelimelle esitetään pyyntö, kutsutaan anonyymitoimintoa, joka asettaa HTTP-tilakoodin arvoon 200 OK ja asettaa Sisältötyyppisen otsakkeen. ”Hello World” – viesti kirjoitetaan lopulta HTTP-vastauselimelle rivillä 4.
miksi minun pitäisi käyttää solmua.entä js?
solmun tapahtumavetoinen malli soveltuu erityisesti reaaliaikaisiin sovelluksiin, kuten peleihin, uutissyötteisiin ja chat-sovelluksiin. Lisäksi, se mahdollistaa myös käyttää samaa kieltä edessä ja backend. JavaScript on vain yhä suositumpi, kun enemmän rikas asiakaspuolen sovelluksia rakennetaan ja web-selaimet saada nopeammin toteutettaessa JavaScript. Kielten vaihtaminen voi olla turhauttavaa.
WordPress Spezial
Alles rund um WordPress im Entwickler Spezial Vol. 10-ab 18.11.2016 im Handel.
WordPress ist längst weit mehr als ein simples Blogsystem. In diesem Sonderheft beschäftigen sich zahlreiche Spezialisten mit allen wichtigen Fragen rund um das verbreitetste CMS im Web; und dabei geht es nicht nur um klassische Themen, sondern auch um Affiliate Marketing, E-Commerce u.v.m.
div>
toiseksi sillä on hyvä tuki websocketeille. Vaikka Websocketeja on mahdollista tukea PHP: ssä, solmun asynkroninen luonne ja sen sisäänrakennettu HTTP-palvelin tekevät siitä paremman. WebSocketit ovat tapa ylläpitää pysyvää yhteyttä selaimeen, jotta tietoja voidaan siirtää asiakkaalle nopeasti. Verrattuna aiempiin ratkaisuihin, kuten long polling tai comet, WebSockets aiheuttaa paljon pienempi latenssi, koska ei ole yläpuolella instantiating HTTP-yhteys joka kerta, kun joitakin tietoja on lähetettävä. Huono puoli WebSockets on, että se on HTML5 ominaisuus, ja sellaisena ei ole niin hyvin tuettu selaimissa kuin tavallinen vanha Ajax on. On kuitenkin mahdollista ystävällisesti turvautua vaihtoehtoisiin tekniikoihin, kuten pitkiin kyselyihin selaimissa, jotka eivät tue Websocketeja.
tämän vuoden kansainvälisessä PHP-konferenssissa voi oppia lisää solmujen integroinnista.js PHP: llä!
Kansainvälinen PHP-konferenssi on maailman ensimmäinen PHP-konferenssi, ja se on ollut virstanpylväs huippuluokan pragmaattiselle osaamiselle PHP-ja web-teknologioissa jo yli vuosikymmenen ajan . IPC: ssä kansainvälisesti tunnetut PHP-alan asiantuntijat tapaavat PHP: n käyttäjiä ja kehittäjiä suurista ja pienistä yrityksistä. Tutustu aikaisin lintu hinnat suuria alennuksia!
tässä IPC: n highlight-sessioita:
- Making your Angular.js Application accessible
Dirk Ginader (Google) - TypeScript-Making JavaScript Development More Productive and Robust
Rainer Stropek (software architects gmbh) - How to get ready for PHP 7
Sebastian Bergmann (thePHP.cc)
pitää kuitenkin mielessä, että solmu on epäkypsä alusta verrattuna PHP: hen. Se luotiin alun perin vuonna 2009, ja se on vielä lapsenkengissään eikä ole vielä saavuttanut versiota 1.0 – jos sillä on sinulle merkitystä. Saatat huomata, että sovellusliittymiä käytät change in the future, tai et voi löytää kehystä, jossa on sama ominaisuus kuin suosikki PHP frameworkissa. Itse asiassa, kokemukseni mukaan kolmannen osapuolen kirjastot ja puitteet ovat yleensä koostuvat paljon pienemmistä nipuista toimintoja, jotka sinun täytyy koota yhteen.
on myös suurempi riski, että muistivuodot pysäyttävät sovelluksen. Solmuprosessit toimivat tyypillisesti jatkuvasti, kun taas PHP-prosessit yleensä respawnataan määräajoin muistivuotojen vaikutuksen kumoamiseksi.
integroiva osa
uutissyötte integroidaan PHP: n perussivustoon, joka käsittelee käyttäjien kirjautumisia ja istuntoja, käyttäen PHP-fpm: n ja nginx: n yhteistä kokoonpanoa. Käytämme JavaScriptiä Kommunikoidaksemme palvelinpuolen Solmusovelluksen kanssa ja päivittääksemme uutissyötteen dynaamisesti lataamatta sivua uudelleen. Ensin kuitenkin, nopea syrjään istuntoja.
Jos et vielä tee niin, sinun tulisi käyttää keskitettyä tallennustilaa istuntoihisi (Kuva 1). Memcached voidaan helposti käyttää tähän tehtävään käyttämällä sisäänrakennettu istunto tallentaa käsittelijä PECL memcached laajennus. Jos haluat mahdollisuuden käynnistää palvelimen tallentaa istuntoja menettämättä tietoja, sitten Redis on hyvä veto. Joka tapauksessa keskitetyn istunnon tallennuksen avulla voit ladata sovelluksen tasapainon useiden verkkopalvelinten kautta. Se mahdollistaa myös istuntotietojen jakamisen muilla ohjelmointikielillä rakennettujen sovellusten kanssa.
kuva 1: jaettu istuntoarkkitehtuuri.
istuntotiedon jäsentämisessä on kuitenkin pieni ongelma. Alla näkyy PHP-istunnon oletussarjamuoto:
not|a:2:{i:0;s:4:"easy";i:1;a:1:{s:2:"to";s:5:"parse";}}
voi näyttää siltä, että sen jäsentämiseen voi käyttää merkkijonomanipulaatiota, mutta voi olla reunatapauksia, jotka ovat hankalia ratkaista. Olisi mukavaa, jos sessio olisi sarjallistettu paljon rakastetussa JSON-formaatissa:
{"this":{"is": "easier", "to": "parse"}}
paljon paremmin. Se on melko helppo kirjoittaa oman istunnon serialiser, joka muuntaa mitä tallennat $_SESSION JSON muodossa, Katso oma versio.
vaihtoehtoisesti kannattaa harkita msgpackia, joka voidaan määrittää sarjallistamaan istuntoja, kuten alla olevassa koodissa, joka myös osoittaa, miten memcachedia käytetään istunnon tallennuskäsittelijänä.
Nodille on saatavilla Kolmannen osapuolen kirjasto, joka voi sarjallistaa ja deserialisoida msgpackin, joka on saatavilla npm: ssä (Node Package Manager sisältää suuren määrän moduuleja, joita voi käyttää sovelluksessasi vain yksinkertaisella npm-asennuksella ). Tarkastelemme nyt rakentaa uutissyötteen solmun ja sisällyttämällä tämän PHP-sovellus.
PHP-sovellus
PHP-sovellus hoitaa yksinkertaisesti käyttäjien kirjautumiset ja istunnot. Istunnot tallennetaan memcached, mutta voitaisiin melko helposti tallentaa redis. Alla oleva koodi näyttää pätkiä yksinkertainen yhden sivun sovellus (koko lähde mene github.com/lboynton/phphants-march-php).
// // <!]>
käsikirjoituksen ensimmäinen rivi sisältää Composer autoloader-tiedoston, mikä tarkoittaa, että kaikki riippuvuudet ladataan automaattisesti, jolloin erillisten rivien ei tarvitse sisältää tai vaatia (Editorin huomautus: lisätietoja säveltäjästä, Katso Jefersson Nathan de O. Chavesin artikkeli). Tässä tapauksessa istunnon tallennuskäsittelijä on ainoa ulkoisen koodin palanen, joka tarvitaan. On kuitenkin erittäin helppoa sisällyttää kaikki kolmannen osapuolen paketit, jotka ovat saatavilla packagistissa tai muualla myöhemmin käyttämällä Composeria, joka myös lisätään automaattisesti autoloadingiin. Linjoilla 3 ja 4 luodaan yhteys memcachediin, kun taas istunnon tallennuskäsittelijä on alustettu ja rekisteröity PHP: llä linjoilla 5-14. Käyttäjät kirjautuvat sisään yksinkertaisesti määrittelemällä käyttäjätunnuksen GET-parametriksi, vaikka todellisessa järjestelmässä tämä tulisi korvata toimivammalla todennusjärjestelmällä.
JavaScript-puolella käytämme joitakin kolmannen osapuolen kirjastoja : jQuery, alleviivaa.js ja Socket.IO client, joka on selaimen osa solmu moduuli käytämme työntää tietoja selaimeen. Io.connect – menetelmäkutsu luo yhteyden Solmusovellukseen, joka voi käyttää selaintuesta riippuen yhtä useista kuljetuksista, kuten websocketsia tai Ajaxia. Pistorasia.on method perustaa tapahtuman käsittelijä, joka tekee uutisen sivulla aina ’Uutiset’ tapahtuma käynnistyy palvelimen puolella.
Huomautus: Sovellus käyttää Composeria istunnon tallennuskäsittelijän asentamiseen ja Boweria, pakettihallintaa asiakaspuolen resurssien asentamiseen. Asentaaksesi Bowerin, suorita ’npm-g install bower’. Sitten asentaa varat, do ’bower asentaa’. Vaihtoehtoisesti päivittää script tunnisteet ja tyylisivut paikallisten versioiden.
sovellus tarjoillaan käyttäen nginxiä. Tässä nginx-asetustiedosto:
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"; }}
linjat 1-3 määrittelevät ylävirran palvelimen, joka ajaa Solmusovellusta. Mikä tahansa pyyntö päättyy .php lähetetään PHP-fpm: ään (rivit 15-20), kun taas mahdolliset pyynnöt /socket.URL-osoitteen io siirretään Solmusovellukseen (rivit 22-27). Linjat 25 ja 26 käskevät nginxiä tukemaan protokollan vaihtoa ja mahdollistamaan websocketien välittämisen solmuun. Tämä tarkoittaa, että PHP-sovellus ja Solmu-sovellus ovat molemmat ajaa samassa porttiin, sikäli kuin asiakas on huolissaan.
solmu.js App
solmu.js app yksinkertaisesti käsittelee asiakkaan pyynnöt uutissyötteen. Pätkiä siitä näytetään alla (KS. github.com/lboynton/phphants-march-node koko lähde).
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 on kirjasto, joka toimittaa yhden API: n WebSocket-viestinnän suorittamiseen asiakkaan ja palvelimen välillä. Se tukee myös siro varasuunnitelma, kun WebSockets eivät ole saatavilla selaimessa, ja muita hyödyllisiä ominaisuuksia viestiprotokollan kuten sydämenlyönnit, aikakatkaisut ja yhteyden katkaisu tuki, jota ei tueta kättelyssä HTML5 WebSocket API.
ensimmäinen pätkä määrittää valtuutuksen pyynnöille, jotka Socket.io vastaanotettu. Kun uusi pyyntö tulee, se jäsentää pyynnössä olevat evästeet ja yrittää hakea memcached-avaimen, joka vastaa PHPSESSID-evästeen arvoa (PHP-istuntoevästeen oletusnimi). Jos löytyy, se tallentaa jäsennetyn arvon memcached avain data.istunto, johon pääsee myöhemmin.
Seuraava pätkä määrittää, mitä pitäisi tapahtua, kun Socket.io laukaisee ’yhteys’ tapahtuma. Tämä tapahtuma käynnistyy alkuperäisen yhteyden aikana asiakkaalta, kun se on hyväksytty. Aiemmin memcachedista haetut istuntotiedot voidaan nyt viitata pistorasian kautta.kättelymuuttuja. Kun asiakas muodostaa yhteyden, socket-esiintymä liitetään asiakkaan käyttäjätunnukseen, jotta viestejä voidaan lähettää yksittäisille käyttäjille.
viimeinen pätkä sisältää funktion, jolla voi tarkistaa uusia uutisia redis-jonossa. Se käyttää BLPOP-komentoa redis: ssä, mikä tarkoittaa, että jos jono on tyhjä, se estää, kunnes jonoon on liitetty tietoja ennen sen avaamista. Kun joitakin tietoja voidaan piipahtaa pois jonosta, se jäsennetään nimellä JSON ennen kuin määritetään, pitäisikö sisältö lähettää jokaiselle yhdistetylle asiakkaalle vai vain yhdelle käyttäjälle. Uutissisältö lähetetään oikeaan pistorasiaan kutsumalla emit () – menetelmä pistorasiaan, joka liittyi käyttäjään aiemmin connection event handlerissa.
lopuksi solmun prosessi.nextTick () – menetelmää kutsutaan getnews-funktiolla argumenttina. Tämä tarkoittaa, että getNews-toimintoa kutsutaan seuraavan kerran, kun event loop suoritetaan, ja se jatkaa redis-jonon tietojen tarkistamista, kunnes sovellus pysäytetään.
voit asentaa tarvittavat riippuvuudet käyttämällä npm: ää. Suorita sitten sovellus node app.js.
nyt pitäisi pystyä avaamaan verkkoselain ja navigoimaan http://localhost:8080/?username=bob ja katsomaan uutissyöttösovellusta. Avaa nyt toinen selaimen välilehti tai ikkuna, jossa on eri käyttäjätunnus, esimerkiksi http://localhost:8080/?username=sally.
syötteen päivittäminen
syötteen päivittäminen on yksinkertaisesti uuden uutisen työntämistä jonoon. Yhdistä redis CLI-käyttöliittymään komennolla redis-cli. Tämä on interaktiivinen komentotulkki redisille, jonka avulla voit lähettää komentoja suoraan palvelimelle. Alla oleva koodinäyte näyttää, miten jonoon työnnetään:
rpush news '{"content": "Testy test", "to": "bob"}'
käyttäjä Bobille avatussa selainikkunassa pitäisi nähdä uutisen liukuvan alas sivun yläreunasta. Vaihtoehtoisesti voit työntää uutisia sekä Bobille, Sallylle että muille yhdistetyille asiakkaille jättämällä ”to”-parametrin ulkopuolelle seuraavasti:
rpush news '{"content": "Everyone should see this"}'
oikeassa sovelluksessa työntäisit dataa jonoon PHP: stä käyttäen esimerkiksi php-redis-laajennusta tai predis-laajennusta.
johtopäätös
Tämä on vain yksinkertainen esimerkki siitä, miten solmu voidaan integroida PHP-sovellukseen. Toteutuksessa on muutamia rajoituksia. Se esimerkiksi muistaa vain yhden yhteyden jokaiselta käyttäjältä. Siksi jos käyttäjällä on useita välilehtiä tai ikkunoita auki uutissyötteelle, vain yksi sivu päivittyy. Tämä voidaan ratkaista tallentamalla joukko pistorasiat per käyttäjä, ja pitää kirjaa kunkin yhteyden ja irtikytkentä lisätä tai poistaa pistorasiat array. Lukijan tehtäväksi jää toteuttaa parempi ratkaisu. Se myös osoitti pois työkaluja, kuten säveltäjä ja Bower joka suosittelen harkitsemaan käyttää sovelluksia.
Lee Boynton on Ison-Britannian Hampshiressa toimiva kehittäjä, joka on erityisen kiinnostunut reaaliaikaisista sovelluksista, kuten pikaviestinnästä ja aktiviteettivirroista. Hänellä on tietoa palvelinpuolen kehittämisestä ja hallinnosta sekä frontendin kehittämisestä. Hän työskentelee paikallisessa Symbios Group-yhtiössä ja on myös PHP Hampshiren jäsen, jolle hän auttaa tapahtumien järjestämisessä.