web-dev-qa-db-ja.com

Socket.ioでPHPを使用する

クライアント側でSockets.ioを使用して、サーバー上のPHPベースのアプリケーションと通信することは可能ですか? PHPは、コードを記述するこのような「長命の接続」方法もサポートしていますか?

Socket.ioで見つけたすべてのサンプルコードは、サーバー側のnode.jsのものであるように思われるため、そこでは何の助けもありません。

114
Yuvi

この質問に答えるのは少し遅れているかもしれませんが、私が見つけたのはここにあります。

ノードがphpより優れているかどうかについては議論したくありませんが、これはポイントではありません。

解決策は次のとおりです。PHP用のsocket.ioの実装が見つかりません。

ただし、 WebSockets を実装する方法がいくつかあります。 このjQueryプラグイン があります。これにより、サポートされていないブラウザーを適切に劣化させながらWebsocketを使用できます。 PHP側には このクラス があり、PHP WSサーバーで最も広く使用されているようです。

97

Socket.ioをphpと一緒に使用したい場合、これがあなたの答えかもしれません!

プロジェクトのウェブサイト:

elephant.io

githubにもあります:

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

Elephant.ioは、プロジェクトのあらゆる場所で使用できるPHPで完全に記述されたsocket.ioクライアントを提供します。

完全なjavascriptでは実行できなかったアクションのために、socket.ioおよびwebsocketsを介してPHPアプリケーションにリアルタイム機能を提供することを目的とした、軽量で使いやすいライブラリです。

プロジェクトWebサイトからの例(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`';

socket io server

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);
  });
});
66
kasper Taeymans

更新:2014年8月現在の socket.io v1. サイトにはPHPの例があります:- https://github.com/rase-/socket.io-php-emitter

19
Alvin K.

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

えー、なぜあなたはしたいの? 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はサーバー側の処理を行うのに最適であり、現在このドメインには存在しない接続を可能にします。 WebSocketやFlashSocketがあるのに、なぜ長いポーリングを行うのですか。

6
PaulM

あなたが言及した「長命の接続」については、PHP用のRatchetを使用できます。これは、PHPがPHP 5以降サポートしてきたStream Socket関数に基づいて構築されたライブラリです。

クライアント側では、Socket.ioの代わりにHTML5がサポートするWebSocketを使用する必要があります(socket.ioはnode.jsでのみ機能するため)。

まだSocket.ioを使用したい場合は、次の方法を試すことができます。

お役に立てれば!

6
Chung Xa

私は闘争男を知っています!しかし、私は最近、Workermanとほとんど一緒に働いていました。このphpフレームワークにつまずいていない場合は、これを確認してください。

Workermanは、高速でスケーラブルなネットワークアプリケーションを簡単に構築するための非同期イベント駆動PHPフレームワークです。 (私は彼らのウェブサイトからそれをコピーして貼り付けましたhahahah http://www.workerman.net/en/

これを簡単に説明すると、Webソケットプログラミングの際に必要なのは、サーバーまたはローカルサーバー(作業中の場所)に2つのファイルを置くことだけです。

  1. server.php(すべてのクライアントのリクエストに応答するソースコード)

  2. client.php/client.html(要求を行うソースコード)

したがって、基本的には、最初にコードを作成しserver.php、サーバーを起動します。通常、より多くの闘争を追加するウィンドウを使用しているため、このコマンドでサーバーを実行します->php server.php start

Xamppを使用している場合。これを行う1つの方法を次に示します。ファイルを置きたい場所に移動します。私たちの場合、ファイルを

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

私は通常composer経由でダウンロードし、phpスクリプトでこれらのファイルを自動ロードします。

これも確認してください。これは本当にimportantclient.phpまたはclient.htmlがserver.phpと通信するには、このjavascriptライブラリが必要です。 実行すると。

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 startEnterキーを押します。

次にブラウザに移動して、http://localhost/websocket/client.phpサイトにアクセスします。次に、そのテキストボックスに何かを入力すると、外出先で基本的なphp websocketが表示されます。

覚えておく必要があります。 Webソケットプログラミングでは、サーバーとクライアントだけが必要です。最初にサーバーコードを実行し、クライアントコードを開きます。そして、あなたはそれを持っています!お役に立てれば!

4
therealadrain

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

4
Chris Hanson

これはどう ? PHPSocketio ??これは、socket.io phpサーバー側の代替手段です。イベントループは、peclイベント拡張に基づいています。今まで自分で試したことはありませんが。

3
Sankalp Singha

私たちは現在2018年になりますが、PHPにWSとWAMPServerを実装する方法があります。 Ratchet と呼ばれています。

2
shamaseen

まだ試していませんが、 ReactPHP とこの socket component でこれを行うことができます。 Nodeに似ていますが、PHPにあります。

2
mpen

クライアントにsocket.ioメッセージを送信するためのPHPを取得するための非常に簡単な方法を探していました。

追加のPHPライブラリは必要ありません-ソケットを使用するだけです。

他の多くのソリューションのようにwebsocketインターフェースに接続しようとする代わりに、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
user1274820

このライブラリでphpを探してください http://phptrends.com/category/7 。または、php http://www.php.net/manual/en/book.sockets.php からネイティブを使用します。

0
Knase