我有一个基于this one的php websocket服务器。这个websocket服务器运行在与公共but服务器不同的apache上,但运行在相同的物理服务器上,因此我需要一个数据库连接来检索用户数据。用户数据由当前会话id获取,当用户登录时,该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是正确的,所以这不是问题所在。
发布于 2015-10-28 18:59:24
对于您的需求,Swoole是更好的选择。它支持原生websocket服务器和PHP中异步mysql,扩展名为c
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();发布于 2021-04-08 22:13:45
这是因为您的$sessionid已过期。需要设置更高的超时时间:
// 1 hour
ini_set('session.gc_maxlifetime', 3600);
session_set_cookie_params(3600);https://stackoverflow.com/questions/14210234
复制相似问题