ФорумПрограммированиеPHP для идиотов → sessions, что вам от них нужно?

sessions, что вам от них нужно?

  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 24 мая 2010 г. 0:25, спустя 51 минуту 23 секунды

    Мы должны быть благодарны контакту, за демонстрацию "так не надо делать" :)
    Поправь меня, если я ошибаюсь: в CI "flash" умирает на сделующей странице без вариантов. А идея RoR flash messages в том, чтобы значения жили до первого использования (в пределах сессии), псколько бы промежуточных страниц не было.
    ιιlllιlllι унц-унц
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 24 мая 2010 г. 0:37, спустя 12 минут 5 секунд

    похоже на то. Дуд как раз и пытался донести до меня это своим постом. А вот ты как думаешь: как правильнее? Или нужно обеспечить возможность и так и так?
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 24 мая 2010 г. 2:00, спустя 1 час 23 минуты 47 секунд

    IMHO: библиотеки должны расти только для того, чтобы прикладной код уменьшался. Не вижу смысла в варианте "только до следующей страницы"
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26614 Репутация: N Группа: в ухо

    Spritz 24 мая 2010 г. 2:03, спустя 2 минуты 52 секунды


    IMHO: библиотеки должны расти только для того, чтобы прикладной код уменьшался. Не вижу смысла в варианте "только до следующей страницы"

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

    function addMessage($text, $type="msg")
    {
    $_SESSION['MESSAGES'][] = array($text, $type);
    }

    function messages()
    {
    if(!$_SESSION['MESSAGES'])
    {
    return;
    }

    $html = &#39;<div class=&quot;messages&quot;>&#39;;
    foreach($_SESSION[&#39;MESSAGES&#39;] as $msg)
    {
    $html .= &#39;<div class=&quot;msg_&#39;.$msg[1].&#39;&quot;>&#39;.$msg[0].&#39;</div>&#39;;
    }
    $html .= &quot;</div>&quot;;

    unset($_SESSION[&#39;MESSAGES&#39;]);

    return $html;
    }
    Сапожник без сапог
  • kostyl

    Сообщения: 5199 Репутация: N Группа: Джедаи

    Spritz 24 мая 2010 г. 2:36, спустя 32 минуты 51 секунду

    ааа, я понял. Когда то давно у меня была такая фигня:
    class RequestHistory {
    /**
    * @static
    * @var array
    */
    private static $_ReqestStack = array();
    /**
    * @static
    * @var int
    */
    private static $_MaxSize = 10;
    /**
    * @static
    * @param string $RequestString
    */
    public static function SetRequestString($RequestString)
    {
    self::$_ReqestStack = Session::Get(&#39;request_history&#39;);
    if(NULL === self::$_ReqestStack) {
    self::$_ReqestStack = array();
    }
    array_unshift(self::$_ReqestStack, $RequestString);
    if (count(self::$_ReqestStack) > self::$_MaxSize) {
    array_pop(self::$_ReqestStack);
    }
    Session::Set(&#39;request_history&#39;, self::$_ReqestStack);
    if(Session::Get(&#39;curr_request&#39;) !== $RequestString) {
    Session::Set(&#39;prev_unic_request&#39;, Session::Get(&#39;curr_request&#39;));
    }
    Session::Set(&#39;curr_request&#39;, $RequestString);
    }
    /**
    * @static
    * @return string
    */
    public static function GetPrevUnicRequestString()
    {
    return Session::Get(&#39;prev_unic_request&#39;);
    }
    }
    {+++105+++} ну почти то же
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 14 июня 2010 г. 0:59, спустя 20 дней 22 часа 22 минуты

    прототип, еще не работает. Ругайте, критикуйте код.
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 14 июня 2010 г. 3:24, спустя 2 часа 24 минуты 59 секунд

    блиа, ну посмотрите же кто-нибудь
  • kostyl

    Сообщения: 5199 Репутация: N Группа: Джедаи

    Spritz 14 июня 2010 г. 3:47, спустя 23 минуты 8 секунд

    посмотрел, ну ничё так, без комментв долго рассматривать надо, а вообще так, обычные сессии…
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 14 июня 2010 г. 4:03, спустя 16 минут 3 секунды

    планируется что-то типа такого:

    $options = array(
    &#39;serializer&#39; => &#39;default&#39;, // можно экземпляры классов тулить
    &#39;storage&#39; => &#39;file&#39;
    // … всякие настройки типа времени жизни и тд
    );

    $session = new BL_Session($options); // и это сохраняем внутри App-класса


    # Потом в модуле:
    // …
    public function __construct(BL_Application $app)
    {
    $this->session = $app->session(&#39;myNamespace&#39;);
    }

    public function process()
    {
    $this->session[&#39;foo&#39;] = &#39;bar&#39;;
    $fructe = $this->session->get(&#39;fructe&#39;, &#39;apple&#39;);

    $ns2 = $this->session->ns(&#39;anotherNS&#39;); // взяли другой неймспейс
    $ns2->setFlash($this->tr->tr(&#39;Данные успешно сохранены&#39;)); // это то сообщение читается один раз, потом удаляется

    $this->session->addFlash(&#39;сообщение 1&#39;); // тоже самое, что и выше, просто иногда нужно добавить несколько таких сообщений
    $this->session->addFlash(&#39;сообщение 2&#39;);
    }
  • kostyl

    Сообщения: 5199 Репутация: N Группа: Джедаи

    Spritz 14 июня 2010 г. 4:17, спустя 13 минут 54 секунды

    Абырвалг, немного не пойму, что у тебя делает неймспейс?
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 14 июня 2010 г. 4:30, спустя 13 минут 16 секунд

    ну у меня все в неймспейсах происходит.

    $session->ns(&#39;myNS&#39;); // типа как мы отделили себе $_SESSION[&#39;myNS&#39;] и дальше работаем только с ним, никуда не лезем
  • kostyl

    Сообщения: 5199 Репутация: N Группа: Джедаи

    Spritz 14 июня 2010 г. 4:39, спустя 8 минут 24 секунды

    Абырвалг, ааа понятно
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 15 июня 2010 г. 1:11, спустя 20 часов 32 минуты 25 секунд

    Так-с, у сессий зависимости от Request и Response (инстанции этих классов отправляются в конструктор).

    	protected function generateSession()
    {
    $key = $this->options[&#39;name&#39;];

    $this->id ||
    $this->id = $this->request->cookies($key) ||
    $this->id = $this->request->request($key) ||
    $this->id = call_user_func($this->options[&#39;randomizer&#39;]);

    $o = $this->options[&#39;cookies&#39;];
    $this->response->setCookie($key, $this->id, $o[&#39;expire&#39;], $o[&#39;path&#39;], $o[&#39;domain&#39;], $o[&#39;secure&#39;], $o[&#39;httpOnly&#39;]);
    }

    прикольный кусок получился)
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 15 июня 2010 г. 1:15, спустя 3 минуты 26 секунд

    Буду делать обертку над сессиями. Какие плюшки там нужны? Ну типа неймспейсы, флеш-сообщения…

    накидайте интерфейсов))


    как-то так

    interface Session {
     function getValue($name);
     function setValue($name, $value);
     function deleteValue($name);
     function free();
    }


    Сами сессии - это примерно как БД, классы приложений работают с хранилищем не напрямую, а через класс-посредник. В случае с сессиями этот класс управления данными пользователя.
    не всё полезно, что в swap полезло
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 17 июня 2010 г. 0:44, спустя 1 день 23 часа 29 минут

    1) что такое destroy в сессиях?

    Я так понимаю, что мы:
    удаляем все данные, сохраненные для этого SID с диска/из базы
    очищаем $_SESSION
    отправляем протухшую куку


    2) А чем отличается ручной вызов session destroy от автоматического (gc)?

    3) Как отслеживать lifetime?
    a) при каждом обращении к сессии обновляем колонку последнего обращения. Но у меня неймспейсы, на каждый неймспейс свой файл… Фигня получается
    b) создать какой-то meta-файл, в нем и обновлять дату последнего обращения

Пожалуйста, авторизуйтесь, чтобы написать комментарий!