Socket.ioでのPHPの使用


128

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

私がsocket.ioで見つけたすべてのサンプルコードは、サーバー側のnode.js用であるようです。


3
重複の可能性:PHPソースからのSocket.io
11

プッシャーだけを検討することもできます。私が使用する気の利いたPHPライブラリがあります。
Devin G Rhode

やあ、これを試してみてください- github.com/walkor/phpsocket.io
ジェーニャフリストバ

回答:


98

この質問への回答が遅れる可能性がありますが、こちらが見つかりました。

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

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

しかし、WebSocketを実装する方法はいくつかあります。あり、このjQueryのプラグイン優雅に非サポートのブラウザで分解しながら、あなたはWebSocketをを使用することができます。PHP側には、PHP WSサーバーで最も広く使用されているように見えるこのクラスがあります。


1
php websocketサーバーの実装が必要な場合は、phpwebsocketクラスが最適です。ただし、これは質問とは関係ありません。OPにはすでにWSサーバー(socket.io)が実装されており、phpアプリケーションと通信する方法を求めています。
kasper Taeymans 2013

72

あなたがphpと一緒にsocket.ioを使いたいなら、これはあなたの答えかもしれません!

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

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`';

ソケット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を差し上げますが、本番環境で使用できるようになるにはまだ少し時間がかかるようです。
ビーチハウス

17
私はこれを見たことがありますが、混乱したことが1つあります。PHPにsockets.ioサーバーを実装させることがここでのポイントではありませんか?そして代わりに、Elepant.ioは、他のsockets.ioサーバーに接続できるsockets.ioクライアントのPHP実装のようです(つまり、elephant.ioは、sockets.ioクライアントからの接続をリッスンしておらず、接続していますそれらにそれらを整備する)?
Pimp Trizkit

私が探していたのは、永続的な接続が開発の初期段階にあることです。
slezadav 2013年

8
こんにちは、みんな。Elephant.ioの目的は、PHPからsocket.ioサーバーにイベントを発生させることです。持続的なつながりを開かないこと。しかし、すばやく接続してイベント/メッセージを送信できるようにするため。私たちはそれを生産に使用し、それは魅力のように機能します。
guillaumepotier 2013年

3
このライブラリはもうメンテナンスされておらず、問題がいくつかあります
Flion


14

本当にPHPをsocket.ioのバックエンドとして使用したい場合は、ここで私が見つけたものです。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のラチェットを使用できます。これは、PHP 5以降にPHPがサポートしているストリームソケット関数に基づいて構築されたライブラリです。

クライアント側では、Socket.ioの代わりにHTML5がサポートするWebSocketを使用する必要があります(ご存知のとおり、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はサーバー側の処理に最適であり、現在このドメインには配置されていない接続を使用できます。WebSocketまたはFlashSocketがある場合に、なぜロングポーリングを行うのですか?


32
私たちの一部は、phpとmysqlの使用のみを許可する安価なホストしか入手できないためです。
Lanbo、2011年

31
私たちの何人かは、PHPに依存する既存のフレームワークを使用しなければならないからです。たとえば、PHPスクリプトを開発して販売していますが、websocketを使用してIMを改善したいので、socket.ioがすでに実装しているすべてのフォールバックを記述したくありませんが、クライアントからNodeJSを要求することはできません。
Purefan 2011年

3
@PaulM:私はいくつかの<$ 10 VPSプロバイダーを試しました、そしてそれらすべては本当にひどいです。それぞれが非常に遅く、何かが壊れていたり、サポートがひどいものでした。一方、フィンランドでは、adslサブスクリプションで追加料金を支払うことなく、まともな品質のWebホスティング(php / mysql / staticファイルのみ)を取得することは珍しくありません。 。だから、いや、安っぽいVPSを5ドルで購入できることは、間違いなく解決策ではありません。
Olli 2012

4
10ドル未満のVPSプロバイダーの場合、これまでに見つけた唯一の適切なプロバイダーはdigitalocean.comです。しかし、それはかなり良いです。
Aeolun 2013年

3
同意しません。このような答えは非常に関連があると思います。「あなたはそれを間違って使っている」とあなたに言う人は、あなたがそれを間違って使うのを助ける誰かよりもはるかに価値があるかもしれません。
Rijk 2013年

6

私は闘争者を知っています!しかし、私は最近、Workermanとかなり連携していた。このphpフレームワークに出くわしていない場合は、これをチェックしてください。

Workermanは、高速でスケーラブルなネットワークアプリケーションを簡単に構築するための非同期イベント駆動型PHPフレームワークです。(私は彼らのウェブサイトからそれをコピーして貼り付けたところですははは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スクリプトに自動ロードします。

そして、これもチェックしてください。これは本当に重要です!実行時にclient.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>

もう一度、コマンドライン、git bash、またはserver.phpファイルを配置したターミナルを開きます。したがって、私たちの場合、それはC:/ xampp / htdocs / websocket /であり、php server.php startと入力してEnter キーを押します。

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

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


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(およびサポートされているすべてのトランスポートとブラウザ)を使用できます。または、php-websocketに付属のクライアントを使用する必要がありますか?
ダレンクック

3

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





0

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

これは追加の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
いいアイデアです、私はredisをスキップする方法を探していました(それが良いアイデアである場合)!最初のコードにはタイプミスがあり、セミコロンの後にありs.remoteAddress;ます。しかし、私はそれを動作させていません。ノードで接続を取得し、接続を検出します。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')セクションに入らないだけです。送信されたメッセージをテストする方法はありますか?コメントを読み直して、何かを見逃していないか確認してください。私はこれをコードを投稿するための新しい質問として開始するかもしれませんが、それはあなたの質問とほとんど同じです。
ニクラス

私はそれが簡単に詳細に議論するために行うために、新たな質問としてこれを開始しました:stackoverflow.com/questions/53689391/...
ニクラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.