2010-10-31 14 views
5

El siguiente script PHP no puede crear el directorio. Tampoco podrá crear el archivo (cuando el directorio ya exista).PHP mkdir() y fopen() no funciona - ¿problema de permisos? problema 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'); 

La máscara de usuario() devuelve un valor de 18. La raíz del documento tiene un período en el mismo (/var/www/blah/websitename.com/httpdocs).

No entiendo completamente umask(), ni estoy seguro de cómo usarlo correctamente. No sé si ese es el problema o no, pero parece ser probable. ¿Debo cambiar umask, crear el archivo/directorio y luego volver a cambiarlo? ¿Qué debería hacer umask para cambiar/crear/editar archivos/directorios? ¿El servidor debe configurarse de manera diferente?

+0

¿Cuál es el mensaje de error que está generando php? si no está imprimiendo en la secuencia html, estará en el registro del servidor. – Lee

+0

PHP Advertencia: mkdir() [function.mkdir]: Permiso denegado en /var/www/blah/websitename.com/httpdocs/aaa.php en la línea 13 – matthewpavkov

+0

También debo agregar que en este servidor, en la misma cuenta, tengo una instalación completa de Wordpress, que funciona bien (cargar archivos, actualizar complementos, etc.). – matthewpavkov

Respuesta

6

Con el fin de crear un archivo dentro de la raíz del documento, su proceso de PHP debe tener permisos para escribir en el directorio. Normalmente (pero no siempre) PHP se ejecuta como el mismo usuario con el que se ejecuta el servidor web. El nombre de este usuario variará según los diferentes sistemas. En Ubuntu y Debian, el usuario se llama www-data, en otros sistemas puede ser solo www, o apache, o apache2. En algunos sistemas, puede ser root.

Puede averiguar qué usuario ejecuta su PHP examinando el valor del servidor superglobal: $_SERVER['USER']. phpinfo() proporciona una manera fácil de ver cosas como esta. Por lo general, el usuario de PHP es el mismo que el usuario del servidor web (pero no siempre).

establecer la propiedad y los permisos del directorio es otro tema completamente diferente, depende del sistema operativo en el que se encuentre, qué acceso y permisos tenga para el servidor, y muchas otras cosas. Si necesita punteros sobre esto, puede start at serverfault.com.

buena suerte.


[editar] Está bien, si usted está runing como apache, y que está tratando de crear su nuevo directorio en /var/www/blah/mydomain.com/htdocs/ ... entonces cuando se ejecuta:

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

que había esperar ver algo como:

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

hay dos partes interesantes:

drwxr-xr-x significa: d = directorio; rwx = el usuario tiene Leer, Escribir, eXeguir; r-x = el grupo solo tiene lectura y eXecute; r-x = todos solo tienen lectura y ejecución.

y apache apache - el primero es el nombre del usuario que posee el archivo/directorio, el segundo es el nombre del grupo que posee el archivo/directorio.

por lo que si usted vio algo como esto:

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

lo haría no trabajo porque el directorio es propiedad de root (no Apache), ya pesar de que se agrupa por apache, el directorio no está grupo grabable para que no lo corte. En este escenario, simplemente podría agregar permisos de escritura de grupo (chmod g+w /var/www/blah/mydomain.com/htdocs), y listo.

Otra cosa que puede ver es:

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

En este caso, la propiedad está bien, pero el directorio no se puede escribir por su propietario. Puede solucionar esto agregando permiso de escritura para el propietario chmod u+w /var/www/blah/mydomain.com/htdocs.

hay muchas otras variaciones, pero quizás esto ayude.

+0

Sí, funciona como apache. – matthewpavkov

+0

bien, consulte mi edición reciente para obtener información específica del usuario 'apache' – Lee

+0

ah, y la umask no importa: controla los permisos que se otorgarán, de manera predeterminada, a los directorios que cree. Pero no controla si puede o no crear un directorio o archivo. Concéntrese en hacer que su script cree el directorio dentro de la raíz del documento. una vez que tenga eso funcionando, agregue la creación del archivo. Si puede crear el directorio, pero no puede crear el archivo, hablaremos de umask. ;-) – Lee

2

Debe proporcionar 2 argumentos para fopen. Intente cambiar

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

a

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

No, esto no funciona. – matthewpavkov

+0

Compruebe los permisos en el directorio. – lbedogni