7

PHP Websocket サーバー ( https://github.com/lemmingzshadow/php-websocket/ ) があります。

ユーザーが接続したときに、セッション データを設定/取得したい。

問題は$_SESSION、クライアントのセッションの代わりに Websocket サーバーのセッションを取得するため、使用できないことです。

クライアントの SESSID を取得できました。

private function handshake($data) { 
    $this->log('Performing handshake');  
    if(preg_match("/PHPSESSID=(.*?)(?:;|\r\n)/", $data, $matches)){
        $sessid = $matches[1];
    }
    /* Do handshake */
}

しかし、その SESSID に関連するセッション データを取得する方法がわかりません。

4

1 に答える 1

5

解決したようです(ただし、さらにテストする必要があります):

private function handshake($data) { 
    $this->log('Performing handshake');
    if(preg_match("/PHPSESSID=(.*?)(?:;|\r\n)/", $data, $matches)){
        $this->sessID = $matches[1];
        session_id($this->sessID);
        @session_start();
        if(isset($_SESSION['userName'])){
            $this->userName = $_SESSION['userName'];
        }else{
            $_SESSION['userName'] = $this->userName;
        }
        session_write_close();
    }else{
        $this->log('No SESSID');    
        return false;
    }
    /* Do handshake */
}

セッション Cookie を有効にするには、クライアント ページ index.php で

<?php
session_start();
?>
<!DOCTYPE html>
<!-- Page's HTML -->

説明

まず、session_id次のように使用session_start()して、特定の SESSID に関連するセッションを取得します。

次に、 を使用@session_start()してセッションを開始できます。Websocket@サーバーが既に開始されているため、これを使用しないと次のように生成されます。

  • PHP 警告: session_start(): セッション Cookie を送信できません - ヘッダーは既に送信されています
  • PHP 警告: session_start(): セッション キャッシュ リミッターを送信できません - ヘッダーは既に送信されています

でやりたいことができるようになりました$_SESSION

最後にsession_write_close()、セッションを閉じるために使用します。次の理由で使用する必要があります。

  • session_idの前に呼び出す必要がありますsession_start()。セッションが閉じられていない場合、2 番目のクライアントが接続したときに、セッションが既に開いているため、機能しsession_idません。

  • セッションのロックを回避するため。@Svenが言ったように、セッションファイルにアクセスできる実行中のPHPのインスタンスは1つだけです。Websocket サーバーのスクリプトは長時間実行する必要があるため、一度セッションを開くと、閉じないと他のスクリプトでセッションを使用できません。

于 2013-08-09T18:13:29.797 に答える