segunda-feira, 12 de março de 2012

trocando a permissão de arquivos e diretórios recursivamente no php

Hoje, vou postar aqui um código que no mínimo pode ser engraçado.
É 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.

Nenhum comentário:

Postar um comentário