Jsem rád, že si uvědomujete, že je to pouze špatné a dočasné řešení a měli byste svůj kód optimalizovat. Zapomeňte na své tokeny a podobně. Nejjednodušší a stále efektivní způsob je pravděpodobně mít exkluzivní zámek souborů na sdíleném souboru na operaci. Můžete si to představit jako kus dřeva a pouze jeden může držet ID a jen ten, kdo ho drží, smí mluvit nebo něco dělat.
<?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);
?>
Pokud tento skript spustíte 10krát paralelně, jeho dokončení bude trvat 10 minut (protože je k dispozici pouze jedna postel!) a každých 60 sekund (přibližně) uvidíte ozvěnu „Teď jsem spal...“.
Toto serializuje VŠECHNA spuštění tohoto kódu GLOBÁLNĚ.Toto pravděpodobně není to, co chcete (chcete to na základě jednotlivých uživatelů, že?)Jsem si jistý, že máte něco jako User-ID, jinak použijte cizí IP-adresu a mít pro každého uživatele jedinečný název souboru:
<?php $fp = fopen("/tmp/lock-".$_SERVER["REMOTE_ADDR"].".txt", "w+"); ?>
Můžete také definovat název souboru zámku pro skupinu operací. Máby uživatel může dělat nějaké věci paralelně, ale pouze tato operace dělá problémy? Dejte mu značku a vložte ji do názvu souboru zámku!
Tato praxe opravdu není tak špatná a dá se použít! Existuje jen málo způsobů, jak to udělat rychleji (interní informace mysql, segmenty sdílené paměti, serializace na vyšší vrstvě, jako je load balancer...)
S řešením uvedeným výše to můžete udělat ve své aplikaci, což je pravděpodobně dobré. Stejné schéma můžete použít také v Mysql:http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_get-lock
Ale implementace PHP je pravděpodobně jednodušší a lepší pro váš případ použití.
Pokud opravdu chcete nakopat ještě elegantnější řešení, podívejte se na tuto funkci http://www.php.net/manual/cs/function.sem-get.php