многопоточность — Как создать механизм блокировки php на параллельные запросы?

Скажем, у меня есть приложение, получающее параллельные запросы.
Пользователь A и B отправляют запросы одновременно, мне нужно обрабатывать запросы в очереди.

Мне нужно что-то вроде этого:

function processRequests() {
if(locked()) {
wait();
}

$this->lock();
...process...
$this->unlock();
}

Существуют ли какие-либо пакеты или шаблоны, помогающие решить эту проблему?

ПОЖАЛУЙСТА, НЕ ПРЕДЛАГАЙТЕ ЛЮБЫХ РЕШЕНИЙ «MESSAGE QUEUE SERVER»!

2

Решение

Использование 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');
}
2

Другие решения

Вы могли бы злоупотреблять 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);
}
?>
1