PHP 锁定进程,直到唤醒或达到超时


PHP lock process until awaken or timeout reached

我希望一个PHP脚本锁定自己(即等待没有CPU使用率,没有轮询),直到被其他PHP脚本唤醒或达到X秒的特定超时。

此外,我希望 IPC 以二进制信号灯的方式工作,除了释放信号量的进程不会是获取它的进程。显然,这在 sem_release() 中是不可能的:

sem_release()释放信号量(如果它当前由 调用进程,否则将生成警告。

获取锁的过程负责处理大量数据,无论谁释放信号量,都表明它已准备好处理。我们将 P1 命名为处理数据的进程,将 P2 命名为生成数据的进程,从而指示 P1 新数据可用于处理。当 P1 处理其他数据时,P2 可能会多次向 P1 提供新数据,但是当 P1 决定处理新数据时,所有数据都会被处理,这意味着 P1 不应该每次 P2 发出有新数据的信号时都获取。如果中间没有可用的数据,则连续两次运行 P1 应阻塞。

这就是为什么我试图实现:

Time     Event                       Semaphore Status
  0     P1 attempts acquire     Unavailable / Process waiting
  1     P2 releases              Available / Process waiting
        P1 acquires              Unavailable / Process running
  2     P2 releases              Available  / Process running
  3     P2 releases              Available  / Process running
  4     P1 acquires             Unavailable / Process running
  5     P1 attempts acquire     Unavailable / Process waiting
------- after X seconds
 10     TimeOut, P1 goes on     Unavailable / Process running
 11     P2 releases             Available   / Process running
 12     P1 acquires             Unavailable / Process running
 ...

我担心使用消息队列等其他方法可能会导致丢失某些事件(即循环直到队列为空以清除它),所以我想保持简单。

我只想使用 PHP,但可以假设是 Linux 主机。

我认为(唯一?)如果您想要另一个进程而不是获取锁的进程来释放它,则可以逃脱这种情况,方法是将锁存储在共享内存中。

例如,创建一个使用锁定文件或类似的东西充当锁的类,将锁对象存储在共享内存中,在辅助进程中访问它并释放它。

我通常使用lockfiles等来确保辅助进程不会运行某段代码,而其他进程正在运行它。因此,只有创建锁的进程才能释放它。因此,您希望如何跟踪允许哪些并行进程释放锁是您需要弄清楚的事情。

PHP 共享内存