【问题标题】:Synchronized functions using PHP使用 PHP 的同步函数
【发布时间】:2012-09-11 16:29:02
【问题描述】:

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

谢谢

【问题讨论】:

    标签: php synchronization synchronized


    【解决方案1】:

    您可以使用“flock”(文件锁定)函数和“LOCK_EX”(排他锁)标志来创建一个自定义“同步”函数,该函数接受要同步的处理程序。

    您可能会找到代码here

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

      • 使用锁定文件(第一个函数锁定文件名“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_* 函数

      这里有一个在 PHP 中使用信号量的更深入的教程:

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

      【讨论】:

      • 感谢您的支持。顺便说一句,如果你能给我一个代码 sn-p 这是如何实现的。
      • 感谢 PHP 代码。让我检查一下并回复你
      • @VladBalmos:“当编码并发时,”你说……如果多个用户同时访问该站点,PHP 不是所有的东西都是并发的,还是我错过了一些基本的东西?跨度>
      • @Erk 你是对的。我指的是在其他用户修改资源时访问资源并获得一致数据(如果有意义的话)的能力。
      【解决方案3】:

      您正在寻找Semaphore

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

      【讨论】:

        【解决方案4】:

        在我的头顶上:

        • 函数检查名为 isFunctionRunning 的数据库字段是否等于 1。如果不开始执行
        • 您将名为 isFunctionRunning 的数据库字段更新为 1
        • 函数在这里变魔术
        • 您将名为 isFunctionRunning 的数据库字段更新为 0

        但不知何故,我认为您正在尝试做的是“错误的”,可以通过另一种方式实现。如果你能说得更详细一些会有所帮助

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

        【讨论】:

        • 貌似无法通过php实现
        • 什么是不能通过php实现的?
        • 如果 isFunctionRunning 返回 1,我如何告诉 PHP 等到 isFunctionRunning 返回 0
        • if (isFunctionRunning == 1) { return false; } else { 运行函数运行 } p.s.而不是更新数据库字段,您可以在文件中执行此操作(会更快)。
        • 抱歉,我的事情不起作用,因为在前 2 个步骤之间,您可能会遇到并发问题,例如 2 个线程从 isFunctionRunningthink读取相同的 0 > 他们是第一个。这就是为什么 => 信号量。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 2012-07-25
        • 1970-01-01
        • 2013-12-25
        • 2019-09-02
        • 2010-11-22
        • 2020-04-20
        相关资源
        最近更新 更多