假设我有一个接收并发请求的应用程序。 用户A和B同时发送请求,我需要处理队列中的请求。
我需要这样的东西:
function processRequests() {
if(locked()) {
wait();
}
$this->lock();
...process...
$this->unlock();
}
是否有任何包或图案有助于解决此问题?
请不要提供任何“MESSAGE QUEUE SERVER”解决方案!
答案 0 :(得分:2)
使用PHP Semaphore functions,您可以实现一个简单的锁定系统,该系统将尝试根据识别您要锁定的资源的密钥获取锁。 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');
}
答案 1 :(得分:1)
您可以滥用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);
}
?>