2015-09-28 31 views
3

我使用PdoSessionHandler将用户的会话存储在数据库中以使用会话Symfony2服务器和棘轮服务器进行通信。锁定等待超时Symfony2棘轮与PdoSessionHandler

它连接OK,发送消息确定,但是当我在Symfony2应用程序中更改为其他页面或关闭会话时,它会调用onClose函数。然后应用程序被阻止,并返回以下错误:

SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction 500 Internal Server Error - PDOException


服务器看起来像:

$pdo = new PDO('mysql:host=localhost;dbname=XXXX', 'root', null); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$dbOptions = array(
    'db_table' => 'sessions', 
    'db_id_col' => 'sess_id', 
    'db_data_col' => 'sess_data', 
    'db_time_col' => 'sess_time', 
    'db_lifetime_col' => 'sess_lifetime',); 

$session = new PdoSessionHandler($pdo, $dbOptions); 
$myApp = new ServerSocket(); 

$loop = \React\EventLoop\Factory::create(); 
$server = new \React\Socket\Server($loop); 
$server->listen(8080, '0.0.0.0'); 

new IoServer(new HttpServer(new WsServer(new SessionProvider($myApp,$session))), $server); 
echo "server running \n"; 
$loop->run(); 

“MyApp的” 样子:

class ServerSocket implements MessageComponentInterface { 

protected $players; 
private $users; 

public function __construct() 
{ 
    $this->players = []; 
    $this->users = new \SplObjectStorage(); 
} 

function onOpen(ConnectionInterface $conn) 
{ 
    $this->users->attach($conn); 
    $this->players[$conn->Session->get('current_user_id')] = $conn; 
    print("new conection (". $conn->Session->get('current_user_id').")"); 
} 

function onClose(ConnectionInterface $conn) 
{ 
    $this->users->detach($conn); 
    unset($this->players[$conn->Session->get('current_user_id')]); 
    $conn->close(); 
} 

    function onMessage(ConnectionInterface $from, $msg) 
{ 
    $data = json_decode($msg); 
    $to = $data->command; 
    if (isset($this->players[$to])) { 
     $this->players[$to]->send($data->message); 
     echo $data->message; 
    } 
} 
} 

的脚本树枝页面是:

var conn = new WebSocket('ws://localhost:8080'); 
    conn.onopen = function(e) { 
     alert("Connection established!"); 
    }; 

    conn.onmessage = function(e) { 
     alert(e.data); 
    }; 

    function sendMessage(msg,user) { 
     conn.send(JSON.stringify({command: user, message: msg})); 
    }; 


    sendMessage("test",2); 

我能做些什么来避免锁定?

+0

我在这里有同样的问题。这似乎是由Symfony团队知道的:https://github.com/symfony/symfony/issues/4976 – Moonchild

回答

1

根据Symfony 2 blocked concurrency,禁用会话锁定已解决我的问题。

在你的情况,你应该尝试:

$dbOptions = array(
    'db_table'  => 'sessions', 
    'db_id_col'  => 'sess_id', 
    'db_data_col'  => 'sess_data', 
    'db_time_col'  => 'sess_time', 
    'db_lifetime_col' => 'sess_lifetime', 
    'lock_mode'  => 0 
); 
+0

完美! thans。现在它工作正常。 – Smarquina

+0

你的经验出错了吗? – Taurus

+0

你的回答实际上是否被低估?因为使用'new PDOSessionHandler($ con,['lock_mode'=> 0])'也解决了我的问题。 – Taurus