Как защитить критический раздел в PHP? - PullRequest
2 голосов
/ 05 апреля 2010

Я провел поиск по этой теме, но ничего ценного не нашел.

Если я не использую обработчик сеансов PHP по умолчанию, на уровне запроса блокировка сеанса отсутствует. Итак, я должен защитить критическую секцию сам.

В Java у нас синхронизировано . В C # у нас есть lock .

В PHP как это сделать?

Ответы [ 3 ]

4 голосов
/ 05 апреля 2010

Используйте семафоры для этого.

3 голосов
/ 05 апреля 2010

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

Если вы используете файловый обработчик сеанса, вы можете попробовать базовый flock(). Если вы используете базу данных, вы можете попробовать использовать собственный механизм блокировки (предпочтительно на уровне строк). Если вы используете memcached, вы можете попробовать реализовать систему распределенной блокировки.

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

В мире баз данных (и в других местах) оптимистические «блокировки» - это все, что вам нужно. Они включают в себя простой счетчик, который увеличивается. Если счетчик «выключен», (коллизия) запись не обновляется, и вы можете повторно выбрать и применить свои различия в зависимости от ситуации. Это вещь типа UPDATE table WHERE count = lastcount в сочетании с повторной попыткой. Это часто помогает.

Конечно, вы можете использовать блокировку файлов, семафоры SYSV (экономно) и множество других методов для достижения этой цели. Просто помните, что это похоже на состояние гонки, но это не имеет никакого отношения к нитям.

0 голосов
/ 05 апреля 2010

В большинстве случаев вам не приходится иметь дело с критическим разделом, потому что в PHP нет потоковой модели (нет разделения памяти). Я даже не думаю, что semephores доступен для вас. PHP использует « Архитектура без общего доступа », как вы можете видеть на слайдах создателя PHP Расмуса Лердорфа. Это означает, что, как вы видите на слайде,

Общие данные передаются на слой хранилища данных

С помощью простого PHP-скрипта, работающего поверх Apache, вам даже не придется иметь дело с критическими секциями. Вы должны взаимодействовать с данными через вашу базу данных. Вы также можете использовать файлы и блокировать их, но я бы использовал базу данных вместо файлов.

Надеюсь, это немного ответит на ваш вопрос.

...