Поскольку PHP-скрипты не являются многопоточными, я не считаю, что важные разделы релевантны. Я согласен, что у вас есть условие гонки, потому что несколько экземпляров запускаются параллельно, но критический раздел не решит вашу проблему.
Если вы используете обработчик сеанса на основе файлов, вы можете попробовать базовый flock()
. Если вы используете базу данных, вы можете попробовать использовать механизм блокировки двигателя (предпочтительно, на уровне строк). Если вы используете memcached, вы можете попробовать реализовать распределенную систему блокировки.
Вы не захотите применять замок слишком широко. Вам нужно что-то как можно более зернистое (возможно, привязано к идентификатору сеанса). Если вы попытаетесь выполнить сериализацию всего поведения сеанса, вы столкнетесь с огромным узким местом.
В мире баз данных (и в других местах) оптимистичные «блокировки» - это все, что вам нужно. Они включают в себя простой счетчик, который увеличивается. Если счетчик «выключен» (столкновение), запись не обновляется, и вы можете повторно выбирать и применять свои различия по мере необходимости. Это вещь типа UPDATE table WHERE count = lastcount
в сочетании с повторением. Это часто делает трюк.
Конечно, вы можете использовать блокировку файлов, семафоры SYSV (экономно) и множество других методов для достижения этой цели. Просто помните, это звучит как состояние гонки, но оно не имеет ничего общего с потоками.
С каковой ситуацией вы занимаетесь? Я не уверен, о чем вы думаете, поскольку проблема связана с PHP. – cletus
Это проблема, если у вас много изменений состояния по параллельным запросам вне порядка. Вам необходимо выполнить сериализацию изменений состояния для сеанса, чтобы предотвратить переписывание запросов друг друга. – pestilence669