publero / critical-section
在并行执行多个PHP脚本时处理临界区。适用于cron和任何其他定期运行的脚本。
dev-master / 1.0.x-dev
2013-08-26 10:00 UTC
Requires
- php: >= 5.4.0
This package is not auto-updated.
Last update: 2024-09-24 05:20:57 UTC
README
这个库处理代码临界区的问题,该临界区应该一次只执行一次。
示例用例
你有一个每分钟执行一次的cron任务,但执行需要一些时间。当服务器负载达到临界时,它可能需要超过一分钟,这会导致同一cron在同一时间内被多个进程执行,从而引发错误。
你可以使用这个库将此代码封装到临界区中。
$criticalSection = new FileCriticalSection(); $criticalSection->enter('cron_long_task'); doSomething(); $criticalSection->leave('cron_long_task');
此代码示例处理临界区。你说哪个临界区应该进入。在这种情况下,它是cron_long_task
。在没有原始脚本离开临界区之前,没有其他脚本可以进入这个临界区。请注意,即使脚本结束或CriticalSection
对象被销毁,临界区也会被释放。
如果你想进入临界区,脚本将等待直到它可以进入。如果你需要跳过已经处于临界区的代码,可以使用超时或canEnter
方法。
超时临界区
你也可以进行超时进入。这样,你可以明确地说脚本应该等待多长时间才能进入临界区。如果你知道某些操作只在某些时间间隔内才有意义,这很有用。
$criticalSection = new FileCriticalSection(); $code = __FILE__; if ($criticalSection->enter($code, 30)) { doSomething(); $criticalSection->leave($code); }
请注意,如果你使用超时,你必须检查是否返回了true。
检查代码是否可以进入临界区
如果你使用每分钟cron(甚至更快),我们可以假设你可以在某些地方跳过一个或两个调用。为此,你可以在进入临界区之前检查临界区是否可以进入。
$criticalSection = new FileCriticalSection(); $code = __FILE__; if ($criticalSection->canEnter($code)) { $criticalSection->enter($code); doSomething(); $criticalSection->leave($code); }
另一种方法是使用零超时进入临界区。
$criticalSection = new FileCriticalSection(); $code = __FILE__; if ($criticalSection->enter($code, 0)) { doSomething(); $criticalSection->leave($code); }
许可协议
此捆绑包受MIT许可协议的约束。请参阅捆绑包中的完整许可证。
LICENSE
报告问题或功能请求
问题和功能请求在Github问题跟踪器中进行跟踪。