Socket.io와 함께 PHP 사용


128

클라이언트 측에서 Sockets.io를 사용하고 서버에서 PHP 기반 응용 프로그램과 통신 할 수 있습니까? PHP는 코드를 작성하는 '장기 연결'방식을 지원합니까?

socket.io에 대해 찾은 모든 샘플 코드는 서버 측의 node.js에 대한 것이므로 도움이되지 않습니다.


3
가능한 중복 : PHP 소스의
Socket.io

푸셔 만 고려할 수도 있습니다. 사용할 멋진 PHP 라이브러리가 있습니다.
Devin G Rhode

답변:


98

이 질문에 대한 답변이 다소 늦을 수 있지만 여기에 내가 찾은 내용이 있습니다.

노드가 PHP보다 낫다는 사실에 대해서는 토론하고 싶지 않습니다. 이점이 아닙니다.

해결책은 : PHP 용 socket.io 구현을 찾지 못했습니다.

그러나 WebSocket 을 구현하는 몇 가지 방법이 있습니다 . 이 jQuery 플러그인 은 지원되지 않는 브라우저에 대해 정상적으로 성능을 저하시키면서 Websocket을 사용할 수 있도록합니다. PHP 측에는 PHP WS 서버에 가장 널리 사용되는 것으로 보이는 이 클래스 가 있습니다.


1
PHP 웹 소켓 서버 구현을 원한다면 phpwebsocket 클래스가 실제로 갈 길입니다. 그러나 이것은 질문과 관련이 없습니다. OP에는 이미 WS 서버 (socket.io)가 구현되어 있으며 PHP 응용 프로그램과 통신하는 방법을 요청했습니다.
kasper Taeymans

72

php와 함께 socket.io를 사용하려면 이것이 당신의 대답 일 수 있습니다!

프로젝트 웹 사이트 :

elephant.io

그들은 또한 github에 있습니다 :

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

Elephant.io는 프로젝트의 어느 곳에서나 사용할 수있는 PHP로 완전히 작성된 socket.io 클라이언트를 제공합니다.

전체 자바 스크립트에서 수행 할 수없는 작업을 위해 socket.io 및 웹 소켓을 통해 PHP 응용 프로그램에 일부 실시간 기능을 제공하는 것을 목표로하는 가볍고 사용하기 쉬운 라이브러리입니다.

프로젝트 웹 사이트의 예 (php를 통해 websocket 서버와 통신)

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는 다른 sockets.io 서버에 연결할 수있는 sockets.io 클라이언트의 PHP 구현 인 것 같습니다 (즉, elephant.io는 sockets.io 클라이언트의 연결을 수신하지 않습니다. 그들에게 서비스를 제공)?
Pimp Trizkit

내가 찾던 것은 지속적인 연결이 개발 초기 단계에 있다는 것을 유감스럽게 생각합니다.
slezadav

8
모두 안녕 Elephant.io의 목표는 PHP에서 socket.io 서버로 이벤트를 발생시키는 것입니다. 지속적인 연결을 열지 마십시오. 그러나 이벤트 / 메시지를 빠르게 연결하고 보낼 수 있습니다. 우리는 생산에 사용하며 매력처럼 작동합니다.
guillaumepotier

3
이 라이브러리는 더 이상 유지하고 우리를 위해 몇 가지 문제가되지 않는다
Flion


14

socket.io의 백엔드로 PHP를 실제로 사용하려면 여기에서 찾은 것이 있습니다. 2 개의 socket.io PHP 서버 측 대안.

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

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

첫 번째 저장소에 대한 예제 코드는 이와 같습니다.

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

언급 한 '장기 연결'의 경우 PHP 용 Ratchet을 사용할 수 있습니다. PHP 5부터 PHP가 지원 한 Stream Socket 함수를 기반으로 구축 된 라이브러리입니다.

클라이언트 측의 경우 Socket.io 대신 HTML5가 지원하는 WebSocket을 사용해야합니다 (소켓을 알고 있기 때문에 socket.io는 node.js에서만 작동 함).

여전히 Socket.io를 사용하려는 경우 다음과 같은 방법으로 시도 할 수 있습니다.

도움이 되었기를 바랍니다!


6

음, 왜 하시겠습니까? 백엔드와 NodeJS / Socket에 PHP를 남겨두고 비 차단 작업을 수행하십시오.

시작하는 방법은 다음과 같습니다. 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을 개선하고 싶다면 socket.io가 이미 구현 한 모든 폴백을 작성하고 싶지 않지만 클라이언트에서 NodeJS를 요구할 수는 없습니다.
Purefan

3
@PaulM : 10 달러 미만의 VPS 제공 업체를 거의 사용하지 않았으며 모두 정말 짜증났습니다. 무언가가 부러 졌거나 지원이 끔찍한 경우 각각은 매우 느 렸습니다. 반면에 핀란드에서는 별도의 비용을 지불하지 않고 adl 구독으로 양질의 웹 호스팅 (하지만 PHP / MySQL / 정적 파일 만 해당)을 얻는 것이 드문 일이 아닙니다 . 따라서 5 달러에 엉터리 VPS를 구입할 수 있다는 것은 해결책이 아닙니다.
Olli

4
<$ 10 VPS 제공 업체의 경우 지금까지 내가 찾은 점은 digitalocean.com뿐입니다. 그러나 그것은 꽤 좋습니다.
Aeolun

3
동의하지 않습니다. 나는 이와 같은 대답이 매우 관련이 있다고 생각합니다. "잘못 사용하고있다"고 말하는 사람은 잘못 사용하도록 도와주는 사람보다 훨씬 더 가치가있을 수 있습니다.
Rijk

6

나는 투쟁 남자를 안다! 그러나 최근에는 Workerman과 거의 일했습니다. 이 PHP 프레임 워크를 우연히 발견하지 않은 경우이를 확인하는 것이 좋습니다!

Workerman은 빠르고 확장 가능한 네트워크 응용 프로그램을 쉽게 구축 할 수있는 비동기 이벤트 중심 PHP 프레임 워크입니다. (방금 웹 사이트 hahahah http://www.workerman.net/en/ 에서 복사하여 붙여 넣었습니다 . )

이것을 설명하는 쉬운 방법은 웹 소켓 프로그래밍과 관련하여 실제로 필요한 것은 서버 또는 로컬 서버 (작업하는 곳마다)에 2 개의 파일을 두는 것입니다.

  1. server.php (모든 클라이언트 요청에 응답 할 소스 코드)

  2. client.php / client.html (요청하는 것들을 수행 할 소스 코드)

따라서 기본적으로 server.php 의 코드를 먼저 작성 하고 서버를 시작하십시오. 일반적으로 더 많은 어려움을 겪는 창을 사용함에 따라이 명령을 통해 서버를 실행합니다-> php server.php start

xampp를 사용한다면 좋습니다. 한 가지 방법이 있습니다. 파일을 넣고 싶은 곳으로 이동하십시오. 우리의 경우, 우리는 파일을 넣을 것입니다

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

C : /xampp/htdocs/websocket/client.php 또는 client.html

로컬 서버에 해당 파일이 있다고 가정합니다. Git Bash, 커맨드 라인 또는 터미널을 열거 나 여기에서 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

방금 내 server.php 및 client.php와 동일한 수준에서 socket.io-client 폴더를 복사하여 붙여 넣었습니다.

다음은 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 소스 코드가 있습니다

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

다시 한 번, server.php 파일을 넣은 명령 행 또는 git bash 또는 터미널을여십시오. 따라서 우리의 경우 C : / xampp / htdocs / websocket /이며 php server.php start에 입력하고 Enter 키를 누릅니다.

그런 다음 브라우저로 이동하여 http : //localhost/websocket/client.php 를 입력 하여 사이트를 방문하십시오. 그런 다음 해당 텍스트 상자에 아무것도 입력하지 않으면 이동 중에 기본 PHP 웹 소켓이 표시됩니다!

당신은 단지 기억해야합니다. 웹 소켓 프로그래밍에서는 서버와 클라이언트 만 있으면됩니다. 서버 코드를 먼저 실행하고 클라이언트 코드를여십시오. 그리고 당신은 그것을 가지고 있습니다! 도움이 되었기를 바랍니다!


4

1
이를 통해 socket.io (지원되는 모든 전송 및 브라우저)를 사용할 수 있습니다. 아니면 php-websocket과 함께 제공되는 클라이언트를 사용해야합니까?
대런 쿡

3

이건 어때요 ? PHPSocketio ?? socket.io PHP 서버 측 대안입니다. 이벤트 루프는 pecl 이벤트 확장을 기반으로합니다. 지금까지 직접 시도하지는 않았지만.


3

우리는 지금 2018과 훌라에 있으며, PHP에서 WS와 WAMPServer를 구현하는 방법이 있습니다. 라 chet 이라고 합니다.




0

PHP가 socket.io 메시지를 클라이언트에게 보내도록하는 간단한 방법을 찾고있었습니다.

추가 PHP 라이브러리가 필요하지 않으며 소켓 만 사용합니다.

다른 많은 솔루션과 마찬가지로 웹 소켓 인터페이스에 연결하는 대신 node.js 서버에 연결 .on('data')하고 메시지를받는 데 사용 하십시오.

그런 다음 socket.io클라이언트에게 전달할 수 있습니다.

Node.js에서 PHP 서버와의 연결을 다음과 같이 감지하십시오.

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

빠른 답변 감사합니다! 나는 remote.dress가 옳았지만 s.on ( 'data') 섹션에 들어 가지 않았습니다. 어떤 메시지가 전송되었는지 테스트하는 방법이 있습니까? 내 의견을 다시 읽고 뭔가 빠졌는지 확인하십시오. 나는 이것을 코드를 게시하는 새로운 질문으로 시작할 수 있지만 그것은 거의 당신의 것과 같습니다.
Niclas

나는 이것을 더 쉽게 논의하기 위해 새로운 질문으로 시작했다 : stackoverflow.com/questions/53689391/…
Niclas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.