cosmic-beacon/critical-section

在并行执行多个 PHP 脚本时处理关键部分。适用于 cron 和任何其他定期运行的脚本。

1.0.0 2015-10-06 07:19 UTC

This package is not auto-updated.

Last update: 2024-09-18 09:51:38 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);
}

请注意,如果您使用超时,您必须检查 enter 返回了 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);
}

报告问题或功能请求

问题和功能请求在 Github 问题跟踪器 中跟踪。