Sử dụng PHP với Socket.io


128

Có thể sử dụng Sockets.io ở phía máy khách và liên lạc với ứng dụng dựa trên PHP trên máy chủ không? PHP thậm chí có hỗ trợ cách viết mã 'kết nối lâu dài' như vậy không?

Tất cả các mã mẫu tôi tìm thấy cho socket.io dường như là dành cho node.js ở phía máy chủ, vì vậy không có trợ giúp nào ở đó.


3
Bản sao có thể có: Socket.io từ nguồn php
hakre

Bạn có thể muốn xem xét chỉ cần đẩy. Nó có một thư viện PHP tiện lợi mà tôi sẽ sử dụng.
Devin G Rhode

xin chào, hãy thử cái này - github.com/walkor/phpsocket.io
Zhenya Hristova

Câu trả lời:


98

Có thể hơi muộn để câu hỏi này được trả lời, nhưng đây là những gì tôi tìm thấy.

Tôi không muốn tranh luận về thực tế rằng các nút có làm điều đó tốt hơn php hay không, đây không phải là vấn đề.

Giải pháp là: Tôi chưa tìm thấy bất kỳ triển khai nào của socket.io cho PHP.

Nhưng có một số cách để thực hiện WebSockets . Có plugin jQuery này cho phép bạn sử dụng Websockets trong khi xuống cấp một cách duyên dáng cho các trình duyệt không hỗ trợ. Về phía PHP, có lớp này dường như được sử dụng rộng rãi nhất cho các máy chủ WS của PHP.


1
lớp phpwebsocket thực sự là con đường để đi nếu bạn muốn triển khai máy chủ web php. Tuy nhiên điều này không liên quan đến câu hỏi. OP đã triển khai máy chủ WS (socket.io) và yêu cầu các cách để giao tiếp với ứng dụng php.
kasper Taeymans

72

Nếu bạn muốn sử dụng socket.io cùng với php thì đây có thể là câu trả lời của bạn!

trang web của dự án:

voi.io

họ cũng ở trên github:

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

Elephant.io cung cấp một máy khách socket.io được viết hoàn toàn bằng PHP nên có thể sử dụng ở mọi nơi trong dự án của bạn.

Đây là một thư viện nhẹ và dễ sử dụng nhằm mục đích mang lại một số chức năng thời gian thực cho ứng dụng PHP thông qua socket.io và websockets cho các hành động không thể thực hiện trong javascript đầy đủ.

ví dụ từ trang web của dự án (giao tiếp với máy chủ websocket thông qua php)

Máy chủ 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`';

ổ cắm máy chủ 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
Tôi sẽ cho bạn +1 ở đây, nhưng có vẻ như đây vẫn là một cách nhỏ để có thể sử dụng được trong môi trường sản xuất.
Beachhouse

17
Tôi đã nhìn thấy cái này, nhưng một điều làm tôi bối rối. Không phải vấn đề ở đây là để PHP triển khai máy chủ sockets.io sao? và, thay vào đó, Elepant.io dường như là một triển khai PHP của máy khách sockets.io mà bạn có thể kết nối với một số máy chủ sockets.io khác (có nghĩa là, voi.io không lắng nghe các kết nối từ các máy khách sockets.io của bạn, kết nối cho họ và phục vụ họ)?
Pimp Trizkit

Chỉ là những gì tôi tìm kiếm, đáng tiếc rằng sự kết nối liên tục đang ở giai đoạn đầu phát triển.
slezadav

8
Chào mọi người. Mục tiêu của Elephant.io chỉ là bắn các sự kiện từ PHP đến máy chủ socket.io. Không để mở một liên kết dai dẳng. Nhưng để có thể nhanh chóng kết nối và gửi các sự kiện / tin nhắn. Chúng tôi sử dụng nó trong sản xuất và nó hoạt động như một sự quyến rũ.
guillaumepotier

3
thư viện này không còn được duy trì nữa và có một số vấn đề đối với chúng tôi
Flion


14

Nếu bạn thực sự muốn sử dụng PHP làm phụ trợ cho socket.io, đây là những gì tôi tìm thấy. Hai bên máy chủ php.io php thay thế.

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

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

Mã exmaple cho kho lưu trữ đầu tiên như thế này.

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

Đối với 'kết nối lâu dài' mà bạn đã đề cập, bạn có thể sử dụng Ratchet cho PHP. Đó là một thư viện được xây dựng dựa trên các hàm Stream socket mà PHP đã hỗ trợ kể từ PHP 5.

Đối với phía máy khách, bạn cần sử dụng WebSocket mà HTML5 hỗ trợ thay vì Socket.io (vì bạn biết, socket.io chỉ hoạt động với node.js).

Trong trường hợp bạn vẫn muốn sử dụng Socket.io, bạn có thể thử theo cách này: - find & get socket.io.js để khách hàng sử dụng - làm việc với Ratchet để mô phỏng cách socket.io làm trên máy chủ

Hi vọng điêu nay co ich!


6

Erm, tại sao bạn muốn? Để lại PHP trên phần phụ trợ và NodeJS / Sockets để thực hiện công việc không chặn của nó.

Đây là một cái gì đó giúp bạn bắt đầu: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

Cá nhân tôi có thể chạy nhanh với một điểm cuối đang lắng nghe rõ ràng để tương tác từ PHP.

Ví dụ: nếu tôi đã gửi email cho người dùng, tôi muốn socket.io hiển thị thông báo theo thời gian thực cho người dùng.

Muốn tương tác từ socket.io đến php, bạn chỉ có thể làm một cái gì đó như thế này:

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

Nghiêm túc mà nói, PHP là công cụ tuyệt vời để thực hiện các công cụ phía máy chủ và cho phép nó với các kết nối mà hiện tại nó không có chỗ trong miền này. Tại sao làm bất cứ điều gì bỏ phiếu dài khi bạn có websockets hoặc flashsockets.


32
Bởi vì một số người trong chúng ta chỉ có thể có được một máy chủ giá rẻ sẽ chỉ cho phép bạn sử dụng php và mysql.
Lanbo

31
Bởi vì một số người trong chúng ta phải làm việc với các khung công tác hiện có phụ thuộc vào PHP. Ví dụ: chúng tôi phát triển và bán tập lệnh PHP, nhưng muốn cải thiện IM bằng cách sử dụng websockets, chúng tôi không muốn viết tất cả các dự phòng mà socket.io đã triển khai nhưng chúng tôi không thể yêu cầu NodeJS từ khách hàng của chúng tôi.
Purefan

3
@PaulM: Tôi đã thử vài nhà cung cấp VPS <$ 10 và tất cả những nhà cung cấp thực sự hấp dẫn. Mỗi thứ đều rất chậm, khi một cái gì đó bị hỏng, sự hỗ trợ là khủng khiếp, v.v. Mặt khác, ở Phần Lan, không hiếm khi có được lưu trữ web chất lượng tốt (nhưng chỉ với các tệp php / mysql / tĩnh) với đăng ký adsl, mà không phải trả thêm tiền . Vì vậy, không, có thể mua VPS crappy với giá 5 đô la chắc chắn không phải là một giải pháp.
Olli

4
Đối với các nhà cung cấp VPS <$ 10, người duy nhất tôi tìm thấy cho đến nay là digitalocean.com. Nhưng cái đó là khá tốt.
Aeolun

3
Tôi không đồng ý. Tôi nghĩ rằng một câu trả lời như thế này là rất phù hợp. Ai đó nói với bạn rằng "bạn đang sử dụng sai" có thể đáng giá hơn nhiều so với ai đó giúp bạn sử dụng sai.
Rijk

6

Tôi biết người đàn ông đấu tranh! Nhưng gần đây tôi đã làm việc khá nhiều với Workerman. Nếu bạn không vấp phải khung php này thì tốt hơn bạn nên kiểm tra nó!

Chà, Workerman là một khung công tác PHP điều khiển không đồng bộ để dễ dàng xây dựng các ứng dụng mạng nhanh, có thể mở rộng. (Tôi vừa sao chép và dán nó từ trang web của họ hahahah http://www.workerman.net/en/ )

Cách dễ dàng để giải thích điều này là khi nói đến lập trình ổ cắm web, tất cả những gì bạn thực sự cần có là có 2 tệp trong máy chủ hoặc máy chủ cục bộ (bất cứ nơi nào bạn đang làm việc).

  1. server.php (mã nguồn sẽ đáp ứng tất cả yêu cầu của khách hàng)

  2. client.php / client.html (mã nguồn sẽ thực hiện các yêu cầu)

Vì vậy, về cơ bản, bạn phải mã trước tiên trên server.php của bạn và khởi động máy chủ. Thông thường, khi tôi đang sử dụng các cửa sổ làm tăng thêm sự vật lộn, tôi chạy máy chủ thông qua lệnh này -> php server.php bắt đầu

Vâng nếu bạn đang sử dụng xampp. Đây là một cách để làm điều đó. Đi đến bất cứ nơi nào bạn muốn đặt các tập tin của bạn. Trong trường hợp của chúng tôi, chúng tôi sẽ đưa các tập tin vào

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

C: /xampp/htdocs/websocket/client.php hoặc client.html

Giả sử rằng bạn đã có những tệp đó trong máy chủ cục bộ của mình. Mở Git Bash hoặc Command Line hoặc Terminal của bạn hoặc bất cứ điều gì bạn đang sử dụng và tải xuống các thư viện php tại đây.

https://github.com/walkor/Workerman

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

Tôi thường tải nó qua trình soạn thảo và chỉ tự động tải các tệp đó trong tập lệnh php của mình.

Và cũng kiểm tra cái này Điều này thực sự quan trọng ! Bạn cần libary javascript này để cho bạn client.php hoặc client.html để giao tiếp với server.php khi bạn chạy nó.

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

Tôi chỉ sao chép và dán thư mục socket.io-client đó ở cùng cấp độ với server.php và client.php của tôi

Đây là server.php sourcecode

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

Và đây là client.php hoặc 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>

Một lần nữa, mở dòng lệnh của bạn hoặc git bash hoặc thiết bị đầu cuối nơi bạn đặt tệp server.php của mình. Vì vậy, trong trường hợp của chúng tôi, đó là C: / xampp / htdocs / websocket / và gõ vào php server.php bắt đầu và nhấn enter.

Sau đó, truy cập trình duyệt của bạn và nhập http: //localhost/websocket/client.php để truy cập trang web của bạn. Sau đó, chỉ cần gõ bất cứ điều gì vào hộp văn bản đó và bạn sẽ thấy một websocket php cơ bản trên đường đi!

Bạn chỉ cần nhớ. Trong lập trình ổ cắm web, nó chỉ cần một máy chủ và máy khách. Chạy mã máy chủ trước và mở mã máy khách. Và bạn có nó rồi đấy! Hi vọng điêu nay co ich!


4

Nếu bạn thực sự muốn sử dụng PHP làm phụ trợ cho WebSockets, các liên kết này có thể giúp bạn tiếp tục:

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

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


1
Làm những điều này cho phép bạn sử dụng socket.io (với tất cả các trình duyệt và vận chuyển được hỗ trợ của nó). Hay bạn phải sử dụng ứng dụng khách đi kèm với php-websocket?
Darren Cook

3

Còn cái này thì sao ? PHPSocketio ?? Nó là một thay thế phía máy chủ php.io php. Vòng lặp sự kiện được dựa trên phần mở rộng sự kiện pecl. Mặc dù cho đến giờ vẫn chưa thử.


3

Chúng tôi hiện đang ở năm 2018 và hoola, có một cách để triển khai WS và WAMPServer trên php. Nó được gọi là Ratchet .




0

Tôi đang tìm kiếm một cách thực sự đơn giản để khiến PHP gửi tin nhắn socket.io cho khách hàng.

Điều này không yêu cầu bất kỳ thư viện PHP bổ sung nào - nó chỉ sử dụng các socket.

Thay vì cố gắng kết nối với giao diện websocket như nhiều giải pháp khác, chỉ cần kết nối với máy chủ node.js và sử dụng .on('data')để nhận tin nhắn.

Sau đó, socket.iocó thể chuyển tiếp nó cho khách hàng.

Phát hiện kết nối từ máy chủ PHP của bạn trong Node.js như thế này:

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

Đây là mã php cực kỳ đơn giản - Tôi đã gói nó trong một hàm - bạn có thể tìm ra thứ gì đó tốt hơn.

Lưu ý rằng đó 8080là cổng tới máy chủ Node.js của tôi - bạn có thể muốn thay đổi.

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

Bạn có thể sử dụng nó như thế này:

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

Bạn cũng có thể gửi các mảng được chuyển đổi thành json và chuyển cho khách hàng.

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

Đây là một cách hữu ích để "tin tưởng" rằng khách hàng của bạn đang nhận được tin nhắn hợp pháp từ máy chủ.

Bạn cũng có thể có PHP vượt qua các bản cập nhật cơ sở dữ liệu mà không cần hàng trăm máy khách truy vấn cơ sở dữ liệu.

Tôi ước tôi đã tìm thấy điều này sớm hơn - hy vọng điều này sẽ giúp! 😉


1
Ý tưởng hay, tôi đang tìm cách bỏ qua redis (nếu đó là một ý tưởng hay)! Có một lỗi đánh máy trong mã đầu tiên, một dấu chấm phẩy sau s.remoteAddress;. Tuy nhiên, tôi không làm cho nó hoạt động. Tôi nhận được kết nối trong nút, nó phát hiện kết nối, điều khiển từ xa là chính xác, nhưng s.on('data')không bao giờ xảy ra, nhưng không có gì xảy ra. Tôi cũng đã cố gắng s.on('msg'). Tôi đang sử dụng mã PHP chính xác của bạn. Tôi đang sử dụng https, cho máy chủ nút, nhưng điều đó không quan trọng?
Niclas

@Niclas hey xin lỗi về lỗi đánh máy - không thể tin rằng có tất cả cùng. Là máy chủ nút của bạn đang chạy trên cổng 8080? Nếu không, bạn cần thay đổi cổng. Nếu vậy, hãy kiểm tra cái Remote Addressđược trả lại - đảm bảo đó là địa chỉ loopback / local - nó có thể khác với thiết lập máy chủ của bạn. Để kiểm tra, bạn có thể xóa dòngif(s.remoteAddress == "::ffff:127.0.0.1")
user1274820

Cảm ơn đã trả lời nhanh chóng! Tôi đã thực hiện thành công console.log tất cả các cách, ngay cả phần điều khiển từ xa cũng đúng, nó chỉ không nhập phần s.on ('data'). Có cách nào để kiểm tra tin nhắn đã được gửi không? Vui lòng đọc lại bình luận của tôi để xem nếu tôi bỏ lỡ điều gì. Tôi có thể bắt đầu câu hỏi này như một câu hỏi mới để đăng mã nhưng nó gần như chính xác như của bạn.
Niclas

Tôi đã bắt đầu câu hỏi này như một câu hỏi mới để dễ dàng thảo luận chi tiết hơn: stackoverflow.com/questions/53689391/ Lời
Niclas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.