PHP ‘is_writable’ retourne false, bien que vu depuis le terminal 775

J’ai du mal à configurer un serveur de développement basé sur un clone de notre serveur de production. Nous utilisons un CMS et il semble que certains de ses scripts présentent des problèmes de permissions. En essayant d’aller au fond des choses, nous avons mis en place un script PHP pour tester les permissions, et nous sums entrés dans le terminal pour comparer ses résultats.

Notre script de test est comme ci-dessous

//try one of the essential folders of the CMS $path= '[our_base_dir]/html/cms/content' echo $path.' is'.(!is_writable($path) ? ' NOT' : '').' writable.
';

qui imprime

 [our_base_dir]/html/cms/content is NOT writable. 

Cependant, lorsque je vais dans le terminal, je ne vois pas pourquoi. Voici le résultat de cela:

 $ getfacl content # file: content # owner: cchapman # group: cchapman user::rwx user:apache:rw- group::rwx mask::rwx other::rx 

et

 $ grep 'cchapman' /etc/group cms:x:510:cchapman,apache cchapman:x:512:cms,apache 

Je crois que l’utilisateur apache est l’utilisateur qui doit avoir un access en écriture, et les utilisateurs de cms et de cchapman seraient simplement les propriétaires de fichiers en fonction de la façon dont ils ont été créés. Dans tous les cas, tous les trois devraient pouvoir lire et écrire les fichiers des autres en fonction des permissions du groupe.

C’est la même chose au niveau du fichier et du répertoire. Ma seule pensée est que quelque chose ne va pas avec la façon dont l’utilisateur Apache est traité au niveau du fichier. Est-ce que ça pourrait être ça? Ou quoi d’autre donnerait les différentes permissions d’access?

Je soupçonne que mon commentaire est en fait la réponse, alors je le posterai comme un seul:

En appelant is_writable sur le chemin /html/cms/content , vous vérifiez si le chemin absolu /html/cms/content est accessible en écriture ou non. Je crois que ce que vous voulez c’est:

 $path = realpath('./html/cms/content');//note the . if (is_writable($path)) printf('"%s" is writable', $path); 

Si le chemin que vous vérifiez est vraiment /html/cms/content , ce qui me semble étrange (je m’attendrais à /var/www/base_dir/html/cms/content ou quelque chose), alors assurez-vous d’obtenir le realpath ( ie: pas de liens symboliques et tout ça). Donc, appelez toujours realpath (comme je l’ai fait dans l’extrait ci-dessus).

Autre que cela: Vous avez un utilisateur apache , c’est bien, mais êtes-vous sûr que le script est exécuté par cet utilisateur? www-data et nobody n’est assez commun. Vérifiez quel utilisateur exécute réellement votre code et assurez-vous que l’utilisateur dispose également des droits appropriés.