Автор Тема: PHP работа едновременно с две сесии/кукита  (Прочетена 19337 пъти)

Naka

  • Напреднали
  • *****
  • Публикации: 3462
    • Профил
Опитвам се да обслужвам едновременно две сессии, които се предоставят от две различни кукита например:
PHPSESSID-> sdfsd123fa12ewrzy
IME_2 -> sdgaSFSDasdf13123313

С едно куки няма никакви проблеми и кода си работи отдавна. Тук за пример съм го опростил много.

Код
GeSHi (PHP):
  1. // това създава (или използва) куки с име PHPSESSID-> sdfsd123fa12ewrzy и уникално id.
  2.  
  3. $_SESSION['neshto'] = neshto;
  4. $_SESSION[1] = 1234;
и т.н.

Обаче ако едновреммено трябва да се обработват две сессии(кукита), за съхранение на различни данни натъпва проблем, щото $_SESSION[] е само един и важи за последно стартираната сессия със session_start();

А аз искам да имам постоянно (отворени) $_SESSION[] $_SESSION_2[] и в тях да пиша едновременно различни данни.

За такова нещо ползват такъв патън (пак опростено):

Код
GeSHi (PHP):
  1. session_name('PHPSESSID');
  2. session_id('sdfsd123fa12ewrzy');
  3.  
  4. $_SESSION['neshto'] = neshto;
  5. session_write_close(); //това записва масива $_SESSION[] във файл на сървера.
  6.  
  7. session_name('IME_2');
  8. session_id('sdgaSFSDasdf13123313');
  9.  
  10. $_SESSION['neshto2'] = neshto2;
  11. session_write_close();  //това записва масива $_SESSION[] във файл на сървера.

Но това стартира една сессия, след това трябва да я затвориш session_write_close(); - за да се запише на сърверният файл, след това трябва да превключиш на другата, да я използваш и пак да я затвориш...... което въобще не ми харесва.

Какъв е най-правилният подход такова нещо да се реализира. Чувствам, че съм на грешен път и стандартниият начин на PHP за облужване сессии е много ограничен - (една сессия в един момент от времето).
От друга страна не ми се иска да си пиша сам обработката на сесии с mysql или с други handler-и http://php.net/manual/bg/function.session-set-save-handler.php -и - ще стане дълга и широка.

https://stackoverflow.com/questions/24964699/php-how-can-i-create-multiple-sessions
https://stackoverflow.com/questions/609756/can-you-switch-php-sessions-in-a-session
https://stackoverflow.com/questions/3150355/can-multiple-independent-sessions-be-used-in-a-single-php-script

 
« Последна редакция: Oct 03, 2018, 15:30 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

PaperNick

  • Напреднали
  • *****
  • Публикации: 295
  • Window Manager: Xfce
    • Профил
По принцип PHP ще хвърли грешка (notice), ако се опиташ да стартираш сесия докато съществуваща такава вече тече.

Досега не ми се е налагало да поддържам 2 сесии едновременно. Има ли причина непременно да съхраняваш данните в отделни сесии?
Активен

Practice

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Правилния подход е 1 сесия.

Виж никой не ти пречи да си направиш някаква вътрешна логика и от 1 сесия да направиш 1 истинска (от ПХП) и една виртуална (от теб си).
Активен

mobilio - професионални мобилни приложения

Naka

  • Напреднали
  • *****
  • Публикации: 3462
    • Профил
Досега не ми се е налагало да поддържам 2 сесии едновременно. Има ли причина непременно да съхраняваш данните в отделни сесии?

Ами защото ми трябва да подържам още едно куки за тази цел:
http://www.linux-bg.org/forum/index.php?topic=48080.0

И данните които вързва това куки $_SESSION_2[], да са разделно от данните обвързани с другите $_SESSION[].

Например в основното PHPSESSID се подържа само логването - и то е само за една част от сайта.
А за другото там се записват, разни настройки - последно логнати потребители и т.н. и това допълнотелно куки е общо за целият сайт. Важи и там където има  PHPSESSID, но и извън неговия обхват.

Няма начин това с две  или повече сесси да не може да се реализира с PHP. големите сайтове слагат едновременно по 4-5 кукита. И всичките 'съхраняват' различни работи.


Виж никой не ти пречи да си направиш някаква вътрешна логика и от 1 сесия да направиш 1 истинска (от ПХП) и една виртуална (от теб си).

смисъл? ако има зададено второ куки си пълня собствен масив $_SESSION_2[] и си го записвам по мой си начин на сървера?
« Последна редакция: Oct 04, 2018, 10:47 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил

Виж никой не ти пречи да си направиш някаква вътрешна логика и от 1 сесия да направиш 1 истинска (от ПХП) и една виртуална (от теб си).

смисъл? ако има зададено второ куки си пълня собствен масив $_SESSION_2[] и си го записвам по мой си начин на сървера?

Точно така... как ще направиш връзката си е твоя грижа.
Активен

mobilio - професионални мобилни приложения

PaperNick

  • Напреднали
  • *****
  • Публикации: 295
  • Window Manager: Xfce
    • Профил

Виж никой не ти пречи да си направиш някаква вътрешна логика и от 1 сесия да направиш 1 истинска (от ПХП) и една виртуална (от теб си).

смисъл? ако има зададено второ куки си пълня собствен масив $_SESSION_2[] и си го записвам по мой си начин на сървера?

Точно така... как ще направиш връзката си е твоя грижа.
Съжалявам, че малко късно се включвам. n00b е отговорил достатъчно изчерпателно, но и аз да направя едно обощение.

Когато се създава сесия, сървъра генерира някаква произволна стойност и я сетва на потребителя посредством Set-Cookie HTTP хедъра. Реално информацията от сесията не са пази в това PHPSESSID, а по подразбиране се пази като файл някъде на сървъра. PHPSESSID просто служи като идентификатор, който се подава при всяка заявка, за да може да се помни състоянието между различните заявки.

Бисквитката не е задължително винаги да служи като идентификатор. Може да държи и тривиална информация, като последно влизане, дали нещо е кликнато и т.н. Тези бисквитки обикновено не са http_only и могат да бъдат четени и от JS. Но ако има друга която служи като идентификатор, може да провериш за нейното наличие чрез $_COOKIE и съответно да запазиш информация свързана с нея като:
  • някакъв друг файл на сървъра
  • в базата данни (или специална in-memory такава) под някаква структурирана форма - сериализиран JSON или отделна таблица специално за това
  • в $_SESSION под някакъв друг ключ $_SESSION['other_session_data']

Третото не знам дали ще ти свърши работа, понеже ако главната сесия се унищожи, то и данните от другата сесия ще заминат с нея.
« Последна редакция: Oct 04, 2018, 21:51 от PaperNick »
Активен

Practice

Naka

  • Напреднали
  • *****
  • Публикации: 3462
    • Профил
Цитат
в $_SESSION под някакъв друг ключ $_SESSION['other_session_data']

Третото не знам дали ще ти свърши работа, понеже ако главната сесия се унищожи, то и данните от другата сесия ще заминат с нея.

Няма да ми свърши работа, защото искам второто куки да напълно независимо от първото. Второто може да го има, когато първата сессия/куки не съществува.


Като се стартирира стандаратанта сесия по куки PHPSESSID->vvnbij7p2a5gpr2jbe0qs95660
PHP-то прави съответстен файл в /tmp/sess_vvnbij7p2a5gpr2jbe0qs95660 (или в която директория му зададеш)

вътре в този файл sess_vvnbij7p2a5gpr2jbe0qs95660 PHP-то записва масива $_SESSION . Файла примерно изглежда така.

Код:
user|s:0:"";count|i:1;nonce_saved|a:1:{i:1;s:25:"f9n4vi32smj7mh2arrjnzq2lv";}exists|b:1;
Това е някакво json кодиране, serialize() или нещо такова. А файла се записва/ъпдейтва при затваряне на PHP скрипта или при session_write_close();

---
Проблема обаче сега като си мисля е друг. На всяко куки по един файл.
Стандартно живота на кукито (и съответно на файла) е 6 часа.
А аз искам да направя 2 годинишно куки - така както го правят големите - FB, Гого и т.н.
И в това куки да се записват, почти незначителни работи, като настройки на екрана....

обаче по 1000 уникални посетители на ден X 365 дни X 2 години = 730 000 файла :o (то в българия няма толкова много потребители....ама). Цифрата се взривява, ако увеличаваш живота на кукито от 6 часа на 2 години.

Точно за това не искам сесийните данни да го записвам в mysql. Изпотрябвала ми е таблица с 730 000 записа. Бих предпочел файлове.

Но ако са файлове как ще издържи стандартната сессия на PHP ако  трябва да записва 730 000 файла в една директория? (/tmp или /var/lib/php/session/naka)

То някъде пишеше че макс броя на файлове в ext3/ext4 в една директория не бива да превишават 32K или 64K броя файла...Ставало много бавно.


« Последна редакция: Oct 05, 2018, 13:53 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
То някъде пишеше че макс броя на файлове в ext3/ext4 в една директория не бива да превишават 32K или 64K броя файла...Ставало много бавно.

А какво ти пречи файла ако е 1234567890 да го запишеш така
1/2/3/4/5/6/7890

Така пак може да си имаш 700к броя файлове. Обаче като влезеш във онази папка ще видиш 10 директории и това е.
Активен

mobilio - професионални мобилни приложения

Naka

  • Напреднали
  • *****
  • Публикации: 3462
    • Профил

А какво ти пречи файла ако е 1234567890 да го запишеш така
1/2/3/4/5/6/7890

Това е много добра идея. Мога да го разцепя по първите букви на хеш сумата. И то само първите  2 букви ще са достатъчни.  Мерси. [_]3 [_]3. Как не съм се сетил :o.
А и така много лесно може да се провери за колизии при генерирането на ключа и кукито. Ако в съответната директория вече има такъв файл - се генерира отново.

Даже и още по просто може да стане. Името на файла да си остане цялото: 1234567890 да се запише /1/2/3/4/5/6/1234567890
-----

Изначало си мислех по подобен начин да го разцетя по директории, но по месеци, по времето на създаване на кукито.
1/
2/
3/
...
12/
Но в самото куки в http хедърите не се съобщава датата на създаването му (освен ако не я довавиш). Creation time-а я знае браузера, но не и PHP страната. Файла на сървера също има creation time....ама датата ти трябва предварително...да определиш в коя директория се намира файла. Става проблема на ключа и бараката. Тъй че този метод с датите е много по сложен...
« Последна редакция: Oct 06, 2018, 16:38 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Да - като не ти е ясно нещо питай.
Активен

mobilio - професионални мобилни приложения

Naka

  • Напреднали
  • *****
  • Публикации: 3462
    • Профил
Все още не съм убеден, че това да си направя собствено обслужване на второто куки е най добрият подход. Ако утре се наложи да подържам 3-то ще стане боза. Една сесия по PHP стандартният начин и други две-три по мoй си начин....

Защото има http://php.net/manual/en/function.session-set-save-handler.php
Не е ли по добре да си напиша собствени callback функции и така да стане по стандартно и универсално.
За записа на масива видяхме, че може да се направи много просто и ефективно във файл, който начин със сигурност ще се използва.
« Последна редакция: Oct 09, 2018, 12:04 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Аз не мога да ти попреча да си счупиш главата... но щом искаш давай!
Активен

mobilio - професионални мобилни приложения

Naka

  • Напреднали
  • *****
  • Публикации: 3462
    • Профил
Бисквитката не е задължително винаги да служи като идентификатор. Може да държи и тривиална информация, като последно влизане, дали нещо е кликнато и т.н.

Колегата отдавна не мяркал, но аз в момента доработвам този въпрос с кукита и бекрайните сессии - 2 годишни. Затова отново се интересувам - някой може да знае и да даде насоки.

Какъв е недостатъка на това в кукито да се съхранява тривиална информация? (а не сeсиен номер)
Например - на мен ми трябва да пазя last_login_username:

Ако съхраня например директно в кукито:last_login_username: naka,mimi@example.com,gogo

това може ли да има секюрити риск...все пак са само юзер имена, които са публични?

Активен

Perl - the only language that looks the same before and after encryption.

4096bits

  • Напреднали
  • *****
  • Публикации: 6854
    • Профил
Тези бишкоти не се ли криптират?
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

Naka

  • Напреднали
  • *****
  • Публикации: 3462
    • Профил
Щеше ми се да мина метър и да го направя по-лесния начин....Ама по всичко изглежда, че трябва да се направи както трябва. :'( ще е доста по гъвкаво, по сигурно а и няма да има ограничение по размер на съхраняваната информация в кукито - 4к.

1. В курабийката да се записва сессиен номер.
2. На сървера да се организира директория за съхранение на данните (по начина на n00b) - например в $_SESSION_custom[]
3. данните вътре в $_SESSION_custom[] да се записват с serialize()
4. да се организира някакъв 'garbage collection' който да почиства  директория за съхранение на $_SESSION_custom[] за тези кукита които са изтeкли по-време

И пак се стига до начина по който го прави PHP-то
« Последна редакция: Aug 14, 2020, 10:52 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.