Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá comunidade iMasters. Estou criando um sistema para gravar dados em um arquivo de txt, basicamente é um sistema para encomendar produtos. Andei lendo que é importante utilizar a função flock() para bloquear o arquivo, evitando gerar problemas na gravação.
Imagine que tenha vários usuários fazendo encomendas de produtos, digamos que no mesmo instante, 2 executem o código de gravação, qual ficará gravado? Com esse intuito eu estou querendo utilizar a função flock() para não gerar conflito.
Eu gostaria de testar esta função, mas seria impossível eu mesmo executar o código no mesmo instante 2 vezes, então eu pensei em um loop, como o exemplo a seguir:
<?php
$file = fopen("lock.txt","w");
for($i=0;$i<10;++$i){
$n = date('H:i:s')."\n";
fwrite($file,$n);
flock($file, LOCK_EX);
}
?>
Pensei em fazer um loop para repetir o código no mesmo instante e poder ver a função flock() em ação. Mas para minha surpresa nada aconteceu e foram gravados 10 itens no lock.txt.
Minha ideia era que o loop po seria executado 10 vezes, mas na primeira, depois de gravar o arquivo a função flock iria bloquear o loop evitando o resto da gravação. Esse loop seria algo para simular 10 usuários enviando ao mesmo tempo.
Obviamente, que no exemplo não seria problema os dados serem incrementados no documento. Mas agora, se um fosse um texto, digamos que uma equipe de redatores estivesse editando arquivos e digamos que 2 editores, por coincidência, clicaram para editar o mesmo documento. Gostaria de abrir um fopen() quando primeiro editor abrir e deixar um flock() com mensagens para o próximo editor não ter acesso a edição.
Olha eu pensei diferente no código, fiz desta maneira:
<?php
for($i=0;$i<10;++$i){
$fp = fopen('lock.txt', 'w');
flock($fp, LOCK_EX);
fwrite($fp, "AUG GOLD \n");
flock($fp, LOCK_UN);
fclose($fp);
}
?>
Não deveria gravar 10 vezes isto no arquivo .txt. Pois eu abri um ponteiro com arquivo lock.txt, bloqueie, desbloqueie e fechei o ponteiro com o arquivo, logo isso iria se repetir por 10 vezes, então gravaria 10 vezes. Não é?
Carregando comentários...