Menggunakan PHP dengan Socket.io

128

Apakah mungkin menggunakan Sockets.io di sisi klien dan berkomunikasi dengan aplikasi berbasis PHP di server? Apakah PHP bahkan mendukung cara menulis kode 'koneksi berumur panjang'?

Semua kode sampel yang saya temukan untuk socket.io tampaknya untuk node.js di sisi server, jadi tidak ada bantuan di sana.

Yuvi
sumber
3
Kemungkinan rangkap: Socket.io dari sumber php
hakre
Anda mungkin ingin mempertimbangkan hanya pendorong. Ini memiliki perpustakaan PHP yang bagus yang akan saya gunakan.
Devin G Rhode
hai, coba yang ini - github.com/walkor/phpsocket.io
Zhenya Hristova

Jawaban:

98

Mungkin agak terlambat untuk menjawab pertanyaan ini, tetapi inilah yang saya temukan.

Saya tidak ingin berdebat tentang fakta bahwa node melakukan itu lebih baik daripada php atau tidak, ini bukan intinya.

Solusinya adalah: Saya belum menemukan implementasi socket.io untuk PHP.

Tetapi ada beberapa cara untuk mengimplementasikan WebSockets . Ada plugin jQuery ini memungkinkan Anda untuk menggunakan Websockets sementara merendahkan anggun untuk browser yang tidak mendukung. Di sisi PHP, ada kelas ini yang tampaknya paling banyak digunakan untuk server PHP WS.

Florian Margaine
sumber
1
kelas phpwebsocket memang cara untuk pergi jika Anda menginginkan implementasi server websocket php. Namun ini tidak terkait dengan pertanyaan. OP sudah memiliki server WS (socket.io) yang diimplementasikan dan meminta cara untuk berkomunikasi dengan aplikasi php.
kasper Taeymans
72

Jika Anda ingin menggunakan socket.io bersama dengan php ini mungkin jawaban Anda!

situs web proyek:

elephant.io

mereka juga ada di github:

https://github.com/wisembly/elephant.io

Elephant.io menyediakan klien socket.io yang sepenuhnya ditulis dalam PHP yang seharusnya dapat digunakan di mana saja dalam proyek Anda.

Ini adalah pustaka yang ringan dan mudah digunakan yang bertujuan untuk menghadirkan fungsionalitas waktu-nyata ke aplikasi PHP melalui socket.io dan websockets untuk tindakan yang tidak dapat dilakukan dalam javascript penuh.

contoh dari situs web proyek (berkomunikasi dengan server websocket melalui php)

server php

use ElephantIO\Client as Elephant;

$elephant = new Elephant('http://localhost:8000', 'socket.io', 1, false, true, true);

$elephant->init();
$elephant->send(
    ElephantIOClient::TYPE_EVENT,
    null,
    null,
    json_encode(array('name' => 'foo', 'args' => 'bar'))
);
$elephant->close();

echo 'tryin to send `bar` to the event `foo`';

server socket io

var io = require('socket.io').listen(8000);

io.sockets.on('connection', function (socket) {
  console.log('user connected!');

  socket.on('foo', function (data) {
    console.log('here we are in action event and data is: ' + data);
  });
});
kasper Taeymans
sumber
2
Saya akan memberi Anda +1 di sini, tetapi sepertinya ini masih sedikit cara agar tidak dapat digunakan di lingkungan produksi.
Beachhouse
17
Saya pernah melihat yang satu ini, tetapi satu hal membingungkan saya. Bukankah intinya di sini agar PHP mengimplementasikan server sockets.io? dan, sebaliknya, Elepant.io tampaknya merupakan implementasi PHP dari klien sockets.io yang dapat Anda sambungkan ke beberapa server sockets.io lainnya (artinya, elephant.io tidak mendengarkan koneksi dari sockets.io klien Anda, menghubungkan kepada mereka dan melayani mereka)?
Pimp Trizkit
Hanya apa yang saya cari, kasihan bahwa koneksi gigih dalam tahap awal pengembangan.
slezadav
8
Halo semua. Tujuan Elephant.io hanya untuk memecat acara dari PHP ke server socket.io. Tidak membuka hubungan yang persisten. Tetapi untuk dapat terhubung dengan cepat dan mengirim acara / pesan. Kami menggunakannya dalam produksi dan berfungsi seperti pesona.
guillaumepotier
3
perpustakaan ini tidak dipelihara lagi dan memiliki beberapa masalah bagi kami
Flion
14

Jika Anda benar-benar ingin menggunakan PHP sebagai backend Anda untuk socket.io, berikut adalah apa yang saya temukan. Dua alternatif sisi socket.io php server.

https://github.com/walkor/phpsocket.io

https://github.com/RickySu/phpsocket.io

Kode exmaple untuk repositori pertama seperti ini.

use PHPSocketIO\SocketIO;

// listen port 2021 for socket.io client
$io = new SocketIO(2021);
$io->on('connection', function($socket)use($io){
  $socket->on('chat message', function($msg)use($io){
    $io->emit('chat message', $msg);
  });
});
pejalan kaki
sumber
7

Untuk 'koneksi berumur panjang' yang Anda sebutkan, Anda dapat menggunakan Ratchet untuk PHP. Ini adalah perpustakaan yang dibangun berdasarkan fungsi Stream Socket yang didukung PHP sejak PHP 5.

Untuk sisi klien, Anda perlu menggunakan WebSocket yang didukung HTML5 alih-alih Socket.io (karena Anda tahu, socket.io hanya berfungsi dengan node.js).

Jika Anda masih ingin menggunakan Socket.io, Anda dapat mencoba cara ini: - cari & dapatkan socket.io.js untuk digunakan klien - bekerja dengan Ratchet untuk mensimulasikan cara socket.io di server

Semoga ini membantu!

Chung Xa
sumber
6

Erm, mengapa kamu mau? Biarkan PHP di backend dan NodeJS / Sockets untuk melakukan hal yang tidak menghalangi.

Ini adalah sesuatu untuk Anda mulai: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

Secara pribadi saya telah menjalankan express dengan titik akhir yang mendengarkan dengan jelas untuk interaksi dari PHP.

Misalnya, jika saya telah mengirim email kepada pengguna, saya ingin socket.io menampilkan pemberitahuan waktu-nyata kepada pengguna.

Ingin interaksi dari socket.io ke php, Anda bisa melakukan sesuatu seperti ini:

var http = require('http'),
            host = WWW_HOST,
            clen = 'userid=' + userid,
            site = http.createClient(80, host),
            request = site.request("POST", "/modules/nodeim/includes/signonuser.inc.php",  
                {'host':host,'Content-Length':clen.length,'Content-Type':'application/x-www-form-urlencoded'});                     

request.write('userid=' + userid);      
request.end();  

Serius, PHP sangat bagus untuk melakukan hal-hal sisi server dan membiarkannya dengan koneksi yang tidak memiliki tempat di domain ini sekarang. Mengapa melakukan polling yang lama ketika Anda memiliki soket web atau flash.

PaulM
sumber
32
Karena sebagian dari kita hanya bisa mendapatkan host murah yang hanya akan membiarkan Anda menggunakan php dan mysql.
Lanbo
31
Karena beberapa dari kita harus bekerja dengan kerangka kerja yang ada yang bergantung pada PHP. Sebagai contoh, kami mengembangkan dan menjual skrip PHP, tetapi ingin meningkatkan IM dengan menggunakan websockets, kami tidak ingin menulis semua fallback yang sudah diterapkan socket.io tetapi kami tidak dapat meminta NodeJS dari klien kami.
Purefan
3
@ PaulM: Saya mencoba beberapa penyedia VPS <$ 10, dan semuanya sangat payah. Masing-masing sangat lambat, ketika ada sesuatu yang rusak, dukungan mengerikan dll. Di sisi lain, di Finlandia tidak jarang mendapatkan web hosting berkualitas yang layak (tetapi dengan php / mysql / file statis saja) dengan berlangganan adsl, tanpa membayar tambahan . Jadi tidak, bisa membeli VPS jelek seharga $ 5 jelas bukan solusi.
Olli
4
Untuk penyedia VPS <$ 10, satu-satunya yang layak yang saya temukan sejauh ini adalah digitalocean.com. Tapi itu cukup bagus.
Aeolun
3
Saya tidak setuju. Saya pikir jawaban seperti ini sangat relevan. Seseorang yang mengatakan kepada Anda "Anda salah menggunakannya" bisa bernilai jauh lebih banyak daripada seseorang yang membantu Anda menggunakannya dengan salah.
Rijk
6

Saya tahu orang yang berjuang! Tapi baru-baru ini saya cukup banyak bekerja dengan Workerman. Jika Anda belum menemukan kerangka kerja php ini maka Anda sebaiknya memeriksanya!

Well, Workerman adalah kerangka kerja PHP asinkron yang digerakkan untuk dengan mudah membangun aplikasi jaringan yang cepat dan dapat diskalakan. (Saya baru saja menyalin dan menempelkannya dari situs web mereka hahahah http://www.workerman.net/en/ )

Cara mudah untuk menjelaskan ini adalah bahwa ketika datang pemrograman web socket yang Anda benar-benar perlu miliki adalah memiliki 2 file di server Anda atau server lokal (di mana pun Anda bekerja).

  1. server.php (kode sumber yang akan menanggapi semua permintaan klien)

  2. client.php / client.html (kode sumber yang akan melakukan hal-hal yang diminta)

Jadi pada dasarnya, Anda benar kode terlebih dahulu pada Anda server.php dan mulai server. Biasanya, karena saya menggunakan windows yang menambah perjuangan, saya menjalankan server melalui perintah ini -> php server.php start

Nah jika Anda menggunakan xampp. Inilah satu cara untuk melakukannya. Pergi ke mana pun Anda ingin meletakkan file Anda. Dalam kasus kami, kami akan memasukkan file

C: /xampp/htdocs/websocket/server.php

C: /xampp/htdocs/websocket/client.php atau client.html

Dengan asumsi bahwa Anda sudah memiliki file-file itu di server lokal Anda. Buka Git Bash atau Command Line atau Terminal atau apa pun yang Anda gunakan dan unduh pustaka php di sini.

https://github.com/walkor/Workerman

https://github.com/walkor/phpsocket.io

Saya biasanya mengunduhnya melalui komposer dan hanya memuat secara otomatis file-file itu dalam skrip php saya.

Dan juga periksa yang ini. Ini sangat penting ! Anda memerlukan perpustakaan javascript ini agar Anda client.php atau client.html untuk berkomunikasi dengan server.php ketika Anda menjalankannya.

https://github.com/walkor/phpsocket.io/tree/master/examples/chat/public/socket.io-client

Saya hanya menyalin dan menempel folder socket.io-client itu pada tingkat yang sama dengan server.php saya dan client.php saya

Berikut adalah kode sumber server.php

<?php
require __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;
use PHPSocketIO\SocketIO;

// listen port 2021 for socket.io client
$io = new SocketIO(2021);
$io->on('connection', function($socket)use($io){
    $socket->on('send message', function($msg)use($io){
        $io->emit('new message', $msg);
    });
});

Worker::runAll();

Dan di sini adalah client.php atau client.html source

<!DOCTYPE html>
<html>
    <head>
        <title>Chat</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">        
    </head>
    <body>
        <div id="chat-messages" style="overflow-y: scroll; height: 100px; "></div>        
        <input type="text" class="message">
    </body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>    
    <script src="socket.io-client/socket.io.js"></script>  
    <script>
            var socket = io.connect("ws://127.0.0.1:2021");

            $('.message').on('change', function(){
                socket.emit('send message', $(this).val());
                $(this).val('');
            });

            socket.on('new message', function(data){
                $('#chat-messages').append('<p>' + data +'</p>');
            });
    </script>
</html>

Sekali lagi, buka baris perintah Anda atau git bash atau terminal tempat Anda meletakkan file server.php Anda. Jadi dalam kasus kami, yaitu C: / xampp / htdocs / websocket / dan ketik php server.php mulai dan tekan enter.

Lalu buka browser Anda dan ketik http: //localhost/websocket/client.php untuk mengunjungi situs Anda. Kemudian cukup ketik apa saja ke kotak teks itu dan Anda akan melihat websocket php dasar saat bepergian!

Anda hanya perlu mengingatnya. Dalam pemrograman soket web, itu hanya membutuhkan server dan klien. Jalankan kode server terlebih dahulu dan buka kode klien. Dan begitulah! Semoga ini membantu!

disamping itu juga
sumber
4

Jika Anda benar-benar ingin menggunakan PHP sebagai backend Anda untuk WebSockets, tautan ini dapat membantu Anda:

https://github.com/lemmingzshadow/php-websocket

http://www.htmlgoodies.com/html5/other/create-a-bi-directional-connection-to-a-php-server-using-html5-websockets.html#fbid=QqpDVi8FqD9

Chris Hanson
sumber
1
Apakah ini memungkinkan Anda untuk menggunakan socket.io (dengan semua transport dan browser yang didukung). Atau apakah Anda harus menggunakan klien yang dilengkapi dengan php-websocket?
Darren Cook
3

Bagaimana dengan ini ? PHPSocketio ?? Ini adalah alternatif sisi server socket.io php. Pengulangan acara didasarkan pada ekstensi acara pecl. Meski belum mencobanya sendiri sampai sekarang.

Sankalp Singha
sumber
3

Kami sekarang pada tahun 2018 dan hoola, ada cara untuk mengimplementasikan WS dan WAMPServer di php. Itu Disebut Ratchet .

Shamaseen
sumber
2

Saya belum mencobanya, tetapi Anda harus dapat melakukan ini dengan ReactPHP dan komponen soket ini . Tampak seperti Node, tetapi dalam PHP.

Mpen
sumber
0

Saya sedang mencari cara yang sangat sederhana untuk membuat PHP mengirim pesan socket.io ke klien.

Ini tidak memerlukan perpustakaan PHP tambahan - itu hanya menggunakan soket.

Alih-alih mencoba terhubung ke antarmuka websocket seperti banyak solusi lain, cukup sambungkan ke server node.js dan gunakan .on('data')untuk menerima pesan.

Kemudian, socket.iobisa meneruskannya ke klien.

Deteksi koneksi dari server PHP Anda di Node.js seperti ini:

//You might have something like this - just included to show object setup
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);

server.on("connection", function(s) {
    //If connection is from our server (localhost)
    if(s.remoteAddress == "::ffff:127.0.0.1") {
        s.on('data', function(buf) {
            var js = JSON.parse(buf);
            io.emit(js.msg,js.data); //Send the msg to socket.io clients
        });
    }
});

Inilah kode php yang sangat sederhana - saya membungkusnya dalam suatu fungsi - Anda dapat menemukan sesuatu yang lebih baik.

Perhatikan bahwa 8080ini adalah port ke server Node.js saya - Anda mungkin ingin mengubahnya.

function sio_message($message, $data) {
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    $result = socket_connect($socket, '127.0.0.1', 8080);
    if(!$result) {
        die('cannot connect '.socket_strerror(socket_last_error()).PHP_EOL);
    }
    $bytes = socket_write($socket, json_encode(Array("msg" => $message, "data" => $data)));
    socket_close($socket);
}

Anda bisa menggunakannya seperti ini:

sio_message("chat message","Hello from PHP!");

Anda juga dapat mengirim array yang dikonversi ke json dan diteruskan ke klien.

sio_message("DataUpdate",Array("Data1" => "something", "Data2" => "something else"));

Ini adalah cara yang berguna untuk "mempercayai" bahwa klien Anda mendapatkan pesan yang sah dari server.

Anda juga dapat meminta PHP meneruskan pembaruan basis data tanpa meminta ratusan klien untuk meminta basis data.

Saya berharap saya menemukan ini lebih cepat - semoga ini membantu! 😉

pengguna1274820
sumber
1
Ide bagus, saya sedang mencari cara untuk melewatkan redis (kalau itu ide yang bagus)! Ada kesalahan ketik pada kode pertama, titik koma setelahnya s.remoteAddress;. Namun, saya tidak membuatnya bekerja. Saya mendapatkan koneksi dalam node, mendeteksi koneksi, remoteaddress benar, tetapi s.on('data')tidak pernah terjadi, tetapi tidak ada yang terjadi. Saya mencoba s.on('msg')juga. Saya menggunakan kode PHP persis Anda. Saya menggunakan https, untuk server simpul, tetapi itu tidak masalah?
Niclas
@ Niclas hey maaf tentang kesalahan ketik - tidak percaya itu ada di sana selama ini. Apakah server simpul Anda berjalan di port 8080? Jika tidak, Anda perlu mengubah port. Jika demikian, periksa Remote Addressyang dikembalikan - pastikan itu adalah loopback / alamat lokal - mungkin berbeda dengan pengaturan server Anda. Untuk pengujian, Anda dapat menghapus garisif(s.remoteAddress == "::ffff:127.0.0.1")
user1274820
Terima kasih atas balasan cepatnya! Saya berhasil konsol.log sepanjang jalan, bahkan remoteaddress benar, hanya saja tidak memasuki bagian s.on ('data'). Apakah ada cara untuk menguji pesan apa yang dikirim? Baca kembali komentar saya untuk melihat apakah saya melewatkan sesuatu. Saya mungkin memulai ini sebagai pertanyaan baru untuk mengirim kode tetapi hampir persis seperti milik Anda.
Niclas
Saya memulai ini sebagai pertanyaan baru untuk membuatnya lebih mudah untuk membahas secara rinci: stackoverflow.com/questions/53689391/…
Niclas