Com referência a: https://stackoverflow.com/questions/12211629/php-file-put-contents-not-truncating-file-in-cifs-mount
Temos um dispositivo Seagate BlackArmor NAS, montado em nosso servidor Ubuntu 10.04 da seguinte maneira:
mount -t cifs -o defaults,credentials=/etc/smbpass/demo.smbpass,uid=1005,gid=1005,dir_mode=0770,file_mod=0660 //xxx.xxx.xxx.xxx/demo/files /var/www/mysite/src/files/
Parece que qualquer operação que deveria truncar arquivos e depois inserir conteúdo nesses arquivos no NAS acaba substituindo apenas os primeiros bytes do arquivo (até o comprimento do novo conteúdo) e depois o restante do anterior O conteúdo "antigo" ainda está no arquivo.
Por exemplo:
Conteúdo do myfile.txt: thisisabigfatpandaonwheelsgoingdownthestreet
Execute o script PHP com o código: file_put_contents('myfile.txt', 'blah');
Conteúdo do myfile.txt: blahisabigfatpandaonwheelsgoingdownthestreet
O conteúdo esperado do arquivo é obviamente blah
, mas esse não é o caso.
O uso de PHP fwrite()
depois de criar um identificador de arquivo com fopen('filename', 'w');
o mesmo efeito. ftruncate()
também não funciona corretamente. Usar um comando shell, como o que echo -n "blah" > myfile.txt
tem o mesmo efeito (é assim que sei que não é um problema específico do PHP).
Atualmente, minha única solução alternativa é excluir os arquivos e criá-los do zero, mas prefiro não alterar nenhum código no meu aplicativo, se possível (apenas começamos a usar o dispositivo NAS recentemente). Prefiro aplicar uma solução ao que parece ser um problema relacionado ao SO / montagem.
Alguma ideia?