1

EDIT:4私は行って、通常のセッションハンドラーでこれを試しましたが、同じ問題がOSエラーである可能性がありますか?

session_start();
$_SESSION['h0']=5;
session_regenerate_id(true);

繰り返しますが、ページを複数回リロードすると、すべて同じデータで多くのセッションが取得されます。

何らかの理由で、このスクリプトを実行すると、

define('endl', "<br>");
$session->start_session();
echo session_id().endl;
session_regenerate_id(true);
echo session_id().endl;

上部では、delete_old_session を使用しています

session_regenerate_id(真)

bool session_regenerate_id ([ bool $delete_old_session = false ] )

したがって、期待される動作は、新しいセッションを生成してから古いセッションを削除することです

通常どおり実行すると、正しい動作が得られます...

出力:

d5ips18ji4rg7q63skuf7955b4
udk903d5o2nbeoq5soujng0bp5

http://s7.postimg.org/67dbyv3x7/image.png


しかし、ページを複数回リロードすると (f5 キーを数秒間押し続けます...)、60 以上のセッションが作成されました。


http://s7.postimg.org/442wr744b/image.png

これを正しく実装しているかどうかはわかりません...

編集 2: コールバックを破棄する

public function destroy($sessionId) {
    $qry = "DELETE FROM sessions WHERE id = :id";
    if (!isset($this->dStatement)) {
        $this->dStatement = $this->pdo->prepare($qry);
    }
    $this->dStatement->bindParam(':id', $sessionId, PDO::PARAM_INT);
    if ($this->dStatement->execute()) {
        return true;
    } else {
        echo "error destroy()";
        return false;
    }
}

通常の sess_reg_id(true) の代わりにこのメソッドを試してみました

public function regen_id(){
    $sessionId = session_id();
    echo $sessionId;
    $qry = "INSERT INTO sessiondeletequeue VALUES (:id, 0)";
    if(!isset($this->regQuery)){
        $this->regQuery = $this->pdo->prepare($qry);
    }
    $this->regQuery->bindParam(':id', $sessionId, PDO::PARAM_STR);
    if($this->regQuery->execute()){
        session_regenerate_id();
        echo "<br>";
        $this->forceDelete();
        return true;
    }
    else{
        return false;
    }
}
private function forceDelete(){
    $qry = "SELECT id FROM sessiondeletequeue";
    foreach($this->pdo->query($qry) as $row){
        $this->destroy($row['id']);
        if(!isset($this->forceQuery)){
            $this->forceQuery = $this->pdo->prepare("UPDATE sessiondeletequeue SET deleted = 1 WHERE id = :id");
        }
        $this->forceQuery->bindParam(':id', $row['id'], PDO::PARAM_STR);
        $this->forceQuery->execute();
    }
    $this->pdo->query("DELETE FROM sessiondeletequeue WHERE deleted = 1 ");

EDIT 3: 私はそれを回避する方法を見つけることができることを知っていますが、一体なぜそんなに多くのセッションを作成しているのか知りたいです!! D:

4

1 に答える 1