Boa pergunta - mostra que você fez sua lição de casa.
Não consigo pensar em nada "óbvio" que você não tenha verificado, por isso só posso dar alguns conselhos de depuração mais avançados.
- Acione
strace
no processo PHP e veja exatamente o que está fazendo sob o capô. - Escreva um código que execute
fopen(..., 'r')
para verificar três vezes se as permissões da árvore de diretórios estão, de fato, OK. -
su
para o usuário em questão e tente fazer algumas coisas na linha de comando. Se isso funcionar, você saberá que seu script não está sendo executado com as permissões que você acredita. - Verifique se não há ACLs estendidas nos componentes de arquivo, diretório ou caminho principal (
getfacl
é a ferramenta a ser usada). É incomum, mas de vez em quando eles pulam e arrancam seu rosto. Se você tiver ACLs, usesetfacl -x
para se livrar deles depois de verificar se são desnecessários.