Helper Lock


1Apresentação

Helper usado para travar o acesso a um arquivo. Se nenhum arquivo for especificado, o script PHP em execução será travado.

O objeto pode ser utilizado de duas formas diferentes: instanciando-o de maneira convencional, ou usando métodos estáticos.
Cada solução é usada de uma forma diferente:

  • Chamadas estáticas: por padrão, o travamento é não bloqueante (se o arquivo já estiver travado, a função retorna false imediatamente). Para destravar o arquivo, outra função estática deve ser chamada, informando novamente o caminho do arquivo que foi travado.
  • Instanciação: por padrão, o travamento é bloqueante (se o arquivo já estiver travado, o objeto aguarda que ele seja liberado antes de travá-lo por sua vez, para então devolver o controle). Para destravar o arquivo, a instância do objeto deve ser destruída.

Arquivos ainda travados ao final da execução do script são destravados automaticamente. Portanto, nem sempre é necessário destravá-los explicitamente.


2Chamadas estáticas

A maneira mais simples de travar (de forma não bloqueante) a execução de um script é escrever o seguinte código:

use \Temma\Utils\Lock as TµLock;

if (!TµLock::lock()) {
    // o programa já está em execução
    exit();
}
// restante do script

Para travar um arquivo específico, e destravá-lo posteriormente:

use \Temma\Utils\Lock as TµLock;

TµLock::lock('/path/to/file', true);
// ... código da aplicação
TµLock::unlock('/path/to/file');

3Instanciação

Para travar o acesso a um arquivo, e destravá-lo posteriormente:

use \Temma\Utils\Lock as TµLock;

// travamento do arquivo
try {
    $lock = new TµLock('/path/to/file');
} catch (\Temma\Exceptions\IO $eio) {
    // ocorreu um erro
}
// ... código da aplicação
// destravamento
unset($lock);

Para travar o acesso a um arquivo de forma não bloqueante, e destravá-lo posteriormente:

use \Temma\Utils\Lock as TµLock;

// travamento do arquivo
try {
    $lock = new TµLock('/path/to/file', false);
} catch (\Temma\Exceptions\IO $eio) {
    // ocorreu um erro
} catch (\Temma\Exceptions\Application $ea) {
    // o arquivo já está travado
}
// ... código da aplicação
// destravamento
unset($lock);