Новое в Symfony 2.6: LockHandler

File locking это механизм, который позволяет ограничивать доступ к файлу, разрешая его только для конкретного пользователя или процесса в конкретный момент времени. Этот механизм был введен еще в 1963 для мэйнфреймов и это будет его дебют в Symfony начиная с версии 2.6.

Новый класс LockHandler обеспечивает простую абстракцию, позволяющую залочить что либо, например залочить файл. Простой пример, иногда это необходимо чтобы избежать ситуации гонки, заблокировав команду таким образом, чтобы эта команда не могла быть запущена параллельно другими процессами.

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\LockHandler;

class UpdateContentsCommand extends Command
{
    protected function configure()
    {
        // ...
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // create the lock
        $lock = new LockHandler('update:contents');
        if (!$lock->lock()) {
            $output->writeln('The command is already running in another process.');

            return 0;
        }

        // ... do some task

        // (optional) release the lock (otherwise, PHP will do it
        // for you automatically)
        $lock->release();
    }
}

Конструктор LockHandler принимает в качестве первого аргумента идентификатор блокировки, который будет использоваться как часть имени файла, используемого для создания блокировки. По умолчанию, блокировка создается во временном каталоге системы. Если вы хотите использовать определенный каталог, передать его в качестве второго дополнительного аргумента в конструкторе.

Метод lock() возвращает true, если блокировка была установлена и false в противном случае. Кроме того, вы можете передать логический аргумент, чтобы указать, если вы хотите дождаться пока запрошенная блокировка не будет снята. Это полезно, чтобы выполнить команду только после того, как другая заблокированная команда закончит выполнение:

class UpdateContentsCommand extends Command
{
    // ...

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // create the lock
        $lock = new LockHandler('update:contents');

        // wait for the lock release as long as necessary
        if (!$lock->lock(true)) {
            $output->writeln('The command is already running in another process.');

            return 0;
        }

        // ...
    }
}

Lock handler позволяет работать только с файловыми блокировками, потому что алгоритм работы с сетевыми блокировками или с блокировками в базах данных гораздо сложнее. Это означает, что он работает только при использовании одного и только одного хоста. Если вы работаете с несколькими хостами одновременноэтот хелпер использовать не получится.

Источник: http://symfony.com/blog/new-in-symfony-2-6-lockhandler?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+symfony%2Fblog+%28Symfony+Blog%29

Добавить комментарий

Ваш адрес email не будет опубликован.

5 + 5 =