O Senario:
Você tem um arquivo com uma string (valor médio da sentença) em cada linha. Para argumentos, digamos que este arquivo tenha 1 MB de tamanho (milhares de linhas).
Você tem um script que lê o arquivo, altera algumas das cadeias de caracteres do documento (não apenas anexando, mas também removendo e modificando algumas linhas) e, em seguida, substitui todos os dados pelos novos.
As questões:
O PHP, o SO ou o httpd etc. do 'servidor' já possui sistemas para interromper problemas como este (leitura / gravação na metade da gravação)?
Se funcionar, explique como funciona e dê exemplos ou links para a documentação relevante.
Caso contrário, existem coisas que eu posso habilitar ou configurar, como bloquear um arquivo até que uma gravação seja concluída e fazer com que todas as outras leituras e / ou gravações falhem até que o script anterior termine de gravar?
Minhas suposições e outras informações:
O servidor em questão está executando PHP e Apache ou Lighttpd.
Se o script for chamado por um usuário e estiver na metade da gravação no arquivo, e outro usuário ler o arquivo no momento exato. O usuário que o lê não receberá o documento completo, pois ainda não foi gravado. (Se esta suposição estiver errada, corrija-me)
Estou preocupado apenas com a gravação e leitura de PHP em um arquivo de texto e, em particular, nas funções "fopen" / "fwrite" e principalmente em "file_put_contents". Examinei a documentação "file_put_contents", mas não encontrei o nível de detalhe ou uma boa explicação sobre o que o sinalizador "LOCK_EX" é ou faz.
O cenário é um exemplo de um cenário de pior caso em que eu suponho que esses problemas têm maior probabilidade de ocorrer, devido ao tamanho grande do arquivo e à maneira como os dados são editados. Quero aprender mais sobre esses problemas e não quero ou preciso de respostas ou comentários como "use mysql" ou "por que você está fazendo isso" porque não estou fazendo isso, só quero aprender sobre leitura / gravação de arquivos com PHP e não parece estar procurando nos lugares certos / documentação e sim, eu entendo que PHP não é a linguagem perfeita para trabalhar com arquivos dessa maneira.
file_put_contents()
é apenas um invólucro para a fopen()/fwrite()
dança, LOCKEX
faz o mesmo como se você ligasse flock($handle, LOCKEX)
.