Задать вопрос
wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.

Как получить данные из сессии без session_start()?

Надо получить ранее сохранённые данные из сессии, но не инициализируя session_start();
Проблема в том, что после сохранения данных в сессию, надо запустить несколько копий скрипта с помощью curl_multi_init, но с разными параметрами.
Увы, использовать session_start() для получения данных нельзя, т.к. php не поддерживает многопоточную работу с сессиями. Даже для банального чтения...
  • Вопрос задан
  • 3774 просмотра
Подписаться 6 Оценить Комментировать
Решения вопроса 1
wielski
@wielski Автор вопроса
✔ Совет: Вам помогли? Отметьте ответы решением.
Сделал маленький хак - передаю все данные из сессии в закодированном виде, в POST запросе.
На выходе получаю все данные из неё :)
А все записанные данные в переменную $_SESSION возвращаю в json виде, и при получении записываю куда надо.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
ScorpLeX
@ScorpLeX
Сессии хранятся в файлах, можно открыть как файл и распарсить с помощью session_decode, но нужно будет все равно сделать session_start перед session_decode, обнулив сессию перед этим например.

PS вообще это бред, используйте базу, что бы хранить данные.
Ответ написан
Комментировать
mlnkv
@mlnkv
JavaScript Developer
есть такая функция, может поможет

/**
 * Wraps around $_SESSION
 *
 * @param string $name name of session variable to set
 * @param mixed $value value for the variable. Set this to null to unset the variable from the session.
 *
 * @return mixed value for the session variable
 */
function session($name, $value = null) {

    static $session_active = false;

    if ($session_active === false) {

        if (($current = ini_get('session.use_trans_sid')) === false)
            exit('Calls to session() requires [session.use_trans_sid] to be set');

        $test = "mix{$current}{$current}";

        $prev = @ini_set('session.use_trans_sid', $test);
        $peek = @ini_set('session.use_trans_sid', $current);

        if ($peek !== $current && $peek !== false)
            session_start();

        $session_active = true;
    }

    if (func_num_args() === 1)
        return (isset($_SESSION[$name]) ? $_SESSION[$name] : null);

    if ($value === null)
        unset($_SESSION[$name]);
    else
        $_SESSION[$name] = $value;
}
Ответ написан
Комментировать
fornit1917
@fornit1917
1. Для хранения сессии можно использовать не только файлы, но и хранилища, поддерживающие многопоточность (memcached, redis, реляционные бд,....).
2. Даже если используете файлы, что мешает вам вызвать session_write_close перед тем, как запускать curl?
Ответ написан
@dmeshkov
session_write_close() позволит читать данные сессии во много потоков
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы