解決したようです(ただし、さらにテストする必要があります):
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 サーバーのスクリプトは長時間実行する必要があるため、一度セッションを開くと、閉じないと他のスクリプトでセッションを使用できません。