1

これに基づいたphp websocketサーバーがあります。この Websocket サーバーは、パブリック Web サーバーとは異なる apache で実行されますが、同じ物理サーバー上で実行されるため、ユーザーデータを取得するにはデータベース接続が必要です。ユーザーデータは、ユーザーがログインしたときにデータベースでも更新される現在のセッション ID によって取得されます。ここで、websocket サーバーを実行すると完全に動作しますが、適切な時間 (タイムスパンとは言えません) の後、結果は空のままになります。 . データセットを確認しました。

クエリ文字列は最新であり、正しいセッション ID はデータベースにあり、目的の行を返す必要がありますが、結果は空のままです。プロセスを強制終了してこの websocket サーバーを実行すると、当面は機能しますが、しばらくすると結果が再び空になります。

これは私の websocketserver.php を簡略化したものです:

set_time_limit(0);
require 'class.PHPWebSocket.php';

$db1 = mysql_connect( 'localhost', 'dev', 'xxxxxxxx' );
mysql_select_db('cb_dev',$db1);

function wsOnMessage($clientID, $message, $messageLength, $binary) {
    global $Server;

    $sessionid = "/*just imagine a session id here*/";
    $result = mysql_query("SELECT username, id FROM users WHERE sessionid = '$sessionid'");
    $row = mysql_fetch_row($result);
}

function wsOnOpen($clientID) {
    //
}

function wsOnClose($clientID, $status) {
    //
}

$Server = new PHPWebSocket();
$Server->bind('message', 'wsOnMessage');
$Server->bind('open', 'wsOnOpen');
$Server->bind('close', 'wsOnClose');

$Server->wsStartServer('0.0.0.0', 9010);

注: 使用されたセッション ID は正しく提供されるため、これは問題ではありません。

4

2 に答える 2

3

Swooleは、お客様の要件に適した選択です。PHP でネイティブ websocket サーバーと async mysql をサポートし、ac 拡張機能を使用

WebSocket サーバーの例:

$ws = new swoole_websocket_server("0.0.0.0", 9502);

$ws->on('open', function ($ws, $request) {
    var_dump($request->fd, $request->get, $request->server);
    $ws->push($request->fd, "hello, welcome\n");
});

$ws->on('message', function ($ws, $frame) {
    echo "Message: {$frame->data}\n";
    $ws->push($frame->fd, "server: {$frame->data}");
});

$ws->on('close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
});

$ws->start();
于 2015-10-28T10:59:23.637 に答える