Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在并发请求上创建php阻塞机制?_Php_Multithreading_Locking_Blocking - Fatal编程技术网

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

如何在并发请求上创建php阻塞机制?,php,multithreading,locking,blocking,Php,Multithreading,Locking,Blocking,假设我有一个接收并发请求的应用程序。 用户A和B同时发送请求,我需要处理队列中的请求 我需要这样的东西: function processRequests() { if(locked()) { wait(); } $this->lock(); ...process... $this->unlock(); } 是否有任何包或模式可以帮助解决此问题 请不要提供任何“消息队列服务器”解决方案 使用PHP,您可以实现一个简单的锁定系统,该系统将尝试获取一个基于

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

我需要这样的东西:

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

  $this->lock();
  ...process...
  $this->unlock();
}
是否有任何包或模式可以帮助解决此问题

请不要提供任何“消息队列服务器”解决方案

使用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\u-EX)
将阻塞,直到另一个进程在
flock($f,LOCK\u-UN)
中释放锁。更多关于



将请求添加到数据库(insert),有一个单独的进程不断检查尚未处理的最低id记录,并对其进行处理。您必须利用与数据库或文件锁定相关的东西。PHP中的每个请求都在其自己的进程中执行,因此除非您以某种方式序列化并持久化它,否则很难让对象相互“检查”。为什么需要这样做?您使用类吗?如果使用,则可以执行以下操作:
类请求{
私有静态$locked=false;
静态函数进程(){
如果(self::$locked==true){
/*等待();*/
死亡('locked');//删除它
self::$locked=true;
/self::$locked=false;
\Requests::process()
\Requests::process()您可能需要一个信号量-
<?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);
}
?>