За последние 24 часа нас посетили 18418 программистов и 1710 роботов. Сейчас ищет 851 программист ...

session_set_save_handler

Тема в разделе "PHP для новичков", создана пользователем yhogan, 26 апр 2011.

  1. yhogan

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

    С нами с:
    10 сен 2010
    Сообщения:
    9
    Симпатии:
    0
    session_set_save_handler должна запускаться только один раз или с помощью неё можно определить несколько функций в течении одного сеанса?

    в документации об этом ни слова не нашел
     
  2. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    можно переопределять функции
     
  3. yhogan

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

    С нами с:
    10 сен 2010
    Сообщения:
    9
    Симпатии:
    0
    т.е. запуская session_set_save_handler я отменяю предыдущие функции, а значит действия над пользовательскими данным из разных модулей надо слить в одну функцию
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    В каких случаях его юзают?
     
  5. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    если ты хочешь направить, к примеру, всю работу с сессиями в базу. или тебя всё устраивает, но ты хочешь шифровать перед тем, как записывать в файлы. или ты вообще ненормальный и хочешь, чтобы у всех сессия была одна на всех. короче, если ты не доволен работой сессий
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    А почему кстати юзается работа с БД когда можно сделать виртуальный диск в памяти и получить все те же ускорения?
     
  7. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    на вкус и цвет)) я предпочитаю использовать класс для работы с сессиями, который позволяет часть сессии шифровать. при этом открытая часть сессии работает значительно быстрее, хотя находится всё в одном файле. у баз якобы выше уровень защищенности. имхо, как раз это утверждение очень странное...
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    titch
    а какой смысл ее "шифровать"?
     
  9. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    ну... у меня в "бронетанковой" каждый модуль имеет доступ к своей части сессии. очень удобно. что сам записал - то и твоё.
     
  10. yhogan

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

    С нами с:
    10 сен 2010
    Сообщения:
    9
    Симпатии:
    0
    шифровать мне ничего не надо, модульность:

    просто у меня было два независимых модуля, один для зарегистрированных пользователей, другой для клиентов, они не пересекались, хотя клиент мог зайти под пользователем и тогда клиентские функции бы отменились (как сказал [vs]), но это случай оч редкий и я на нем не заморачивался.

    третий модуль хранил параметры всех пользователя в куках и от сессии не зависел, размер этих параметров стал превышать допустимые (сервер стал выдавать 400 Bad Request), и я перенаправил все данные в БД и хранится они будут теперь только на время сессии.

    теперь третий модуль пересекается с первыми двумя.

    раз session_set_save_handler переопределяет функции, то мне придется сделать четвертый модуль в котором объединить функции из трех модулей и в дальнейшем меняя/добавляя функциональность или модули дописывать изменения в этот четвертый модуль

    если бы session_set_save_handler поддерживала множественность ф-ций, т.е. каждый вызов session_set_save_handler добавлял бы функции в список, то модульность бы сохранилась, каждый модуль бы продолжал вызывать session_set_save_handler определять свои функции и все функции бы по очереди выполнялись
     
  11. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ерунда получится: сначала с функциями клиента произойдет session_start и вызов open-функции и read-функции: в $_SESSION загрузится клиентская сессия. Потом произойдет переопределение, и $_SESSION с клиентскими данными (при завершении работы скрипта или вызове session_write_close()) запишется в БД пользовательской функцией.
    Или ты дважды session_start будешь делать? По-моему, это косяк в архитектуре и надо сделать иначе.
     
  12. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    session_start можно сделать хоть 100 раз за время развертки. если сессия не разрушалась, то будет подцепляться одна и та же сессия. проверить это (старая/новая?) можно только если сравнить текущий sid с тем, который был раньше, потому как session_start всегда возвращает тру.
     
  13. yhogan

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

    С нами с:
    10 сен 2010
    Сообщения:
    9
    Симпатии:
    0
    session_start вызывается в скрипте (и как сказал titch либо создает новую либо подключается к старой сессии),
    а этот скрипт подключает 2 из трех модулей
    и соответственно 2 раза вызовется session_set_save_handler (в модулях она)
    и соответственно работать будут те функции, которые будут определены последними

    мне собственно нужны только destroy и gc-функции для чистки устаревших данных

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

    поэтому получается: чтобы не было проблем session_set_save_handler должна быть определена 1 раз во всех исходниках сайта, что слегка мешает модульному программированию
     
  14. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. <?php
    2. class sessions
    3. {
    4.     private static $manager;
    5.     public static function setManager($object) {
    6.          self::$manager = $object;
    7.     }
    8.     public static function open($path, $name) {
    9.          self::$manager->open($path, $name);
    10.     }
    11.     .......
    12.  
    назначаем handler один раз (функции - статические методы такого класса), потом просто меняем $manager по ходу скрипта.