2013-06-06 5 views
4

Во-первых, мой конкретный вопрос. Должно ли это работать?Чтение переменных сеанса после session_write_close

<?php 
    session_start(); 
    $_SESSION['test']='TEST_CONTENT'; 

    echo '1: ',$_SESSION['test']; 
    echo '<br>'; 

    session_write_close(); 

    echo '2: ',$_SESSION['test'] 
?> 

Теперь, некоторые справочные данные. У нас есть веб-приложение с Frameset (не заставляйте меня начинать ... нет, нет денег, чтобы изменить это), и мы обнаружили, что в некоторых случаях наши переменные SESSION не записывались в базу данных! После некоторого трудного тестирования мы обнаружили, что два кадра загружаются одновременно, и, хотя это почти никогда не происходит, первый так называемый кадр завершается после второго. Первый так называемый фрейм переписывал сеанс с ранее сделанной копией (так как в конце скрипта он записывает сеанс).

Наше решение теперь состоит в том, чтобы попытаться вызвать session_write_close() на первом так называемом фрейме, как только мы сможем, но мы обеспокоены тем, что можем все еще читать переменные сеанса (со 100% уверенностью).

+0

Почему бы вам не попробовать и посмотреть, работает ли он? –

+0

Тест, и perphaps вы могли бы перевести переменные сеанса в другой var (не уверен, хотя) – MKroeders

+0

Можете ли вы 'session_start' снова, сразу после его закрытия? –

ответ

1

Ну, думая об этом, вы могли бы реализовать другим способом.

Как реализовать это просто тихий

session_start(); 
$_SESSION['timestamp'] = time(); 

Это будет поставлен выше в сценарии.

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

Затем проверьте, если метка времени в текущей записи является heigher или ниже. если он ниже, то обновляется, иначе забывайте обновлять и просто ничего не делать. Следует учитывать microtime(). потому что люди любят нажимать f5.

Так новая идея, и я думаю, что это работает немного лучше и заставки для производства в


Чтобы ответить на комментарий:

Посмотрите на session handler, вы можете сделать свою собственную функцию, как PHP обрабатывает сеанс. Поэтому вам не нужно реорганизовывать код, а только добавлять.

Затем в записи укажите, что в базе данных обновлена ​​запись с идентификатором x и где метка времени выше заданного значения.

Для реализации вы должны добавить столбец к отметке timestamp/mincrotime. А в обработчике сеанса вы сохраняете время запроса. Поэтому вы можете провести сравнение. Тогда вам не нужно сохранять время в сеансе либо :) (не в $ _SESSION, он сохраняется в db!)

+0

Мне нравится эта линия рассуждений как обход. Я думаю о реализации этой идеи, но не только имея в виду текущий счетчик транзакций // временную метку сеанса сеанса, но также проверяет, вообще ли вообще был изменен сеанс во время выполнения полного скрипта. Любая идея, как я могу «забыть обновить и просто ничего не делать»? Насколько я знаю, сессия записывается автоматически после завершения скрипта ... – Spork

+0

См. Расширенный ответ – MKroeders

Смежные вопросы