2013-01-08 122 views
1

我有一個基於this one的php websocket服務器。這個websocket服務器運行在與公共web服務器不同的apache上,但在相同的物理服務器上運行,所以我需要一個數據庫連接來檢索userdata。用戶數據由當前會話ID獲取,當用戶登錄時,該數據也會在數據庫中更新。現在,如果我運行我的websocket服務器,它的工作原理是完美的,但經過一段合適的時間(不能說時間跨度),結果保持空。我檢查了數據集。PHP websocket服務器和mysql連接

查詢字符串是最新的,正確的會話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是正確投放,因此這不是問題。

+0

你可以張貼在更新會話ID的用戶loggs時的代碼? – hek2mgl

回答

-1

不幸的是,PHP並不適用於websockets,我擔心如果你嘗試用PHP實現它們,你會遇到很多麻煩。

我建議像node.js

有關PHP和WebSockets的更多信息,請參閱this related question

+0

在查詢PHP-WebSocket的情況下,庫/ packge「WorkerMan」和「Swoole」都是web套接字的領導者,我注意到Swoole涵蓋了所有功能。 –

1

Swoole是您的要求是更好的選擇。 它支持原生的WebSocket服務器&異步的MySQL在PHP中,有一個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(); 
+0

是的,它似乎也很強大,並有很好的選擇。 –

相關問題