publero/critical-section

在并行执行多个PHP脚本时处理临界区。适用于cron和任何其他定期运行的脚本。

dev-master / 1.0.x-dev 2013-08-26 10:00 UTC

This package is not auto-updated.

Last update: 2024-09-24 05:20:57 UTC


README

Build Status

这个库处理代码临界区的问题,该临界区应该一次只执行一次。

示例用例

你有一个每分钟执行一次的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问题跟踪器中进行跟踪。