Обновление сеанса через несколько вызовов AJAX - PullRequest
3 голосов
/ 10 ноября 2011

"Проблема:"
Я вызываю с помощью ajax файл handler.php несколько раз.

В handler.php у меня есть:

session_start();
$_SESSION['foo'] .= 'abc';

echo 'Session var: '.$_SESSION['foo'].'<br>';

Теперь я вижу:

Session var: abc
Session var: abc
Session var: abc
... etc

Вместо:

Session var: abc
Session var: abcabc
Session var: abcabcabc

В чем проблема?
Надеюсь, вы поняли:)

РЕДАКТИРОВАТЬ: я забыл упомянуть, что иногда я получаю второе (что обычно ожидают), но большую часть времени я получаю первую версию,

Ответы [ 3 ]

2 голосов
/ 10 ноября 2011

Возможно, определите $_SESSION['foo'] как пустую строку перед добавлением чего-либо к ней:

session_start();

// prevent caching
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");

if (!isset($_SESSION['foo']))
  $_SESSION['foo'] = '';

$_SESSION['foo'] .= 'abc';

echo 'Session var: '.$_SESSION['foo'].'<br>';

Проверьте также, включены ли в вашем браузере файлы cookie.

0 голосов
/ 16 августа 2017

Я знаю, что это очень старый вопрос, но я наткнулся на него, пытаясь подтвердить то, что прочитал ранее сегодня, после того, как столкнулся с тем же поведением.

Для моего приложения мы уже используемsession_start () и обрабатывают сеанс с помощью пользовательских обработчиков базы данных.Но мы все еще получали ошибки при записи данных в сеанс в различных AJAX-запросах.

Проблема с запуском параллельных AJAX-запросов, которые манипулируют данными сеанса, состоит в том, что PHP по умолчанию разрешает только одному сценарию иметь доступ к сеансу ввремя: с момента, когда он вызывает session_start (), до времени, когда он выходит или иным образом вызывает session_write_close ().Когда у вас одновременно происходит несколько запросов AJAX, которые необходимо записать в сеанс, они могут наступить друг на друга, и вы получите неполные данные.

Это объясняет это лучше, чем я: [http://konrness.com/php5/how-to-prevent-blocking-php-requests].

Мое конкретное решение состояло в том, чтобы хранить данные вне сеанса (в другом месте базы данных), чтобы другие запросы AJAX не наступали на мои изменения.

0 голосов
/ 01 марта 2012

Я нашел решение ... так что через 4 месяца я могу ответить на него:)

Решение кажется очень простым, но я сначала не думал об этом.Я думал, что это «более глубокая» проблема, потому что мой код очень длинный .. Поэтому решение было включить session_start ();в файле «index.php» (где вы вызываете сам ajax или куда вы включили файл .js).Я надеюсь, что это поможет, если кто-то в будущем столкнется с этими глупыми «симптомами». * Так что, даже если вы не используете сессии в файле «index.php», вы должны включить там session_start (), если вы хотите использовать сессиив php-файле "обработчика" ajax.

(Вы должны включить session_start (); конечно, и в hander.php.)

...