使用PHP的同步函数

使用PHP的同步函数,php,synchronization,synchronized,Php,Synchronization,Synchronized,如何使PHP中的函数同步,使相同的函数不会同时执行?第二个用户必须等待第一个用户完成该功能。然后第二个用户可以执行该功能 谢谢您正在寻找 请记住,使用信号量(或任何其他阻塞机制)可能会有严重的性能问题,因为在信号量启动时无法处理请求。我不知道: 函数检查名为isFunctionRunning的数据库字段是否等于1。如果没有,开始执行 将名为isFunctionRunning的数据库字段更新为1 函数在这里有魔力 将名为isFunctionRunning的数据库字段更新为0 但不知何故,我认为

如何使PHP中的函数同步,使相同的函数不会同时执行?第二个用户必须等待第一个用户完成该功能。然后第二个用户可以执行该功能

谢谢

您正在寻找


请记住,使用信号量(或任何其他阻塞机制)可能会有严重的性能问题,因为在信号量启动时无法处理请求。

我不知道:

  • 函数检查名为isFunctionRunning的数据库字段是否等于1。如果没有,开始执行
  • 将名为isFunctionRunning的数据库字段更新为1
  • 函数在这里有魔力
  • 将名为isFunctionRunning的数据库字段更新为0
但不知何故,我认为你试图做的是“错误的”,可以通过另一种方式实现。如果你说得更详细一些,我会帮你的


编辑:不知道php信号量,上面的答案会快得多。

这基本上归结为在某个地方设置一个标志,表示函数已锁定,并且在第一个调用方从该函数返回之前无法执行。 这可以通过多种方式实现:

  • 使用锁定文件(第一个函数锁定文件名“f.lok”,第二个函数检查锁定文件是否存在并基于该评估执行或不执行)
  • 在数据库中设置标志(不推荐)
  • 使用@JvdBerg建议的信号量(最快)
在编写并发应用程序时,请始终注意竞争条件和死锁

更新 使用信号量(未测试):

您可以使用带有“
LOCK\u EX
”(独占锁定)标志的“
flock
”(文件锁定)函数来创建一个自定义的“synchronized”函数,该函数接受要同步的处理程序

您可以找到代码


我希望这会有所帮助。

看起来不可能通过php实现,但无法通过php实现?如果isFunctionRunning返回1,我如何告诉php等待isFunctionRunning返回0if(isFunctionRunning==1){return false;}否则{run function run}另外,不用更新db字段,只需在文件中更新即可(速度更快)。很抱歉,我认为这不起作用,因为在前两个步骤之间,可能会出现并发问题,例如两个线程从运行的
isFunctionRunning
读取相同的0,并认为它们是第一个。这就是为什么=>信号量。感谢您的支持。顺便说一句,如果你能提供我一个代码片段如何实现这一点。感谢PHP代码。让我检查一下,然后再谈you@VladBalmos:“当编码并发时,”你说。。。如果有多个用户同时访问该站点,PHP的所有内容不是都是并发的吗?或者我遗漏了一些基本的东西吗?@Erk你说得对。我指的是在另一个用户修改资源时访问资源并获得一致数据的能力,如果这有意义的话。
<?php

define('SEM_KEY', 1000);

function noconcurrency() {
    $semRes = sem_get(SEM_KEY, 1, 0666, 0); // get the resource for the semaphore

    if(sem_acquire($semRes)) { // try to acquire the semaphore. this function will block until the sem will be available
        // do the work 
        sem_release($semRes); // release the semaphore so other process can use it
    }
}