Скажем, у меня есть приложение, получающее параллельные запросы.
Пользователь A и B отправляют запросы одновременно, мне нужно обрабатывать запросы в очереди.
Мне нужно что-то вроде этого:
function processRequests() {
if(locked()) {
wait();
}
$this->lock();
...process...
$this->unlock();
}
Существуют ли какие-либо пакеты или шаблоны, помогающие решить эту проблему?
ПОЖАЛУЙСТА, НЕ ПРЕДЛАГАЙТЕ ЛЮБЫХ РЕШЕНИЙ «MESSAGE QUEUE SERVER»!
Использование PHP Семафорные функции, Вы можете реализовать простую систему блокировки, которая будет пытаться получить блокировку на основе ключа, который идентифицирует ресурс, который вы хотите заблокировать. sem_acquire
Функция заблокирует и подождет, пока семафор не будет получен:
$sm = sem_get(getmyinode() + hexdec(substr(md5("identifier to lock"), 24)));
if (sem_acquire($sm)) {
...process...
sem_release($sm);
sem_remove($sm);
} else {
throw new \Exception('unable to acquire semaphore');
}
Вы могли бы злоупотреблять flock()
сделать свой собственный семафор. Линия flock($f, LOCK_EX)
будет блокироваться, пока другой процесс не снимет блокировку в flock($f, LOCK_UN)
, Больше на php.net.
<?php
if (! ($f = fopen('/dev/null', 'r')) )
print('Oops, no /dev/null on this system?\n');
else {
flock($f, LOCK_EX);
print("I have the lock, I can do stuff now.\n");
sleep(3);
print("I am done, releasing.\n");
flock($f, LOCK_UN);
fclose($f);
}
?>