0

我想要一个 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 主机。

4

1 回答 1

0

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

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

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

PHP 共享内存

于 2018-08-16T11:08:10.393 回答