#php #session #cross-browser #spotify #fat-free-framework
#php #сессия #кросс-браузерный #spotify #fat-free-framework
Вопрос:
Я использую spotify api и по какой-то причине их блоки класса сеанса для хранения собственных данных в $ _SESSION. В качестве обходного пути я написал класс SystemHelper:
приложение пространства имен;
class SystemHelper
{
/**
* if session_id is empty string, then session_id has not been initialized
* then set session_id named 'session1'
* start session needs 2 parameters, name and value
* always close session after writing
*
* @param string $name any given name
* @param [type] $value any given value
*
*/
public static function customSessionStore($name, $value)
{
if (session_id() == '') {
session_id('session1');
}
session_start();
$_SESSION[$name] = $value;
session_write_close();
}
Теперь можно хранить данные в $ _SESSION, но проблема в том, что пока я вхожу в свою учетную запись (собственная форма входа, а не учетная запись spotfiy), все остальные входят в систему, независимо от того, какой браузер, IP и т.д…
Я не знаю, как это можно решить. Разве session_id не должен генерировать случайный идентификатор? Кто-нибудь может помочь, пожалуйста?
Оставляя
if (session_id() == '') {
session_id('session1');
}
это не решает проблему, потому что мне также нужно прочитать и удалить данные, хранящиеся в сеансе. Итак, дополнительно у меня есть этот обходной путь:
public static function customSessionRead($name)
{
if (session_id() == '') {
session_id('session1');
}
session_start();
session_write_close();
return $_SESSION[$name];
}
и…
public static function customSessionDestroy()
{
session_start();
session_destroy();
}
Ответ №1:
Если я правильно понял.. все ваши пользователи получают одинаковый session_id().
Таким образом, они технически разделяют один сеанс. Насколько я знаю, если вы начнете сеанс, session_id() будет сгенерирован автоматически. Таким образом, вам не нужно устанавливать session_id() самостоятельно.
Итак, ваш код должен выглядеть следующим образом:
class SystemHelper
{
/**
* if session_id is empty string, then session_id has not been initialized
* then set session_id named 'session1'
* start session needs 2 parameters, name and value
* always close session after writing
*
* @param string $name any given name
* @param [type] $value any given value
*
*/
public static function customSessionStore($name, $value)
{
session_start();
$_SESSION[$name] = $value;
session_write_close();
}
}
Комментарии:
1. спасибо за ваш быстрый ответ, я отредактировал свой вопрос, добавил sessionRead и sessionDestroy; Я не могу пропустить то, что вы предлагаете
Ответ №2:
Решаемая, на самом деле довольно простая. Проблема первая: если написано так:
session_id('session1');
как в customStore, так и в customRead просто означает возобновление сеанса. Конечно, вы всегда будете получать одни и те же данные, независимо от того, какой браузер, ip, … в этом смысл возобновления сеанса.
Что решается:
session_create_id($name);
Итак, снова полный:
public static function customSessionStore($name, $value)
{
// if (session_id() == '') {
// session_id('session1');
// }
session_create_id($name);
session_start();
$_SESSION[$name] = $value;
session_write_close();
}
и,
public static function customSessionRead($name)
{
// if (session_id() == '') {
// session_id('session1');
// }
session_start();
session_write_close();
return $_SESSION[$name];
}