За последние 24 часа нас посетили 18420 программистов и 1636 роботов. Сейчас ищут 1658 программистов ...

Проблема с сессиями

Тема в разделе "Прочие вопросы по PHP", создана пользователем trofian, 2 май 2011.

  1. trofian

    trofian Активный пользователь

    С нами с:
    22 сен 2010
    Сообщения:
    10
    Симпатии:
    0
    Вобщем бред какой-то
    http://narod.ru/disk/11651568001/class. ... n.rar.html
    создаю объект
    $objSession = new Sessions();
    обновляю страницу 5 раз и такой хлам в базе
    [​IMG]
    т.е. если в базе есть запись с таким id сеанса, то нужно обновить запись, а он обновляет старую и добавляет новые, хотя раньше такого не было
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    а после чего получилось?
     
  3. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    велосипедные сессии на php чтото новенькое

    может на куках написать без использования сессиий вообще.

    результат один, и если нет разницы то зачем извращаться?
     
  4. xayam

    xayam Активный пользователь

    С нами с:
    2 май 2011
    Сообщения:
    10
    Симпатии:
    0
    я не доктор, а только учусь. НО может "устаревшие сеансы" удалять в деструкторе, который для этого вроде как предназначен...

    PS За 11-ю строчку отдельное спасибо, посмеялся хоть немного :)
     
  5. trofian

    trofian Активный пользователь

    С нами с:
    22 сен 2010
    Сообщения:
    10
    Симпатии:
    0
    написал класс, проверил, всё работало
    потом что немного доделал (естественно не проверил:)) и забросил, теперь понадобился и вот такая шляпа

    Что значит велосипедные?

    ну можно и в sess_gc , именно это предназначено для очистки

    сначала грешил на это $this->sess_read($this->php_sess_id); в 246, но нет
    вообщем не знаю
     
  6. xayam

    xayam Активный пользователь

    С нами с:
    2 май 2011
    Сообщения:
    10
    Симпатии:
    0
    trofian

    То есть тебя не очень удивляет, что ты сначала удаляешь "старые" сессии,
    потом стартуешь сессию (которую мог до этого удалить?)...
    Но при этом удивляют последствия в базе.
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    вероятно, ошибка в логики инициализации сессии
     
  8. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    просто ваш скрипт делает двойную работу.

    сессии в php хранятся в файле, плюс к этому вы их хранение дублируете в базе данных

    сессии самостоятельно следят за своей актуальностью и удаляются при неспользовании,

    вы делаете опять тоже самое ослеживаете когда оно удалится -- вы удаляете из базы

    сессии хранят id и др параметры посетителей

    вы делаете тоже самое

    ЭТО и есть велосипед , вы решаете задачи, которые уже давно решены, причем не самым логичным образом.

    Предлагаю вам использовать куки напрямую без использования сессий.

    тогда вы получаете 100% контроль над куками и сами управляете всем механизмом идентификации пользователей.
    вам не нужно прописывать настройки так как у куков их практически нет
    ваша таблица практически не изменит структуру.
    в кукам можно обращаться напрямую через суперглобальный массив $_COOKIE
    и уставливать значение через setcookie()
    никаких настроек, никаких нагромождений кода, по работе и инциализаций сессий
    код чище, телодвижений меньше, нагрузка снижена.
     
  9. xayam

    xayam Активный пользователь

    С нами с:
    2 май 2011
    Сообщения:
    10
    Симпатии:
    0
    Alex_pac

    А ничего, что куки на клиенте хранятся?
    Кстати в друпале тоже в базе сессии...
    Надо всех (а это будет до х..на народа) друпаловцев повесить за это :)
     
  10. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    ознакомьтесь с механизмом работы сесиий, куки ЛЕГКО заставить работать точно также.

    PS судя по настройкам которые провел trofian в своем классе, он намеренно отказывается от "фишки" из за которой все холивары между сессиями и куками.
    а именно авторизация при отключенных куках.

    А ЗНАЧИТ

    то что я ему советуют более чем приемлемо.
     
  11. xayam

    xayam Активный пользователь

    С нами с:
    2 май 2011
    Сообщения:
    10
    Симпатии:
    0
    Наверно холивар из-за вопроса "быть сайту 1 день или чуть-чуть побольше?" :)

    Точно также вряд ли (скорей точно нет). Мне лучше сразу ключи от квартиры по почте послать, вместе с: логинами, паролями и инструкцией по применению.
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Alex_pac
    php передает управление сессиями этому класс после строки:
    PHP:
    1. <?
    2.         array (&$this, 'sess_open'),
    3.         array (&$this, 'sess_close'),
    4.         array (&$this, 'sess_read'),
    5.         array (&$this, 'sess_write'),
    6.         array (&$this, 'sess_destroy'),
    7.         array (&$this, 'sess_gc')
    8.         );
    9.        
    session_start вызвается позже, поэтому никакой двойной работы не делается.
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Хотя, очевидно, механизм автор ниасилил
    PHP:
    1. <?  private function sess_open($save_path, $_session_name) {
    2.     return true;
    3.     }
    4.  
    5.     public function sess_close() {
    6.     return true;
    7.     }
     
  14. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    в споре рождается истина, ну чтож. двойной работы значит нет.

    однако все равно велосипед присутвует в этой части "установления пользовательских функций хранения сессий"

    а если велосипеду быть то опять получаем практическое отсутвие разницы между классом на сессиях и классом на куках.


    xayam
    вы всетаки ниасилили, ну чтож мне жаль смотреть на то как вы говорите о том чего не знаете.
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. <?
    2. }elseif(isset($res[0]['var_value']) && !empty($res[0]['var_value']) && $val = false){
    мне кажется, ошибка в этой строке - тут приравнивание вместо сравнения ($val = false), повторение предыдущего условия (!empty($res[0]['var_value'])) и вообще от такой логики нехорошо стало
     
  16. trofian

    trofian Активный пользователь

    С нами с:
    22 сен 2010
    Сообщения:
    10
    Симпатии:
    0
    в этой строке выполняется проверка для удаления переменной сеанса
     
  17. xayam

    xayam Активный пользователь

    С нами с:
    2 май 2011
    Сообщения:
    10
    Симпатии:
    0
    Ссылок можешь дать хоть тысячу по тысяче страниц. Ты на пальцах объясни о "классах на куках" :)

    Так далеко и не смотрел :) Тут принципиальная проблема с неиспользованием деструктора...
     
  18. trofian

    trofian Активный пользователь

    С нами с:
    22 сен 2010
    Сообщения:
    10
    Симпатии:
    0
    Незнаю, но получается, что 2 условия выполняются одновременно 0_o?
    PHP:
    1.      
    2.        <?php
    3.  if($resNum == 1){
    4.         $this->native_sess_id = $resSel[0]['id'];
    5.         $this->user_id = $resSel[0]['user_id'];
    6.         $arrUpdate = array('session_active' => time(), 'session_counter' => ++$resSel[0]['session_counter']);
    7.         $arrWhere = array('session_id' => $this->php_sess_id, 'session_remote_address' => $this->get_full_ip());
    8.         parent::update($this->session_table, $arrUpdate, $arrWhere);
    9.         if($resSel[0]['session_logged_in'] == 1){
    10.             $this->logged_in = true;
    11.             $this->user_id = $resSel[0]['user_id'];
    12.             }else{
    13.                 $this->logged_in = false;
    14.                 }
    15.         }elseif($resNum == 0){
    16.             $this->logged_in = false;
    17.             $arrIns = array('session_id' => $this->php_sess_id, 'session_created' => time(), 'session_active' => time(), 'session_remote_address' => $this->get_full_ip());
    18.             parent::insert($this->session_table, $arrIns);
    19.             $this->sess_read($this->php_sess_id);
    20.         }
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    в это месте нет ошибок
     
  20. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    [​IMG]

    xayam

    схема куков работающих как сесии и где же ключи от сайта?
     
  21. xayam

    xayam Активный пользователь

    С нами с:
    2 май 2011
    Сообщения:
    10
    Симпатии:
    0
    Может мы не поняли друг друга.
    Мне показалось, что Вы все в куках собираетесь хранить,
    поскольку для меня "сессия" немного абстрактное понятие, не особо связанное с файлами или базами.

    PS У Вас фамилия не Паклин случайно?
     
  22. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    тут я имел ввиду что внутри кода не будет НИ ОДНОЙ стандартной функции както связанной с сессиями

    только
    setcookie()
    и суперглобальный массив $_COOKIE

    ps нет
     
  23. trofian

    trofian Активный пользователь

    С нами с:
    22 сен 2010
    Сообщения:
    10
    Симпатии:
    0
    Эээ, я могу удалить сессию, до того, как её создал?
    ведь логичнее сначала избавится от мусора, а потом запустить сессию, а не
    запустить сессию, и потом разгребать базу от мусора

    PS даже если это добавить в деструктор

    PHP:
    1.         <?        // очистка устаревших сеансов из базы
    2.         $arrDel = array('session_active' => time() - ini_get ("session.gc_maxlifetime"));
    3.         parent::delete($this->session_table, $arrDel, '<');
    4.         parent::optimize($this->session_table);
    5.         unset ($arrDel);
    6.                 // очистка устаревших переменных из базы
    7.         $arrDel = array('session_id' => '(SELECT id FROM '. $this->session_table . ')');
    8.         parent::delete($this->session_vars, $arrDel, ' NOT IN ');
    9.         parent::optimize($this->session_vars);
    10.         unset ($arrDel);
    проблема остаётся

    И что тут писать?
     
  24. xayam

    xayam Активный пользователь

    С нами с:
    2 май 2011
    Сообщения:
    10
    Симпатии:
    0
    одной меньше

    Даже пример есть на офиц.сайте
    http://ru.php.net/manual/en/function.session-set-save-handler.php
     
  25. trofian

    trofian Активный пользователь

    С нами с:
    22 сен 2010
    Сообщения:
    10
    Симпатии:
    0
    а, ну понятно, но всё равно у меня для работы с переменными __set и __get