domingo, 28 de agosto de 2011

PHP Atomic Locks Arquivo


Bem-vindo ao mundo do armazenamento em cache, você precisa escrever algo para um arquivo, você precisa de algo mais para acessá-lo, mas as coisas vão mal, se todos os lotes de processos de tentar escrever para o mesmo arquivo.
A solução óbvia, própria do PHP  rebanho  (lock file) função, pode ser usado com um simples bloco de código:
<? Php
$ Fp = fopen ( "lock.txt / tmp /" , "r +" );
 
se ( rebanho ( $ fp , LOCK_EX)) { / / faz um bloqueio exclusivo
    fwrite ( $ fp , "escrevemos algo aqui \ n" );
    rebanho ( $ fp , LOCK_UN); / / libera o lock
} mais {
    echo "Não foi possível obter o bloqueio!" ;
}
 
fclose ( $ fp );
?>
A captura com esta solução lindo é que ele na verdade não trabalho ... se você bater com várias solicitações simultâneas, então é mais que provável que vários deles vão passar o bloqueio de arquivos e gravar o arquivo.Isso acontece porque o comando rebanho é não-atômica ou seja, mais que uma instância pode funcionar ao mesmo tempo contra o mesmo arquivo. Enquanto um bando de comando está sendo executado em um processo, outro processo pode rebanho o arquivo e ambos podem completar antes do outro define o significado de bloqueio que eles ganham tanto o bloqueio de arquivos.
Para evitar isso, precisamos usar uma função atômica, sobre o único que tem PHP que é útil é  ligação . Isto significa que ao invés de usar a finalidade projetada comando rebanho para o que foi projetado para, temos de cortar uma solução usando o link em vez disso, como segue:
<? PHP
se (@ link ( '/ tmp / null " , "/ tmp / lock.lck" )) {
 
  $ Fp = fopen ( "lock.txt / tmp /" , "r +" );
  fwrite ( $ fp , "escrevemos algo aqui \ n" );
  fclose ( $ fp );
 
  unlink ( "/ tmp / lock.lck" );
} mais {
  echo "Falha na ligação: / tmp / lock.lck" ;
}
?>
Aqui, assumimos um arquivo existe no null / tmp /, isso pode ser apenas um arquivo vazio, e nós criamos um hard link dele para / tmp / lock.lck, dentro deste podemos verificar em seguida, abra o arquivo como normal e trabalho nele sabendo que nenhum outro processo pode estar tentando fazer a mesma coisa. A vantagem de atomicidade link é que uma vez uma chamada para ligação começa, outro vai ter que esperar antes de começar, portanto, vários processos não será capaz de passar de forma incorreta o estágio bloqueio de arquivo.
Isto significa que agora podemos bloquear nosso arquivo e usá-lo em paz!

Nenhum comentário :

Postar um comentário

Total de visualizações de página