ใช้ PHP กับ Socket.io


128

เป็นไปได้หรือไม่ที่จะใช้ Sockets.io ในฝั่งไคลเอ็นต์และสื่อสารกับแอปพลิเคชันที่ใช้ PHP บนเซิร์ฟเวอร์ PHP รองรับวิธีการเขียนโค้ดแบบ 'การเชื่อมต่อที่ยาวนาน' หรือไม่?

โค้ดตัวอย่างทั้งหมดที่ฉันพบสำหรับ socket.io ดูเหมือนจะเป็นของ node.js ทางฝั่งเซิร์ฟเวอร์ดังนั้นจึงไม่มีความช่วยเหลือ


3
อาจซ้ำกันได้: Socket.io จากแหล่ง php
hakre

คุณอาจต้องการพิจารณาเพียงแค่ผลักดัน มีไลบรารี PHP ที่ดีที่ฉันจะใช้
Devin G Rhode

สวัสดีลองอันนี้ - github.com/walkor/phpsocket.io
Zhenya Hristova

คำตอบ:


98

อาจจะสายไปหน่อยที่คำถามนี้จะได้รับคำตอบ แต่นี่คือสิ่งที่ฉันพบ

ฉันไม่ต้องการที่จะอภิปรายเกี่ยวกับความจริงที่ว่าโหนดนั้นดีกว่า php หรือไม่นี่ไม่ใช่ประเด็น

วิธีแก้ปัญหาคือ: ฉันไม่พบการใช้งาน socket.io สำหรับ PHP เลย

แต่มีวิธีการบางอย่างที่จะใช้WebSockets มีปลั๊กอิน jQuery นี้ให้คุณใช้ Websockets ในขณะที่เบราว์เซอร์ที่ไม่รองรับเบราว์เซอร์ลดลงอย่างสง่างาม ในฝั่ง PHP มีคลาสนี้ซึ่งดูเหมือนจะใช้กันอย่างแพร่หลายสำหรับเซิร์ฟเวอร์ PHP WS


1
คลาส phpwebsocket เป็นวิธีที่จะไปหากคุณต้องการใช้งานเซิร์ฟเวอร์ php websocket อย่างไรก็ตามสิ่งนี้ไม่เกี่ยวข้องกับคำถาม OP มีเซิร์ฟเวอร์ WS (socket.io) อยู่แล้วและขอวิธีสื่อสารกับแอปพลิเคชัน php
kasper Taeymans

72

หากคุณต้องการใช้ socket.io ร่วมกับ php นี่อาจเป็นคำตอบของคุณ!

เว็บไซต์โครงการ:

elephant.io

พวกเขายังอยู่ใน github:

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

Elephant.io มีไคลเอนต์ socket.io ที่เขียนด้วย PHP อย่างสมบูรณ์ซึ่งควรใช้งานได้ทุกที่ในโครงการของคุณ

เป็นไลบรารีที่เบาและใช้งานง่ายซึ่งมีจุดมุ่งหมายเพื่อนำฟังก์ชันการทำงานแบบเรียลไทม์มาสู่แอปพลิเคชัน PHP ผ่านทาง socket.io และ websockets สำหรับการดำเนินการที่ไม่สามารถทำได้ในจาวาสคริปต์แบบเต็ม

ตัวอย่างจากเว็บไซต์โครงการ (สื่อสารกับเซิร์ฟเวอร์ websocket ผ่าน php)

เซิร์ฟเวอร์ 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`';

เซิร์ฟเวอร์ซ็อกเก็ต 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);
  });
});

2
ฉันจะให้ +1 ที่นี่ แต่ดูเหมือนว่านี่ยังเป็นวิธีเล็กน้อยที่จะใช้งานได้ในสภาพแวดล้อมการใช้งานจริง
Beachhouse

17
ฉันเคยเห็นสิ่งนี้ แต่สิ่งหนึ่งที่ทำให้ฉันสับสน ไม่ใช่ประเด็นที่จะให้ PHP ติดตั้งเซิร์ฟเวอร์ sockets.io? และดูเหมือนว่า Elepant.io จะเป็นการใช้งาน PHP ของไคลเอนต์ sockets.io ซึ่งคุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ sockets.io อื่น ๆ ได้ (หมายความว่า elephant.io ไม่รับฟังการเชื่อมต่อจากไคลเอนต์ sockets.io ของคุณการเชื่อมต่อ ให้กับพวกเขาและให้บริการ)?
Pimp Trizkit

สิ่งที่ฉันมองหาน่าเสียดายที่การเชื่อมต่ออย่างต่อเนื่องอยู่ในช่วงเริ่มต้นของการพัฒนา
slezadav

8
สวัสดีทุกคน. จุดมุ่งหมายของ Elephant.io เป็นเพียงการเริ่มต้นเหตุการณ์จาก PHP ไปยังเซิร์ฟเวอร์ socket.io ไม่เปิดการเชื่อมต่อแบบถาวร แต่เพื่อให้สามารถเชื่อมต่อและส่งเหตุการณ์ / ข้อความได้อย่างรวดเร็ว เราใช้มันในการผลิตและทำงานได้อย่างมีเสน่ห์
guillaumepotier

3
ห้องสมุดนี้ไม่ได้รับการดูแลอีกต่อไปและมีปัญหาสำหรับเรา
Flion


15

หากคุณต้องการใช้ PHP เป็นแบ็กเอนด์สำหรับ socket.io นี่คือสิ่งที่ฉันพบ สองทางเลือกฝั่งเซิร์ฟเวอร์ socket.io php

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

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

รหัส Exmaple สำหรับที่เก็บแรกเช่นนี้

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);
  });
});

7

สำหรับ "การเชื่อมต่อที่มีอายุการใช้งานยาวนาน" ที่คุณกล่าวถึงคุณสามารถใช้ Ratchet สำหรับ PHP ได้ เป็นไลบรารีที่สร้างขึ้นโดยใช้ฟังก์ชัน Stream Socket ที่ PHP รองรับตั้งแต่ PHP 5

สำหรับฝั่งไคลเอ็นต์คุณต้องใช้ WebSocket ที่รองรับ HTML5 แทน Socket.io (เนื่องจากคุณทราบว่า socket.io ใช้งานได้กับ node.js เท่านั้น)

ในกรณีที่คุณยังต้องการใช้ Socket.io คุณสามารถลองวิธีนี้: - ค้นหาและรับ socket.io.js เพื่อให้ไคลเอนต์ใช้ - ทำงานกับ Ratchet เพื่อจำลองวิธีที่ socket.io ทำบนเซิร์ฟเวอร์

หวังว่านี่จะช่วยได้!


6

เอิ่มทำไมถึงอยากได้? ปล่อย PHP ไว้ที่แบ็กเอนด์และ NodeJS / Sockets เพื่อทำสิ่งที่ไม่ปิดกั้น

นี่คือสิ่งที่จะช่วยคุณเริ่มต้น: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

โดยส่วนตัวแล้วฉันทำงานแบบด่วนด้วยจุดสิ้นสุดที่รับฟังการโต้ตอบจาก PHP อย่างชัดเจน

ตัวอย่างเช่นหากฉันส่งอีเมลถึงผู้ใช้ฉันต้องการให้ socket.io แสดงการแจ้งเตือนแบบเรียลไทม์แก่ผู้ใช้

ต้องการการโต้ตอบจาก socket.io ถึง php คุณสามารถทำสิ่งนี้ได้:

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();  

อย่างจริงจัง PHP นั้นยอดเยี่ยมสำหรับการทำสิ่งต่างๆในฝั่งเซิร์ฟเวอร์และปล่อยให้เป็นไปตามการเชื่อมต่อที่ไม่มีในโดเมนนี้ในขณะนี้ ทำไมต้องทำโพลยาว ๆ เมื่อคุณมีเว็บซ็อกเก็ตหรือแฟลชซ็อกเก็ต


32
เนื่องจากพวกเราบางคนสามารถหาโฮสต์ราคาถูกที่จะให้คุณใช้ php และ mysql เท่านั้น
Lanbo

31
เนื่องจากพวกเราบางคนต้องทำงานกับเฟรมเวิร์กที่มีอยู่ซึ่งขึ้นอยู่กับ PHP ตัวอย่างเช่นเราพัฒนาและขายสคริปต์ PHP แต่ต้องการปรับปรุง IM โดยใช้ websockets เราไม่ต้องการเขียนทางเลือกทั้งหมดที่ socket.io นำไปใช้แล้ว แต่เราไม่ต้องการ NodeJS จากลูกค้าของเรา
Purefan

3
@PaulM: ฉันลองใช้ผู้ให้บริการ VPS <$ 10 เพียงไม่กี่รายและสิ่งเหล่านี้ทั้งหมดนั้นยอดเยี่ยมจริงๆ แต่ละอย่างช้ามากเมื่อมีบางอย่างเสียการสนับสนุนก็แย่มากในทางกลับกันในฟินแลนด์ไม่ใช่เรื่องยากที่จะได้รับเว็บโฮสติ้งคุณภาพดี (แต่ด้วยไฟล์ php / mysql / static เท่านั้น) ด้วยการสมัครสมาชิก adsl โดยไม่ต้องจ่ายเงินเพิ่ม . ดังนั้นไม่เลยความสามารถในการซื้อ VPS เส็งเคร็งในราคา $ 5 นั้นไม่ใช่วิธีแก้ปัญหาอย่างแน่นอน
Olli

4
สำหรับผู้ให้บริการ VPS <$ 10 สิ่งที่ดีเพียงอย่างเดียวที่ฉันพบคือ digitalocean.com แต่อันนั้นดีงาม
Aeolun

3
ฉันไม่เห็นด้วย ฉันคิดว่าคำตอบเช่นนี้มีความเกี่ยวข้องมาก มีคนบอกคุณว่า "คุณใช้ผิด" อาจมีค่ามากกว่าคนที่ช่วยคุณใช้ผิด
Rijk

6

ฉันรู้จักคนต่อสู้! แต่เมื่อไม่นานมานี้ฉันได้ทำงานร่วมกับ Workerman หากคุณยังไม่สะดุดกับ php framework นี้คุณควรตรวจสอบสิ่งนี้ให้ดีขึ้น!

Workerman เป็นเฟรมเวิร์ก PHP ที่ขับเคลื่อนด้วยเหตุการณ์แบบอะซิงโครนัสเพื่อสร้างแอปพลิเคชันเครือข่ายที่รวดเร็วและปรับขนาดได้อย่างง่ายดาย (ฉันเพิ่งคัดลอกและวางจากเว็บไซต์ของพวกเขาฮ่า ๆ ๆ ๆhttp://www.workerman.net/en/ )

วิธีง่ายๆในการอธิบายสิ่งนี้ก็คือเมื่อพูดถึงการเขียนโปรแกรมเว็บซ็อกเก็ตสิ่งที่คุณต้องมีจริงๆคือต้องมี 2 ไฟล์ในเซิร์ฟเวอร์หรือเซิร์ฟเวอร์ภายใน (ทุกที่ที่คุณทำงานอยู่)

  1. server.php (ซอร์สโค้ดซึ่งจะตอบสนองต่อคำขอทั้งหมดของลูกค้า)

  2. client.php / client.html (ซอร์สโค้ดซึ่งจะทำสิ่งที่ร้องขอ)

โดยพื้นฐานแล้วคุณต้องใส่รหัสบนเซิร์ฟเวอร์. phpก่อนและเริ่มเซิร์ฟเวอร์ โดยปกติเมื่อฉันใช้ windows ซึ่งเพิ่มการต่อสู้มากขึ้นฉันจึงเรียกใช้เซิร์ฟเวอร์ผ่านคำสั่งนี้ -> php server.php start

ถ้าคุณใช้ xampp นี่เป็นวิธีหนึ่งที่ทำได้ ไปที่ใดก็ได้ที่คุณต้องการใส่ไฟล์ของคุณ ในกรณีของเราเราจะใส่ไฟล์เข้าไป

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

C: /xampp/htdocs/websocket/client.php หรือ client.html

สมมติว่าคุณมีไฟล์เหล่านั้นอยู่แล้วในเซิร์ฟเวอร์ภายในของคุณ เปิด Git Bash หรือ Command Line หรือ Terminal หรือตามที่คุณใช้และดาวน์โหลดไลบรารี php ที่นี่

https://github.com/walkor/Workerman

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

ฉันมักจะดาวน์โหลดผ่านนักแต่งเพลงและโหลดไฟล์เหล่านั้นโดยอัตโนมัติในสคริปต์ php ของฉัน

และตรวจสอบอันนี้ด้วย นี่สำคัญจริงๆ! คุณต้องใช้ไลบรารีจาวาสคริปต์นี้เพื่อให้คุณclient.phpหรือ client.html สื่อสารกับserver.phpเมื่อคุณเรียกใช้

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

ฉันแค่คัดลอกและวางโฟลเดอร์ socket.io-client นั้นในระดับเดียวกับ server.php และ client.php ของฉัน

นี่คือซอร์สโค้ด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();

และนี่คือclient.phpหรือclient.html sourcecode

<!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>

อีกครั้งให้เปิดบรรทัดคำสั่งหรือ git bash หรือเทอร์มินัลที่คุณใส่ไฟล์ server.php ดังนั้นในกรณีของเรานั่นคือ C: / xampp / htdocs / websocket / และพิมพ์ในphp server.php startแล้วกด Enter

จากนั้นไปที่เบราว์เซอร์ของคุณแล้วพิมพ์ http: //localhost/websocket/client.phpเพื่อเยี่ยมชมเว็บไซต์ของคุณ จากนั้นพิมพ์อะไรก็ได้ในกล่องข้อความนั้นคุณจะเห็นเว็บซ็อกเก็ต php พื้นฐานในระหว่างการเดินทาง!

คุณต้องจำไว้ ในการเขียนโปรแกรมเว็บซ็อกเก็ตจำเป็นต้องมีเซิร์ฟเวอร์และไคลเอนต์ รันรหัสเซิร์ฟเวอร์ก่อนและเปิดรหัสไคลเอนต์ และคุณมีมัน! หวังว่านี่จะช่วยได้!


4

หากคุณต้องการใช้ PHP เป็นแบ็กเอนด์สำหรับ WebSockets ลิงก์เหล่านี้จะช่วยคุณได้:

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


1
ทำสิ่งนี้เพื่อให้คุณใช้ socket.io (พร้อมกับการขนส่งและเบราว์เซอร์ที่รองรับทั้งหมด) หรือว่าต้องใช้ Client ที่มากับ php-websocket?
Darren Cook

3

แล้วเรื่องนี้ล่ะ? PHPSocketio ?? เป็นทางเลือกฝั่งเซิร์ฟเวอร์ socket.io php ลูปเหตุการณ์ขึ้นอยู่กับส่วนขยายของเหตุการณ์ pecl แม้ว่าจะยังไม่ได้ลองด้วยตัวเองจนถึงตอนนี้


3

ตอนนี้เราอยู่ในปี 2018 และ hoola มีวิธีใช้ WS และ WAMPServer บน php มันเรียกว่าวงล้อ



0

มองใน libraryes นี้สำหรับ PHP http://phptrends.com/category/70 หรือใช้พื้นเมืองจาก PHP http://www.php.net/manual/en/book.sockets.php


0

ฉันกำลังมองหาวิธีง่ายๆในการรับ PHP เพื่อส่งข้อความ socket.io ไปยังลูกค้า

สิ่งนี้ไม่จำเป็นต้องใช้ไลบรารี PHP เพิ่มเติม - เพียงแค่ใช้ซ็อกเก็ต

แทนที่จะพยายามเชื่อมต่อกับอินเทอร์เฟซ websocket เหมือนโซลูชันอื่น ๆ อีกมากมายเพียงแค่เชื่อมต่อกับเซิร์ฟเวอร์ node.js และใช้.on('data')เพื่อรับข้อความ

จากนั้นsocket.ioสามารถส่งต่อไปยังลูกค้า

ตรวจจับการเชื่อมต่อจากเซิร์ฟเวอร์ PHP ของคุณใน Node.js ดังนี้:

//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
        });
    }
});

นี่คือรหัส php ที่เรียบง่ายอย่างไม่น่าเชื่อ - ฉันรวมไว้ในฟังก์ชัน - คุณอาจได้สิ่งที่ดีกว่า

โปรดทราบว่า8080เป็นพอร์ตไปยังเซิร์ฟเวอร์ Node.js ของฉันคุณอาจต้องการเปลี่ยนแปลง

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);
}

คุณสามารถใช้งานได้ดังนี้:

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

คุณยังสามารถส่งอาร์เรย์ที่แปลงเป็น json และส่งต่อไปยังไคลเอนต์ได้

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

นี่เป็นวิธีที่มีประโยชน์ในการ "วางใจ" ว่าลูกค้าของคุณได้รับข้อความที่ถูกต้องจากเซิร์ฟเวอร์

คุณยังสามารถส่งผ่าน PHP ไปพร้อมกับการอัปเดตฐานข้อมูลได้โดยไม่ต้องมีลูกค้าหลายร้อยรายสอบถามฐานข้อมูล

ฉันหวังว่าฉันจะพบสิ่งนี้เร็วกว่านี้ - หวังว่านี่จะช่วยได้! 😉


1
เป็นความคิดที่ดีฉันกำลังมองหาวิธีข้าม redis (ถ้าเป็นความคิดที่ดี)! s.remoteAddress;มีการพิมพ์ผิดในรหัสแรกอัฒภาคหลังจากที่เป็น อย่างไรก็ตามฉันไม่ได้ทำงาน ฉันได้รับการเชื่อมต่อในโหนดตรวจพบการเชื่อมต่อที่อยู่ระยะไกลถูกต้อง แต่s.on('data')ไม่เคยเกิดขึ้น แต่ไม่มีอะไรเกิดขึ้น ฉันก็พยายามs.on('msg')เหมือนกัน ฉันใช้โค้ด PHP ของคุณ ฉันใช้ https สำหรับเซิร์ฟเวอร์โหนด แต่มันไม่สำคัญใช่ไหม
Niclas

@Niclas เฮ้ขอโทษเกี่ยวกับการพิมพ์ผิด - ไม่อยากจะเชื่อเลยว่ามีมาตลอด เซิร์ฟเวอร์โหนดของคุณทำงานบนพอร์ต8080หรือไม่ ถ้าไม่คุณต้องเปลี่ยนพอร์ต ในกรณีนี้ให้ตรวจสอบข้อมูลRemote Addressที่ส่งคืน - ตรวจสอบให้แน่ใจว่าเป็นที่อยู่ลูปแบ็ค / โลคัลซึ่งอาจแตกต่างจากการตั้งค่าเซิร์ฟเวอร์ของคุณ สำหรับการทดสอบคุณสามารถลบบรรทัดif(s.remoteAddress == "::ffff:127.0.0.1")
user1274820

ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว! ฉันทำ console.log สำเร็จแล้วแม้แต่ที่อยู่ระยะไกลก็ถูกต้อง แต่ก็ไม่ได้เข้าสู่ส่วน s.on ('data') มีวิธีทดสอบข้อความที่ส่งไปหรือไม่? โปรดอ่านความคิดเห็นของฉันอีกครั้งเพื่อดูว่าฉันพลาดอะไรไปหรือไม่ ฉันอาจจะเริ่มเป็นคำถามใหม่ในการโพสต์โค้ด แต่ก็เหมือนกับของคุณทุกประการ
Niclas

ฉันเริ่มคำถามนี้เป็นคำถามใหม่เพื่อให้ง่ายต่อการพูดคุยในรายละเอียด: stackoverflow.com/questions/53689391/…
Niclas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.