Estou tentando adivinhar: o usuário que está executando o script não parece ter as permissões necessárias.
Por exemplo, se um script php executado pelo servidor web apache for usado para fazer upload de arquivos para um determinado subdiretório, esse subdiretório deverá estar disponível para acesso de leitura / gravação ao usuário do apache (normalmente "apache" ou "www-data"). ").
[edit]: quando você executa um servidor web, como o apache, por exemplo, somente o processo pai é executado como "root", um processo filho (que é o que você realmente quer executar scripts php) geralmente é executado com " www-data "uid em plataformas ubuntu / debian.
ps auwx | grep apache | grep -v grep
root 1606 0.0 0.0 63520 3020 ? Ss déc.01 0:16 /usr/sbin/apache2 -k start
www-data 22325 0.0 0.0 352676 4232 ? Sl 06:25 0:02 /usr/sbin/apache2 -k start
www-data 22326 0.0 0.0 352676 4228 ? Sl 06:25 0:02 /usr/sbin/apache2 -k start
e isso explica por que não é possível gravar em seu subdiretório específico em seu public_html, se esse subdiretório específico não pertencer a esse usuário ou grupo "www-data".
Para corrigir isso, por exemplo, você pode definir o atributo "group" do seu subdiretório como "www-data" e definir permissão de gravação para esse grupo:
sudo chgrp -R www-data ./public_html/my_files
sudo chmod -R g+w ./public_html/my_files
aviso: Ao fazer isso, você altera recursivamente o atributo de grupo de ./public_html/my_files para www-data e permite acesso de gravação a usuários pertencentes ao grupo www-data, permitindo assim que o apache (sobre) grave arquivos em essa pasta.