desmart/laravel-padlock

Laravel 的脚本锁定机制。允许在一定时间内阻止脚本执行,例如避免 CRON 作业重叠

1.2.2 2017-04-10 08:16 UTC

This package is not auto-updated.

Last update: 2024-09-14 20:45:52 UTC


README

Build Status

此包允许您轻松地临时锁定脚本执行。

在某些情况下可能很有用,例如与不可靠的 APIS 连接的 CRON 作业,您不能100%确信脚本不会在某一点失败。

要求

此包需要

  • PHP >= 7.0.0
  • Laravel 5.3 || 5.4

安装

  1. $ composer require desmart/laravel-padlock
  2. DeSmart\Padlock\ServiceProvider 添加到您的 config/app.php
        /*
         * Package Service Providers...
         */
        DeSmart\Padlock\ServiceProvider::class,
  1. $ php artisan vendor:publish --provider="DeSmart\Padlock\ServiceProvider"
  2. config/padlock.php 中进行配置 - 在数据库和文件系统驱动之间进行选择

示例用法

此包的目的是保护您的脚本不被多线程运行。

它对长时间运行的后端作业很有用,例如处理查询或从外部 API 收集数据。

class FooCommand extends \Illuminate\Console\Command
{
    protected $signature = 'foo:bar';

    protected $description = 'Foo command utilizing Padlock';

    /** @var PadlockHandler */
    private $padlockHandler;

    const PADLOCK_SCRIPT = 'FooCommand';

    /** 30 seconds padlock time to live - after that your padlock will be unlocked */
    const PADLOCK_TTL = 30;

    /**
     * FooCommand constructor.
     * @param \DeSmart\Padlock\PadlockHandler $padlockHandler
     */
    public function __construct(\DeSmart\Padlock\PadlockHandler $padlockHandler)
    {
        parent::__construct();

        $this->padlockHandler = $padlockHandler;
    }

    public function handle()
    {
        if (true === $this->padlockHandler->isLocked(self::PADLOCK_SCRIPT, self::PADLOCK_TTL)) {
            echo "Padlock exists, script locked." . PHP_EOL;

            return;
        }

        $this->padlockHandler->lock(self::PADLOCK_SCRIPT);
        
        // do your stuff
        
        $this->padlockHandler->unlock(self::PADLOCK_SCRIPT);
    }
}