Poate WordPress să suporte WebSockets?

19 sept. 2011, 21:36:22
Vizualizări: 19.5K
Voturi: 23

WebSockets sunt o tehnologie modernă inclusă în HTML5. În esență, poți deschide un canal WebSocket pentru a permite comunicare bidirecțională persistentă cu un server web. Interfața client (utilizator) poate trimite mesaje spontan, iar serverul poate răspunde la fel.

Tehnologia actuală (JavaScript) necesită ca totul să fie inițiat de client - serverul nu poate trimite date către client decât dacă acesta le solicită. De aceea, scripturile trebuie să facă refresh constant pentru a verifica dacă există date noi. WebSockets funcționează mai mult pe principiul "push", permițând transmiterea de date oricând.

Din păcate, majoritatea implementărilor WebSockets (toate pe care le-am găsit, cel puțin) necesită un server aplicațional specific. De obicei, utilizatorii rulează Apache pe porturile 80 și 443 (http și https) și un alt sistem (de obicei Node.js) pe un alt port (cum ar fi 8000 sau 8080) pentru a gestiona cererile WebSocket.

Această abordare funcționează, evident, dar are dezavantaje.

Am un plugin pe care doresc să-l dezvolt și care ar beneficia enorm de utilizarea WebSockets în WordPress. Dar dacă un utilizator trebuie să instaleze un al doilea server web (de obicei imposibil pentru cei cu găzduire shared), atunci nu va funcționa ca plugin.

Așadar, pentru cei care aveți experiență, cum ați face WordPress compatibil cu WebSockets? Ați face ca WordPress să gestioneze singur comunicarea sau ați integrat un mini-server în plugin? Dacă ați făcut deja asta, cum ați reușit fără a strica funcționalitatea WordPress?

Resurse posibile?


Actualizare 21/09/11

Având în vedere discuțiile despre cum Apache (cel mai des folosit server pentru WordPress pe găzduire shared) nu poate gestiona nativ WebSockets, mă întreb dacă există o alternativă. Mai multe plugin-uri (JetPack, de exemplu) comunică cu un serviciu extern sau API pentru a genera conținut.

Statisticile solicită conținut de la Automattic. Akismet trimite date în ambele sensuri către un server extern. After the Deadline trimite conținut la momentul publicării. Unele instrumente SEO transmit date prin sisteme externe.

Așadar, în loc să găzduiești codul WebSocket într-un plugin WordPress, ar fi fezabil să folosești un serviciu WebSocket centralizat și să interacționezi cu el prin intermediul unui frontend WordPress?

2
Comentarii

Concluzia este următoarea: Dacă websockets nu funcționează bine cu serverul web nativ, atunci nu poți să le implementezi ușor cu acel server. Aceasta nu este o problemă specifică WordPress. După cum ai menționat, websockets necesită de obicei un server separat precum node.js sau altceva, nu vor funcționa prea bine cu Apache. Așadar, problema ta nu este "cum o fac compatibilă cu WordPress", ci "cum o fac să funcționeze pe hosting-ul cu cel mai mic numitor comun", care este o cu totul altă poveste.

Otto Otto
21 sept. 2011 22:49:05

Suportul pentru WebSocket ar putea fi adăugat în nucleul WordPress, cu un server WebSocket integrat și un endpoint precum admin-ajax.php, nu? Există și biblioteca JavaScript frontend / Node.js backend Socket.IO pentru WebSocket cu polling ca rezervă, care este dezvoltată de Automattic, compania din spatele WordPress.

baptx baptx
2 nov. 2017 21:12:46
Toate răspunsurile la întrebare 5
1
10

WebSockets utilizează protocolul websockets: WS:/example.com/yourscript.js și deschid o conexiune sincronă - adică conexiunea este menținută deschisă și dedicată browserului.

Serverele httpd, cum ar fi apache2 (folosit de majoritatea furnizorilor de hosting partajat) utilizează protocolul http: http://example.com/yourscript.js și deschid o conexiune asincronă - adică nicio conexiune nu este menținută deschisă între server și browser. (Poți prelungi modest conexiunile deschise prin setarea anumitor parametri de configurare - dar, în general, este asincronă.)

După cum îți poți imagina, menținerea conexiunilor deschise între browser și server alocă mai multe resurse de server pentru fiecare conexiune de browser și, prin urmare, solicită mai multe resurse ale serverului decât închiderea conexiunilor după fiecare cerere. Furnizorii de hosting partajat sunt, pe bună dreptate, reticenți în a suporta WS pe hosting partajat.

Deși anumiți furnizori de hosting partajat pot avea mod_python instalat, permițând astfel utilizatorilor pluginului tău să ruleze pywebsocket, documentația pywebsocket afirmă clar că "pywebsocket este destinat pentru teste sau scopuri experimentale."

Așadar, deși cineva și-ar putea imagina un plugin care include cod Python pentru a crea un server pywebsocket, având un server Apache care să-l suporte, nu cred că ar fi rezonabil vreodată să distribuiești un plugin care să facă acest lucru.

19 sept. 2011 23:27:17
Comentarii

Există câteva biblioteci PHP simple care pretind că oferă suport pentru websockets. Dacă acestea funcționează eficient în cadrul Apache ar fi un test interesant. Vezi actualizarea mea pentru linkuri ...

EAMann EAMann
20 sept. 2011 01:19:33
0

Ca răspuns la actualizarea ta, în opinia mea și pe baza cercetărilor pe care le-am făcut, aceasta ar fi cea mai bună opțiune. Chiar mai bine ar fi să creezi un plugin pentru front-end și un serviciu extern de websocket pentru a comunica cu plugin-urile, iar apoi să percepi o taxă pentru acest serviciu, dacă dorești să îți monetizezi ideea. Ai putea chiar să oferi codul sursă pentru serviciul de websocket și să creezi o setare în plugin pentru a specifica unde (pe ce domeniu/IP și port) se află serviciul de websocket.

13 apr. 2012 08:06:06
2

Uită-te de opțiunea "clasică" apache2 - apache2-mpm-prefork - pentru acest scop. Poate că apache2-mpm-event ar putea gestiona această situație, dar este încă experimental. Deoarece apache2 nu este bazat pe evenimente (event-driven), problema descrisă de @marfarma există cu adevărat. Pentru acest tip de servire vei avea nevoie de un server web bazat pe evenimente, de exemplu cherokee sau nginx.

nginx poate fi un adevărat avantaj pentru WordPress (după cum și wordpress.com îl folosește ca server), iar el poate redirecționa anumite cereri către un serviciu node.js, de exemplu.

Câteva exemple pe această temă:

Am creat și un mic tutorial pentru configurarea nginx + php-fpm + wordpress.

20 sept. 2011 09:04:49
Comentarii

Uitarea abordării "clasice" nu este cu adevărat o opțiune pentru a produce un plugin ușor de instalat pentru utilizatorii obișnuiți. Da, utilizarea nginx, cherokee sau node.js pentru a servi conținutul de pe server este o opțiune, dar nu poți pur și simplu să pui asta într-un fișier readme al pluginului și să speri că utilizatorii vor a) înțelege sau b) vor putea face ceva în legătură cu asta.

EAMann EAMann
20 sept. 2011 16:55:13

apache2-mpm-prefork nu a fost conceput să poată gestiona acest tip de utilizare. Există plugin-uri care necesită memcached, APC, etc., așa că acest lucru ar putea necesita doar un server web bazat pe evenimente. Aceasta este o cerință de backend, mpm-prefork și mpm-worker nu sunt pentru acest scop.

petermolnar petermolnar
20 sept. 2011 17:10:34
0

O altă soluție posibilă este să folosești un furnizor terț de Web Sockets, am experimentat puțin cu Pusher (http://pusher.com/), există un API la care te poți conecta și care ar putea funcționa bine pentru ceea ce încerci să realizezi. M-am gândit cum aș putea să-l utilizez pe propriile mele site-uri WordPress.

Un posibil dezavantaj este că și alți oameni care încarcă să-ți folosească plugin-ul ar trebui să-și facă un cont Pusher pentru ca acesta să funcționeze. Este mult mai ușor de lucrat decât să-ți instalezi propriul server Web Sockets și să-l întreții, asta ar fi de fapt un avantaj când vine vorba de alții care încarcă să-ți folosească plugin-ul.

22 sept. 2011 00:46:10
1

Răspunsul scurt este: da, este posibil. Aș considera însă o soluție mai distribuită decât un singur VPS care reprezintă un punct unic de eșec pe care îl gazduiești. Poate ar fi bine să te uiți la niște sisteme EC2 cu load balancing sau ceva similar? (Presupun că ai un flux de venituri care să permită astfel de conveniențe. zâmbet)

21 sept. 2011 22:22:01
Comentarii

"o sursă de venit pentru a asigura astfel de conveniențe" ... ar fi minunat :-)

EAMann EAMann
21 sept. 2011 22:23:11