2010-10-31 2 views
5

Le script PHP suivant ne parvient pas à créer le répertoire. Il échouera également à créer le fichier (lorsque le répertoire existe déjà).PHP mkdir() et fopen() ne fonctionne pas - problème d'autorisations? problème umask?

ini_set('error_reporting', E_ALL); 

define('ABSPATH', $_SERVER['DOCUMENT_ROOT']); 
echo ABSPATH . '<br /><br />'; 

$dir_to_make = ABSPATH . '/aaatest'; 
$file_to_make = ABSPATH . '/aaatest/aaatest.txt'; 

echo umask() . '<br />'; 

mkdir($dir_to_make) or die('could not create directory'); 
fopen($file_to_make) or die('could not open/create file'); 

Le umask() renvoie une valeur de 18. La racine du document a une période (il /var/www/blah/websitename.com/httpdocs).

Je ne comprends pas complètement umask(), et je ne suis pas sûr de savoir comment l'utiliser correctement. Je ne sais pas si c'est le problème ou non, mais cela semble probable. Dois-je changer le umask, créer le fichier/répertoire, puis le changer? Que devrait être le umask pour changer/créer/éditer des fichiers/répertoires? Le serveur doit-il être configuré différemment?

+0

Quel est le message d'erreur généré par PHP? Si ce n'est pas l'impression dans le flux html, alors ce sera dans le journal du serveur. – Lee

+0

PHP Avertissement: mkdir() [function.mkdir]: Autorisation refusée dans /var/www/blah/websitename.com/httpdocs/aaa.php à la ligne 13 – matthewpavkov

+0

Je devrais également ajouter que sur ce serveur, dans le même compte, j'ai une installation complète de Wordpress, qui fonctionne bien (téléchargement de fichiers, mise à jour de plugins, etc). – matthewpavkov

Répondre

6

Afin de créer un fichier dans la racine du document, votre processus PHP doit disposer des autorisations d'écriture dans le répertoire. Habituellement (mais pas toujours) PHP s'exécute comme le même utilisateur que le serveur Web. Le nom de cet utilisateur variera avec différents systèmes. Sur Ubuntu et Debian, l'utilisateur est appelé www-data, sur d'autres systèmes, il peut s'agir simplement de www, ou de apache ou de apache2. Sur certains systèmes, il peut s'agir de root.

Vous pouvez connaître l'utilisateur de votre PHP en examinant la valeur du serveur superglobal: $_SERVER['USER']. phpinfo() fournit un moyen facile de regarder des choses comme ça. Habituellement, l'utilisateur PHP est le même que l'utilisateur du serveur web (mais pas toujours). La définition de la propriété et des permissions du répertoire est entièrement un autre sujet - cela dépend de votre système d'exploitation, des droits d'accès et des autorisations que vous avez pour le serveur, et de bien d'autres choses. Si vous avez besoin de pointeurs, vous pouvez start at serverfault.com.

bonne chance.


[modifier] OK, si vous êtes runing comme apache, et vous essayez de créer votre nouveau répertoire dans /var/www/blah/mydomain.com/htdocs/ ... puis lorsque vous exécutez:

> ls -splad /var/www/blah/mydomain.com/htdocs 

vous feriez attendre à voir quelque chose comme:

4 drwxr-xr-x 2 apache apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/ 

il y a deux parties intéressantes:

drwxr-xr-x signifie: d = répertoire; rwx = l'utilisateur a lu, écrit, eXecute; r-x = le groupe a seulement lu, et eXecute; r-x = tout le monde n'a que Read, et eXecute.

et apache apache - le premier est le nom de l'utilisateur propriétaire du fichier/répertoire, le second est le nom du groupe propriétaire du fichier/répertoire.

donc si vous avez vu quelque chose comme ceci:

4 drwxr-xr-x 2 root apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/ 

il serait pas travail car le répertoire est détenu par root (non apache), et même si elle est groupé par apache, le répertoire n'est pas groupe-inscriptible de sorte que ne le coupe pas. Dans ce scénario, vous pouvez simplement ajouter des perms d'écriture de groupe (chmod g+w /var/www/blah/mydomain.com/htdocs), et vous êtes prêt à partir.

autre chose que vous pourriez voir est:

4 drw-r-xr-x 2 apache apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/ 

Dans ce cas, la propriété est ok, mais le répertoire est pas accessible en écriture par son propriétaire. Vous pouvez résoudre ce problème en ajoutant une autorisation en écriture pour le propriétaire chmod u+w /var/www/blah/mydomain.com/htdocs.

Il y a beaucoup d'autres variations, mais peut-être que cela vous aidera.

+0

Ouais, ça fonctionne comme apache. – matthewpavkov

+0

ok, voir ma modification récente pour des informations spécifiques à l'utilisateur 'apache' – Lee

+0

oh, et le umask n'a pas d'importance - il contrôle les permissions qui seront données, par défaut, aux répertoires que vous créez. Mais il ne contrôle pas si vous pouvez créer un répertoire ou un fichier. Concentrez-vous sur l'obtention de votre script pour créer le répertoire dans la racine doc. Une fois que vous avez ce travail, ajoutez la création du fichier. Si vous pouvez créer le répertoire, mais vous ne parvenez pas à créer le fichier, nous parlerons de umask. ;-) – Lee

2

Vous devez fournir 2 arguments pour ouvrir. Essayez de changer

fopen($file_to_make) or die('could not open/create file'); 

à

fopen($file_to_make,'w') or die('could not open/create file'); 
+0

Non, cela ne fonctionne pas. – matthewpavkov

+0

Vérifiez les autorisations sur le répertoire. – lbedogni