É interessante do ponto de vista das funções que são utilizadas no php para manipulação de arquivos e diretórios.
Tudo isso aconteceu porquê em um servidor que hospedo um site, alguns arquivos são gerados com o usuário do apache... o famoso www-data!
Por alguns arquivos serem gerados com www-data e com permissão de leitura e gravação apenas para o próprio www-data, eu não conseguia fazer nem um backup do meu projeto por causa destes arquivos os quais eu não possuia permissão com meu usuário.
Já estava ficando desesperado até que pensei o que era o mais óbvio! Basta criar um script e acessar pelo browser e o usuário www-data estará em ação =P
Então a solução foi executar este script que por sua vez altera a permissão dos arquivos e diretórios recursivamente (e apenas quando o arquivo estiver sob o poder do www-data!!!!).
Talvez alguém possa até passar por isso ou ter uma solução bem mais inteligente pois a minha acho que está bem estranha. Caso alguém estiver lendo este post e tiver alguma idéia que me ajude a fazer isso de forma melhor, por favor! não hesite em deixar um comentário...
Agora chega de lero lero e vamos ao código:
/** funcao que apenas faz a chamada recursiva.
* criei só para modularizar a chamada que é
* feita em 2 lugares diferentes */
private function recur($path) {
$dir = scandir($path);
for( $i=2; $i < count($dir); $i++) {
$this->salvaodia($path . '/' . $dir[$i]);
}
}
/**
* esta é a funçao que salvou o dia!
* portanto... para deixar o código um pouco mais divertido
* vou manter o nome salva o dia! afinal...
* essa funçaozinha merece o meu respeito */
private function salvaodia($path) {
// path eh o caminho raiz a partir do qual quero
// sair procurando e mudando permissao
$info = stat($path);
// se for o userdata(cada server tera um diferente =/ )
if ($info[4] == 43234) {
chmod($path, 0777); // nao façam isso fora de casa
if (is_dir($path)) {
$this->recur($path);
}
} else {
if (is_dir($path)) {
$this->recur($path);
}
}
}
/** e aqui fazendo a chamada da salvacao */
public function salvacao() {
$path = 'foo/bar/fubah';
$this->salvaodia($path);
echo 'salvou o dia';
exit();
}
Com o código acima podemos ver algumas funções interessantes para manipular os arquivos e diretórios que são elas:
stat: retorna um conjunto de informações sobre um arquivo/diretório
scandir: recupera a lista de arquivos dentro do diretório informado
chmod: muda a permissão do diretório segundo a configuração rwx-rwx-rwx onde (r=read, w=write, x=execute). Cada grupo de permissões dessas estão relacionadas ao dono, grupo e outros (UGO - user, group, owner).
is_dir: apenas indica se o arquivo corrente é um diretório.
Bom... isso salvou meu dia (isso às 12:36 AM)
talvez salve o de mais alguém.
Mais uma coisa!!! Gostaria de ver este código em outras linguagens...
agora estou sem tempo de testar em java e ruby... se alguém quiser postar algum exemplo é só avisar.
Nenhum comentário:
Postar um comentário