Я рад, что вы понимаете, что это только плохое и временное решение, и вы должны оптимизировать свой код.
Забудьте свои жетоны и прочее.
Самый простой и все же эффективный способ - это, вероятно, иметь эксклюзивную блокировку файла для общего файла на одну операцию. Вы можете представить это как кусок дерева, и только один может иметь удостоверение личности, и только тому, кто его держит, разрешено говорить или что-то делать.
<?php
$fp = fopen("/tmp/only-one-bed-available.txt", "w+");
if (flock($fp, LOCK_EX)) { // do an exclusive lock
// do some very important critical stuff here which must not be interrupted:
// sleeping.
sleep(60);
echo "I now slept 60 seconds";
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
?>
Если вы выполните этот сценарий 10 раз параллельно, для его завершения потребуется 10 минут (поскольку доступна только одна кровать!), И вы будете видеть эхо «Я сейчас спал ...» каждые 60 секунд (приблизительно).
Это сериализует ВСЕ выполнения этого кода ГЛОБАЛЬНО.
Это, вероятно, не то, что вы хотите (вы хотите это для каждого пользователя, не так ли?)
Я уверен, что у вас есть что-то вроде User-ID, в противном случае используйте иностранный IP-адрес, и у каждого пользователя есть уникальное имя:
<?php $fp = fopen("/tmp/lock-".$_SERVER["REMOTE_ADDR"].".txt", "w+"); ?>
Вы также можете определить имя файла блокировки для группы операций. Maby пользователь может делать некоторые вещи параллельно, но только эта операция создает проблемы? Присвойте ему тег и включите его в блокировку имени файла!
Эта практика действительно не так уж плоха и может быть использована! Есть только небольшие способы сделать это быстрее (внутренняя часть mysql, сегменты разделяемой памяти, сериализация на более высоком уровне, таком как балансировщик нагрузки ...)
С помощью решения, опубликованного выше, вы можете сделать это в своем приложении, что, вероятно, хорошо.
Вы можете использовать ту же схему в Mysql:
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_get-lock
Но реализация PHP, вероятно, проще и лучше для вашего случая использования.
Если вы действительно хотите надрать задницу, есть еще более элегантное решение,
просто проверьте эту функцию http://www.php.net/manual/en/function.sem-get.php