Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$cache_size_file = fopen(CACHE.'/size', 'c+b');
$time = microtime(true);
while (!flock($cache_size_file, LOCK_EX)) {
if ($time < microtime() - .5) {
fclose($cache_size_file);
return false;
}
time_nanosleep(0, 1000000);
}
unset($time);
/**
Some work here
*/
flock($cache_size_file, LOCK_UN);
fclose($cache_size_file);
function canUseApc() {
return extension_loaded('apc') && ini_get('apc.enabled') && php_sapi_name() !== 'cli';
}
function getFlagFromFile($filename) {
if (file_exists($filename)) {
if (!$this->validate()) {
if ($this->canUseApc() && apc_add('some_key', 1)) { //***
unlink($filename);
apc_delete('some_key'); //***
}
return false;
}
else {
return file_get_contents($filename);
}
}
return false;
}
function getFlagFromFile($filename) {
if (file_exists($filename)) {
if (!$this->validate()) {
$sem = sem_get(1); //***
if (sem_acquire($sem) && file_exists($filename)) { //***
unlink($filename);
sem_remove($sem); //***
}
return false;
}
else {
return file_get_contents($filename);
}
}
return false;
}
function getFlagFromFile($filename) {
if (file_exists($filename)) {
if (!$this->validate()) {
if ($race = RaceCondition::prevent('FLAG_'.$filename)) { //***
unlink($filename);
$race->release(); //***
}
return false;
}
else {
return file_get_contents($filename);
}
}
return false;
}
while (!flock($cache_size_file, LOCK_EX)) {
if ($time < microtime() - .5) {
fclose($cache_size_file);
return false;
}
time_nanosleep(0, 1000000);
}
Боремся с race condition в PHP