2010-10-07 42 views
13

Estoy confundido con este código:PHP: fopen() Permiso denegado

prueba.php:

fopen('test.txt','a+'); 

cuando ejecuto, me sale un error:

Warning: fopen(test.txt): failed to open stream: 
    Permission denied in /var/www/html/yuelu3/mobile/text.php on line 2 

prueba .txt:

-rwxrwxrwx. 1 jt jt  87 10月 7 20:58 test.txt 

¿dónde está el problema?

Muchas gracias He encontrado el problema, utilizo FC13, debido a la protección de SELinux, se niega alguna acción. Por lo tanto, solo tengo que deshacerme de la protección.

+4

que, por casualidad, el archivo ubicado en un directorio NFS montado? – SirDarius

+3

¿También verificó los permisos del directorio donde reside el archivo? –

+1

¿Está funcionando php como usuario 'jt'? Si el archivo que desea abrir pertenece a otro usuario, también podría ser un problema. – methode

Respuesta

5

Uso fopen($_SERVER['DOCUMENT_ROOT'].'test.txt','a+');

+2

+1 ¡Y considere verificar que file_exists también! – Fenton

13

tratar

fopen('/path/to/file/test.txt','a+'); 

como

fopen('test.txt','a+'); 

es más probable buscar en otro directorio

4

Caminos siempre causan problemas al intentar abrir los archivos. Una manera fácil de evitar tener problemas cuando intenta abrir archivos es ver en qué directorio se encuentra y a dónde llama.

echo getcwd(); 

Crea una página PHP simple y realiza una llamada imprime el directorio actual. Coloque la página de PHP en el mismo directorio que el archivo, y le dirá la ruta correcta a la carpeta y luego simplemente agregue el /filename.xxx.

4

comprobar el modo de contexto de SELinux del archivo para asegurarse de que se establece en: httpd_user_content_t

... Si no es así, utilice:

chcon httpd_user_content_t test.txt 

... para corregir el problema.

6

He estado recibiendo el mismo error "no se pudo abrir la transmisión. Permiso denegado" al intentar escribir un archivo en el servidor utilizando PHP. Intenté todo en Internet para corregir el error. Cambié la propiedad de los archivos, directorios y subdirectorios en el servidor a "apache", hice un "chmod 777" en todos los archivos, directorios, subdirectorios, ejecuté "restorecon -R", ejecuté "chcon unconfined_u: object_r: httpd_user_content_t: s0 "en todos los archivos, pero lo único que parece funcionar es desactivar SELinux por completo.

Finalmente resolví el problema. El problema radica en los parámetros booleanos utilizados por SELinux. Realicé el siguiente comando para obtener una lista de todos los booleanos relacionados con httpd.

$ getsebool -a | grep httpd

Esto dio una lista de aproximadamente 36 parámetros.

Dolorosamente fui y encendí cada booleano usando el comando setsebool hasta que desapareció el error "no se pudo abrir la secuencia, permiso denegado".

Cuando cumplí "sobre" el booleano httpd_unified, el error se fue !! Cuando lo apagué, ¡el error volvió!

+0

Muchas gracias. ¡Acabo de cambiar chmod de todos los directorios y subdirectorios a 777 y funcionó bien para mí! –

5

Este problema también puede ser el resultado de tener SELinux habilitado. Esto se puede resolver usando:

chown -R apache:apache /var/www/html/directory_to_write 
chcon -R -t httpd_sys_content_t /var/www/html/directory_to_write 
chcon -R -t httpd_sys_rw_content_t /var/www/html/directory_to_write 

Puede encontrar más información sobre los contextos en https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/sect-Managing_Confined_Services-The_Apache_HTTP_Server-Types.html