如何在并发请求上创建php阻塞机制?

时间:2014-11-26 12:56:36

标签: php multithreading locking blocking

假设我有一个接收并发请求的应用程序。 用户A和B同时发送请求,我需要处理队列中的请求。

我需要这样的东西:

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

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

是否有任何包或图案有助于解决此问题?

请不要提供任何“MESSAGE QUEUE SERVER”解决方案!

2 个答案:

答案 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);
}
?>