Bisakah WordPress dibuat untuk mendukung soket web?

19

Websockets adalah teknologi canggih dan canggih yang dibungkus dengan HTML5. Pada dasarnya, Anda dapat membuka websocket untuk mengaktifkan komunikasi 2 arah yang persisten dengan server web. Klien (antarmuka pengguna) dapat mengirim pesan secara spontan, dan server juga dapat mengirim pesan.

Teknologi yang ada (JavaScript) mengharuskan semuanya dimulai oleh klien - server tidak dapat mengirim apa pun ke klien yang belum diminta klien. Jadi skrip harus terus-menerus menyegarkan dan meminta kembali data yang mungkin tidak berubah. Websockets bekerja lebih banyak pada basis " push " dan membiarkan data baru turun kapan saja.

Sayangnya, sebagian besar (yang dapat saya temukan, bagaimanapun juga) implementasi websocket memerlukan aplikasi server tertentu untuk bekerja. Orang akan menjalankan Apache pada port 80 dan 443 (http dan https) dan menjalankan sistem lain (biasanya Node.js) pada port lain (yaitu 8000 atau 8080) untuk menangani permintaan websocket.

Ini bekerja, tentu saja, tetapi ada beberapa kekurangan.

Saya memiliki plugin yang ingin saya buat yang akan sangat bermanfaat dengan menggunakan soket web di WordPress. Tetapi jika pengguna perlu menginstal server web kedua (biasanya tidak mungkin bagi orang dengan hosting bersama), maka itu tidak akan berfungsi sebagai plugin.

Jadi, bagi Anda yang memiliki pengalaman, bagaimana Anda membuat WordPress kompatibel dengan websockets? Apakah Anda akan membuat WordPress menangani komunikasi itu sendiri, atau menggabungkan skrip mini-server lain ke dalam plugin? Jika Anda sudah melakukan ini, bagaimana Anda melakukannya tanpa melanggar WordPress itu sendiri?

Sumber daya yang mungkin?


9/21/11 Pembaruan

Dengan semua pembicaraan tentang bagaimana Apache (server yang paling umum diinstal untuk menjalankan WP pada host bersama) tidak bisa menangani websockets secara asli, saya bertanya-tanya tentang alternatif. Beberapa plugin (JetPack, misalnya) berbicara dengan layanan eksternal atau API untuk menghasilkan konten.

Statistik meminta konten dari Automattic. Akismet mengirim data bolak-balik dari server eksternal. Setelah Tenggat waktu mengirimkan konten pada waktu publikasi. Beberapa alat SEO melewati banyak hal melalui sistem eksternal.

Jadi sebagai alternatif untuk menyimpan kode websocket di dalam plugin WordPress, mungkinkah menjadi tuan rumah layanan websocket di lokasi pusat dan sebaliknya menggunakan antarmuka frontend WordPress?

EAMann
sumber
3
Intinya adalah ini: Jika soket web tidak bekerja dengan baik dengan server web asli, maka Anda tidak dapat dengan mudah melakukannya dengan server web itu. Ini bukan masalah khusus WordPress. Seperti yang Anda nyatakan, websockets umumnya memerlukan server terpisah seperti node.js atau sesuatu, mereka tidak akan bekerja dengan Apache sama sekali. Jadi masalah Anda bukan salah satu dari "bagaimana cara membuatnya kompatibel dengan WordPress", ini "bagaimana cara membuatnya bekerja pada hosting denominator umum terendah", yang merupakan ketel ikan lainnya.
Otto
Dukungan WebSocket dapat ditambahkan ke inti WordPress, dengan server WebSocket built-in dan titik akhir seperti admin-ajax.php, bukan? Ada juga JavaScript frontend / Node.js backend library Socket.IO untuk WebSocket dengan polling sebagai fallback, yang dikembangkan oleh Automattic, perusahaan di belakang WordPress.
baptx

Jawaban:

8

WebSockets menggunakan protokol websockets: WS: /example.com/yourscript.js dan buka koneksi sinkron - artinya koneksi dipegang terbuka dan didedikasikan untuk browser.

Server httpd, seperti apache2 (digunakan oleh sebagian besar penyedia hosting bersama) menggunakan protokol http: http://example.com/yourscript.jsdan membuka koneksi asinkron - artinya tidak ada koneksi yang dipegang terbuka antara server dan browser. (Anda dapat memperpanjang koneksi terbuka, secara sederhana, dengan mengatur parameter konfigurasi tertentu - tetapi secara umum, itu tidak sinkron.)

Seperti yang dapat Anda bayangkan, mempertahankan koneksi terbuka antara browser dan server mendedikasikan lebih banyak sumber daya server untuk setiap koneksi browser, dan karenanya lebih membebani sumber daya server daripada menjatuhkan koneksi setelah setiap permintaan. Secara wajar penyedia hosting berbagi cenderung untuk mendukung WS pada shared hosting.

Sementara host bersama tertentu mungkin memiliki mod_python diinstal, sehingga memungkinkan pengguna plugin Anda untuk menjalankan pywebsocket , dokumentasi pywebsocket sendiri dengan jelas menyatakan bahwa "pywebsocket dimaksudkan untuk tujuan pengujian atau eksperimental."

Jadi, sementara orang dapat membayangkan plugin bundling kode python untuk membuat server pywebsocket, diberikan server apache yang mendukungnya, saya tidak percaya akan masuk akal untuk mendistribusikan plugin yang melakukannya.

marfarma
sumber
Ada beberapa pustaka PHP lurus yang mengklaim mendukung websockets. Apakah mereka akan bekerja secara efektif dalam Apache akan menjadi tes yang menarik. Lihat pembaruan saya untuk tautan ...
EAMann
3

Menanggapi pembaruan Anda, menurut pendapat saya dan berdasarkan penelitian yang telah saya lakukan, itu akan menjadi pilihan terbaik. Yang lebih baik lagi adalah membuat plugin ujung depan dan membuat layanan websocket eksternal untuk berbicara dengan plugin, dan membebankan biaya untuk itu sehingga Anda dapat menghasilkan uang ide Anda, jika Anda mau. Anda bahkan dapat memberikan kode sumber untuk layanan websocket dan membuat pengaturan di plugin untuk mengatur di mana (domain / IP dan port mana) layanan websocket berada.

pengguna15143
sumber
2

Lupakan apache2 "klasik" - apache2-mpm-prefork - untuk tujuan ini. Mungkin apache2-mpm-event bisa menangani ini, tetapi ini masih eksperimental. Karena apache2 bukan event-driven, masalah yang dijelaskan oleh @marfarma memang ada. Anda akan memerlukan server web yang digerakkan oleh peristiwa untuk penyajian jenis ini, misalnya cherokee atau nginx.

nginx dapat menjadi manfaat nyata untuk WordPress (seperti wordpress.com menggunakannya sebagai server mereka juga), dan itu dapat mem-proxy permintaan tertentu ke layanan node.js misalnya.

Beberapa contoh dalam topik:

Saya juga membuat tutorial kecil untuk setup nginx + php-fpm + wordpress .

petermolnar
sumber
Melupakan pendekatan "klasik" sebenarnya bukanlah opsi untuk menghasilkan plugin yang mudah dipasang untuk pengguna awam. Ya, menggunakan nginx, cherokee, atau node.js untuk melayani hal-hal dari server adalah sebuah pilihan, tetapi Anda tidak bisa begitu saja meletakkannya di plugin readme dan berharap pengguna akan a) memahaminya atau b) dapat melakukan apa saja tentang Itu.
EAMann
apache2-mpm-prefork tidak dirancang untuk dapat menangani penggunaan semacam ini. Ada beberapa plugin yang membutuhkan memcached, APC, dll., Jadi ini hanya membutuhkan server web berbasis peristiwa. Ini adalah persyaratan backend, mpm-prefork dan mpm-pekerja bukan untuk ini.
petermolnar
1

Solusi potensial lainnya adalah dengan menggunakan penyedia soket web pihak ketiga, saya telah sedikit bermain-main dengan Pusher (http://pusher.com/) sedikit, ada API yang dapat Anda gunakan yang dapat bekerja dengan baik untuk apa yang Anda coba lakukan. Saya telah merenungkan bagaimana saya dapat memanfaatkannya di situs WordPress saya sendiri.

Kerugian yang mungkin adalah bahwa orang lain yang mencoba menggunakan plugin Anda juga harus mendapatkan akun Pusher untuk membuatnya berfungsi. Ini jauh lebih mudah untuk dikerjakan daripada menginstal server Web Sockets Anda sendiri dan harus memeliharanya, yang sebenarnya akan menjadi keuntungan sebenarnya ketika menyangkut orang lain yang mencoba menggunakan plugin Anda.

Rick Curran
sumber
0

Jawaban singkatnya adalah: ya, itu bisa dilakukan. Saya mungkin melihat ke sesuatu yang sedikit lebih didistribusikan daripada satu titik kegagalan VPS yang Anda host. Mungkin melihat ke beberapa sistem EC2 beban-seimbang atau semacam itu? (Saya berasumsi Anda memiliki aliran pendapatan untuk menyediakan kenyamanan seperti itu. Seringai )

ZaMoose
sumber
1
"aliran pemasukan untuk menyediakan kenyamanan semacam itu" ... itu akan menyenangkan :-)
EAMann