Por que não funciona
Quando você tenta alterar o horário de modificação de um arquivo com touch
, ou mais geralmente com a chamada de sistema subjacente utime
, há dois casos.
- Você está tentando definir a hora de modificação do arquivo para um horário específico. Isso requer que você seja o proprietário do arquivo. (Tecnicamente falando, o ID do usuário efetivo do processo deve ser o proprietário do arquivo.²)
- Você está tentando definir a hora da modificação do arquivo para a hora atual. Isso funciona se e somente se você tiver permissão para gravar no arquivo. O motivo dessa exceção é que você poderia obter o mesmo efeito de qualquer maneira sobrescrevendo um byte existente do arquivo com o mesmo valor¹.
Por que isso geralmente não importa
- Quando você copia arquivos com ftp, scp, rsync etc., a cópia cria um novo arquivo pertencente a quem fez a cópia. Assim, a copiadora tem permissão para definir os horários do arquivo.
- Com o rsync, você não poderá definir a hora dos diretórios existentes: eles serão definidos para a hora em que um arquivo foi sincronizado pela última vez. Na maioria dos casos, isso não importa. Você pode dizer ao rsync para não se incomodar com os tempos de diretório passando
--omit-dir-times
(-O
). - Com sistemas de controle de versão, as datas de revisão são armazenadas em arquivos; os metadados nos arquivos são principalmente irrelevantes.
Soluções
This all has to do with enabling PHP development in a single-developer scenario (ie: without SCM).
Ok, pare aí mesmo. Só porque há um único desenvolvedor não significa que você não deveria usar o SCM. Você deve estar usando o SCM. Peça ao desenvolvedor que faça o check-in de um arquivo e dê a ele uma maneira de pressionar um botão “deploy” para verificar os arquivos do SCM no diretório ativo.
Não há absolutamente nenhuma razão técnica pela qual você não deveria estar usando o SCM, mas pode haver uma razão humana. Se a pessoa que está trabalhando nesses arquivos se denominar "desenvolvedor", ele deve estar usando o SCM. Mas se for uma pessoa não técnica que insere documentos, o SCM pode ser muito complicado. Então vá empurrando os arquivos via FTP ou SSH. Existem três maneiras pelas quais isso pode funcionar.
- Você realmente precisa sincronizar os horários? Como indicado acima,
rsync
tem uma opção para não sincronizar os horários. Scp não a menos que você diga. Eu não conheço WinSCP, mas provavelmente também pode. - Continue fazendo o que você está fazendo, apenas ignore as mensagens sobre os horários. Os arquivos ainda estão sendo copiados. Esta não é uma boa opção, porque ignorar os erros é sempre arriscado. Mas é tecnicamente possível.
- Se você precisar de flexibilidade para preencher os arquivos de propriedade do usuário
apache
, a abordagem usual seria permitir o acesso do usuário SSH comoapache
. A abordagem fácil é fazer com que o usuário crie uma chave privada SSH e adicione a chave pública correspondente a~apache/.ssh/authorized_keys
. Isso significa que o usuário poderá executar comandos arbitrários como o usuárioapache
. Já que você está de acordo em dar ao usuário direitos de sudo de qualquer maneira, não importa no seu caso. É possível, mas não tão fácil, colocar mais restrições (você precisa de uma entrada separada do banco de dados do usuário com um nome diferente, o mesmo ID do usuário, um shell restrito e um chroot jail; detalhes em uma questão separada, embora isso já possa ser coberto neste site ou em Falha do servidor ).
¹ Ou, para um arquivo vazio, escreva um byte e trunque.
² Excluindo complicações adicionais, mas nenhuma que eu saiba se aplica aqui.