cosmic-beacon / critical-section
在并行执行多个 PHP 脚本时处理关键部分。适用于 cron 和任何其他定期运行的脚本。
1.0.0
2015-10-06 07:19 UTC
Requires
- php: >= 5.6.0
Requires (Dev)
- fabpot/php-cs-fixer: ~1.10
- phpunit/phpunit: ~5.0
This package is not auto-updated.
Last update: 2024-09-18 09:51:38 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); }
请注意,如果您使用超时,您必须检查 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 问题跟踪器 中跟踪。