2010-05-24 14 views
53

Estoy tratando de usar PHP para crear un archivo, pero no está funcionando. Estoy asumiendo que esto es porque no tiene acceso de escritura (siempre ha sido el problema antes). Traté de probar si este era el problema haciendo que la carpeta chmod 0777, pero eso acabara haciendo que cada script en ese directorio devolviera un mensaje de error 500 hasta que lo cambiara nuevamente. ¿Cómo otorgo acceso de escritura PHP a mi sistema de archivos para que pueda crear un archivo?¿Cómo doy acceso de escritura de PHP a un directorio?

Editar: Está alojado en el alojamiento compartido Hostgator utilizando Apache.

Editar 2: Alguien pidió el código: El código es un script de imagen GD. Sé que el resto funciona igual que antes. Estaba creando la imagen cada vez que se llamaba. Ahora intento crearlos cuando se agrega texto nuevo y guardarlos en una carpeta. La línea de escritura que tengo es: imagejpeg (null, $ file, 85);

que también creó un archivo de prueba para comprobar si era sólo un guión rota (copiado principalmente de tizag): http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (no sé si/cómo publicar el código aquí adecuadamente Aquí está el contenido del. Script PHP, menos etiquetas PHP.)

Devuelve 13,13,1 (líneas separadas), por lo que parece que cree que escribió algo, pero el archivo testfile.txt está en blanco (subí uno en blanco), o inexistente (si lo elimino).

Editar 3: El servidor ejecuta CentOS.

+0

Es esto un servidor que controla o está en un servidor compartido? – webbiedave

+0

¿Estás usando Apache? – Elijah

+0

Hosting compartido de Hostgator. Apache. –

Respuesta

43

Una manera muy fácil es dejar que PHP cree el directorio en sí mismo en primer lugar.

<?php 
$dir = 'myDir'; 

// create new directory with 744 permissions if it does not exist yet 
// owner will be the user/group the PHP script is run under 
if (!file_exists($dir)) { 
    $oldmask = umask(0); // helpful when used in linux server 
    mkdir ($dir, 0744); 
} 

file_put_contents ($dir.'/test.txt', 'Hello File'); 

Esto le ahorra la molestia con los permisos.

+2

Eso es correcto. Puede modificar los permisos para satisfacer sus necesidades. – favo

+6

Esta es la solución más fácil, aunque no debe usar 777 en apache ya que está configurado para bloquear esos archivos. – vdbuilder

+3

¡Obtengo permiso denegado al crear el directorio! – maxisme

3

Puede cambiar los permisos de una carpeta con chmod() de PHP. Puede obtener más información sobre cómo usar el comando aquí: http://php.net/manual/en/function.chmod.php

Si obtiene un error 500 al configurar los permisos en 777 (escritura mundial), significa que su servidor está configurado para evitar la ejecución de dichos archivos. Esto se hace por razones de seguridad. En ese caso, querrá usar 755 como los permisos más altos en un archivo.

Si hay un archivo error_log generado en la carpeta donde está ejecutando el documento PHP, querrá ver las últimas entradas. Esto le dará una idea de dónde está fallando el script.

Para ayuda con la manipulación de archivos PHP, uso http://www.tizag.com/phpT/filewrite.php como recurso.

+0

La carpeta ya está configurada en 0755 como predeterminada. Nunca pensé en revisar el error_log, pero lo hice y no contiene nada acerca de por qué no produjo los archivos. –

+0

Puede ser una buena idea publicar el código con el que tiene problemas. Un buen recurso que utilizo en ocasiones para la ayuda de la sintaxis del manejador de archivos es http://www.tizag.com/phpT/filewrite.php. –

+0

Publicación principal editada con código. –

29

Establezca el propietario del directorio para el usuario que ejecuta apache. A menudo, nadie en Linux

chown nobody:nobody <dirname> 

De esta manera su carpeta no será el mundo pueda escribir, pero todavía se puede escribir para apache :)

+4

Si usa Ubuntu, este usuario y grupo no existe. ¿Alguna sugerencia para lograr lo que estás haciendo aquí entonces? –

+13

@BrandonMinton 'chown www-data: www-data ' debería hacerlo. www-data es el usuario de apache en los sistemas basados ​​en Debian –

+0

hola, dijiste que necesitas 'chown nobody: nobody ' ¿dónde tengo que codificar esto? – guitarlass

2

descubrí que con HostGator tiene que configurar los archivos a CMOD 644 y carpetas a 755 . Desde que hice esto en base a su soporte técnico funciona con HostGator

1

chmod no le permite establecer la propiedad de un archivo. Para establecer la propiedad del archivo, debe usar el comando chown.

1

que tenían el mismo problema:

Como yo era reacio a dar 0777 a mi directorio php, creo un directorio tmp con los derechos de 0777, en el que crear los archivos que necesito para escribir.

Mi directorio php sigue estando protegido. Si alguien piratea el directorio tmp, el sitio continuará funcionando como siempre.

1

Puede establecer selinux en permisivo para analizar.

# setenforce 0 

Selinux se registrará pero permitirá acesses. Para que pueda consultar el /var/log/audit/audit.log para más detalles. Tal vez necesites cambiar el contexto de selinux. Fot esto, utilizará el comando chcon. Si lo necesita, muéstrenos su audit.log a una respuesta más detallada.

No olvides habilitar selinux después de haber resuelto el problema. Es mejor mantener selinux forzado.

# setenforce 1 
1

La mejor manera de dar acceso de escritura a un directorio ..

$dst = "path/to/directory"; 
mkdir($dst); 
chown($dst, "ownername"); 
chgrp($dst, "groupname"); 
exec ("find ".$dst." -type d -exec chmod 0777 {} +"); 
6

primera Averiguar qué usuario es poseer proceso httpd con el siguiente comando

ps aux | grep httpd 

obtendrá un Varios respuesta de línea como esta:

phpuser 17121 0.0 0.2 414060 7928 ?  SN 03:49 0:00 /usr/sbin/httpd 

Aquí la 1ra columna muestra el nombre de usuario. Así que ya sabes el usuario que está intentando escribir archivos, que es en este caso phpuser Usted puede ahora seguir adelante y establecer el permiso para el directorio donde el script php está tratando de escribir algo:

sudo chown phpuser:phpuser PhpCanWriteHere 
sudo chmod 755 PhpCanWriteHere 
0

I' Estoy ejecutando Ubuntu, y como dije antes nadie: nadie no trabaja en Ubuntu. Se obtiene el error:

chown: invalid group: 'nobody:nobody' 

su lugar debe usar el 'nogroup', como:

chown nobody:nogroup <dirname> 
Cuestiones relacionadas