Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> слетает сессия 
:(
    Опции темы
Pokoinik
Дата 11.12.2007, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 17.3.2007
Где: /dev/null

Репутация: 2
Всего: 3



храню сессии в бд код класса следующий:
Код

class SESSION {
    private $database = null;
    function __construct(&$database) {
        $this->database = $database;
        session_set_save_handler(
            array(&$this, 'session_open'),
            array(get_class($this), 'session_close'),
            array(&$this, 'session_read'),
            array(&$this, 'session_write'),
            array(&$this, 'session_delete'),
            array(&$this, 'session_gc')
        );
        session_start();
    }
    function session_open($path, $name) {
        return true;
    }

    function session_close() {
        return true;
    }

    function session_read($sid) {
        $sid = $this->database->getEscaped($sid);
     $this->database->setQuery("UPDATE `#__sessions` SET atime='{$this->getMicrotime()}' WHERE sid='$sid'");
     $this->database->query();
        if (!(bool)$this->database->getAffectedRows()) {
            $this->database->setQuery("INSERT INTO `#__sessions` (sid) VALUES ('$sid')");
            $this->database->query();
            return "";
        }
        
        $this->database->setQuery("SELECT data FROM `#__sessions` WHERE sid='$sid'");
        $row = $this->database->loadRow();
        return $row[0];
    }

    function session_write($sid, $data) {
     $sid = $this->database->getEscaped($sid);
        $data = $this->database->getEscaped($data);
        $this->database->setQuery("REPLACE INTO `#__sessions` (sid, atime, data) VALUES ('$sid', '{$this->getMicrotime()}', '$data')");
        $this->database->query();
    }

    function session_delete($sid) {
        $sid = $this->database->getEscaped($sid);
        $this->database->setQuery("DELETE FROM `#__sessions` WHERE sid='$sid'");
        return $this->database->query();
    }

    function session_gc($lifetime) {
        $dead = $this->getMicrotime() - $lifetime;
        $this->database->setQuery("DELETE FROM `#__sessions` WHERE atime < $dead;");
        $this->database->query();
    }
    
    private function getMicrotime() {
         $microtime = explode(' ', microtime());
            return $microtime[1] + $microtime[0];
    }
}


бд 
Код

CREATE TABLE `ceway_sessions` (
  `sid` char(32) collate utf8_bin NOT NULL,
  `atime` double NOT NULL,
  `locked` tinyint(4) NOT NULL default '0',
  `data` text collate utf8_bin NOT NULL,
  PRIMARY KEY  (`sid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


Заметил следующий трабл,
при работе с системой очень часто слетает сессия, просто выкидывает из админки...
подскажите где сидит жучок, сам обыскался уже...



--------------------
ICQ: 490-993
Существует только 10 типов людей: те, которые понимают двоичную систему, и которые ее не понимают!!!
Опасайтесь людей верующих, ибо у них есть боги, которые им все прощают.

Делай или не делай! Никаких попробую!
Йода (Yoda), мастер-джедай
PM MAIL ICQ   Вверх
Feldmarschall
Дата 11.12.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



А если не использовать БД и переопределение механизма - слетает, или нет?

Цитата(Pokoinik @  11.12.2007,  17:21 Найти цитируемый пост)
`atime` double NOT NULL,

батюшки! к чему такая точность? 

А вообще странный вопрос. Неужели на форуме действительно могут подсказать, где "жучок"? А отладка на что?


Это сообщение отредактировал(а) Feldmarschall - 11.12.2007, 17:28
PM   Вверх
Pokoinik
Дата 11.12.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 17.3.2007
Где: /dev/null

Репутация: 2
Всего: 3



Feldmarschall, если не использовать бд все работает.


--------------------
ICQ: 490-993
Существует только 10 типов людей: те, которые понимают двоичную систему, и которые ее не понимают!!!
Опасайтесь людей верующих, ибо у них есть боги, которые им все прощают.

Делай или не делай! Никаких попробую!
Йода (Yoda), мастер-джедай
PM MAIL ICQ   Вверх
Feldmarschall
Дата 11.12.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Значит, где-то косяк в реализации.
А попросить более детальный анализ понятия "слетает сессия" можно? Скажем, состояние скрипта, которое показывает отладчик в этот момент?
PM   Вверх
Pokoinik
Дата 12.12.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 17.3.2007
Где: /dev/null

Репутация: 2
Всего: 3



Нашел баг, тока не могу понять как его исправить...
 smile  smile 
Код

 function session_gc($lifetime) {
        $dead = $this->getMicrotime() - $lifetime;
        $this->database->setQuery("DELETE FROM `#__sessions` WHERE atime < $dead;");
//если не дать выполнить запрос на удалени, все работает...
//        $this->database->query();
// но смущает следующее
// добавил строку
file_put_contents('/tmp/del.log', "DELETION\nQuery:\n DELETE FROM `#__sessions` WHERE atime < $dead;\n");
// система unix, tmp выставлены права 777
// но файл не создается...
    }



--------------------
ICQ: 490-993
Существует только 10 типов людей: те, которые понимают двоичную систему, и которые ее не понимают!!!
Опасайтесь людей верующих, ибо у них есть боги, которые им все прощают.

Делай или не делай! Никаких попробую!
Йода (Yoda), мастер-джедай
PM MAIL ICQ   Вверх
Feldmarschall
Дата 12.12.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Я же говорил! Отладка - всему голова! =)
Слушай, меня терзает один вопрос. Скажи, а зачем тебе точность в миллиардные доли секунды для времени  создания сессии?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0678 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.