使用PHP的同步函数

时间:2012-09-19 11:03:30

标签: php synchronization synchronized

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

由于

4 个答案:

答案 0 :(得分:11)

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

  • 使用锁定文件(第一个函数锁定文件名“f.lok”,第二个函数检查锁定文件是否存在并执行或不基于该评估)
  • 在数据库中设置一个标志(不推荐)
  • 使用信号量作为@JvdBerg建议(最快)

编码并发应用程序时始终要注意竞争条件和死锁!

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

<?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
    }
}

PHP需要使用sysvsem支持进行编译才能使用sem_ * functions

以下是在PHP中使用信号量的更深入的教程:

http://www.re-cycledair.com/php-dark-arts-semaphores

答案 1 :(得分:10)

您正在寻找Semaphore

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

答案 2 :(得分:0)

脱离我的头顶:

  • 函数检查名为isFunctionRunning的数据库字段是否等于1.如果没有开始执行
  • 将名为isFunctionRunning的数据库字段更新为1
  • 这里的功能很神奇
  • 将名为isFunctionRunning的数据库字段更新为0

但不知怎的,我认为你要做的是“错误”,可以通过另一种方式实现。如果你说更多细节可以帮助

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

答案 3 :(得分:0)

您可以将“ flock”(文件锁定)功能与“ LOCK_EX”(排他锁)标志一起使用,以创建一个自定义的“同步”功能,该功能接受要同步的处理程序。 / p>

您可能会找到代码here

我希望这会有所帮助。