С помощью закладок Джеффа « Расовые условия с Ajax и PHP-сессиями » Энди «сорвал» Бакуна является выдающимся анализом проблемы, о которой уже говорилось в этом блоге.
На самом деле название почти вводит в заблуждение — первая половина рассматривает «параллельную обработку» в Javascript с некоторой ценной информацией — т.е. вы хотите прочитать это, даже если вы не используете PHP.
Во второй половине рассматривается создание собственного обработчика сеанса PHP (стандартный обработчик сеанса PHP не страдает от состояния гонки, но может стать проблематичным, как только вы начнете обрабатывать серьезный трафик), приводя к очень хитрой стратегии, которая позволяет блокировать одну переменную сеанса. (а не весь сеанс) через перегрузку переменной $_SESSION
SPL — фактически альтернативы использованию session_set_save_handler () — будем надеяться, что это станет признаваться как функция, которая нуждается в поддержке.
И это впечатляет, чтобы увидеть что-то подобное в PHP-контенте …
встроенный обработчик сеанса [PHP] использует системный вызов flock (2) […]. Это можно проверить, используя strace для вывода списка всех системных вызовов, выполняемых процессом. Вот важный бит:
open ("/ var / lib / php / session / sess_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", O_RDWR | O_CREAT, 0600) = 18 стая (18, LOCK_EX) = 0 fcntl64 (18, F_SETFD, FD_CLOEXEC) = 0 fstat64 (18, {st_mode = S_IFREG | 0600, st_size = 11, ...}) = 0 pread64 (18, «count | i: 17;», 11, 0) = 11 , , , , pwrite64 (18, «count | i: 18;», 11, 0) = 11 close (18) = 0
Дополнительное замечание — я согласен с большинством проблем Энди с PHP — гораздо ближе к цели, чем те проблемы, которые вы обычно встречаете в PHP, — отстой в веб-ринге .