2011-02-07 43 views
63

Estoy intentando escribir una consulta en un archivo para la depuración. El archivo está en database/execute.php. El archivo en el que quiero escribir es database/queries.php.file_put_contents permiso denegado

Estoy tratando de utilizar file_put_contents('queries.txt', $query)

Pero me estoy

file_put_contents (queries.txt) [function.file-puesto-contents]: pudo abrir la secuencia: Permiso denegado

Tengo el archivo queries.txt chmod'd a 777, ¿cuál podría ser el problema?

+0

¿Ha examinado el archivo 'php.ini' en busca de algo que pueda denegar el acceso al archivo? – Hello71

+2

también asegúrese de que el directorio esté bien chmod'd –

+0

intente también con el nombre de archivo absoluto. Puede ser que su interpretación de la carpeta actual sea diferente a la de – laher

Respuesta

58

Intenta ajustar los permisos del directorio.

desde un terminal, ejecute chmod 777 database (desde el directorio que contiene la carpeta de base de datos)

Apache y nadie tendrá acceso a este directorio si se chmodd'ed correctamente.

La otra cosa que hacer es echo "getcwd()". Esto le mostrará el directorio actual, y si esto no es '/ something.database /', necesitará cambiar 'query.txt' a la ruta completa de su servidor.

+77

¿No es 777 un riesgo de seguridad? – hitautodestruct

+9

Sospecho firmemente que la cuenta del servidor no solo debe poder escribir en el directorio de destino, sino que cada directorio principal del directorio de destino debe permitir que la cuenta del servidor lo explore; Creo que esto sería + x a los permisos. – Erhannis

+1

Experimenté las teorías de Erhannis en una nueva pila de LAMP y la teoría es correcta. – thotheolh

-10

Además, como se dijo en file_put_contents man page en php.net, tenga cuidado con los problemas de nomenclatura.

file_put_contents($dir."/file.txt", "hello"); 

puede no funcionar (a pesar de que es correcta en la sintaxis), pero

file_put_contents("$dir/file.txt", "hello"); 

obras. Experimenté esto en diferentes servidores instalados de php.

+17

Esto no es correcto. '$ dir."/file.txt "' es funcionalmente equivalente a '" $ dir/file.txt "' en todos los casos, suponiendo que '$ dir' es una cadena. Además, este comportamiento no está documentado en php.net, como afirma Kivanc. – mattbasta

1

Para cualquier persona usando Ubuntu y recibir este error al cargar la página localmente, pero no en un servicio de alojamiento web,

que acaba de arreglar esto mediante la apertura de Nautilus (sudo nautilus) y haga clic derecho sobre el archivo que está intentando abrir, haga clic en Propiedades> Configuración> y escriba "Todos los demás"

7

Tenga en cuenta que esto ya es bastante antiguo, pero no es necesario escribir consultas manualmente en un archivo como este. MySQL tiene soporte de registro incorporado, solo necesita habilitarlo dentro de su entorno de desarrollo.

Tome un vistazo a la documentación para el 'registro de consultas en general':

http://dev.mysql.com/doc/refman/5.1/en/query-log.html

3

chicos que tenían este problema durante 1 mes y lo hicieron todo, pero no podían arreglarlo, pero ahora sé que el solución.

Uso un alojamiento compartido de Linux, cuando mi administrador cambió el php a 5.3 Recibí muchos errores para el código "file_put_contents". tratar de probar mi plan:

En su anfitrión crear un archivo como mytest.php, y poner este código y ahorre:

<?php  mail('Your-EMail','Email-Title','Email-Message');  ?> 

Abrir la URL www".su-dominio.com/mytest.php "una vez y luego revise su correo electrónico. debe tener un correo electrónico de su anfitrión con la información que ingresó en mytest.php, verifique el nombre del remitente. si es de nadie tiene un problema sobre "Permiso denegado" porque algo no está definido y si el nombre del remitente es como mi id: [email protected] no tiene problema

Mi administrador cambió el servidor e instaló el host de nuevo, creo y el problema se resolvió, informe a su administración de acogida lo que te dije y tal vez encontrar la respuesta.

espero que le ayuda!

+0

¡Estoy completamente perdido! ¿Qué estás tratando de decir? Si está diciendo que el usuario de apache no pudo obtener el nombre de host en el servidor (compartido o lo que sea), entonces ya es hora de que reconsidere su elección de un servicio de hospedaje. – Fr0zenFyr

-3

Aquí la solución. Para copiar un img de una URL. este URL: http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg'); 

crear la trayectoria deseada terminar el nombre con .jpg

$file_destino_path="imagenes/my_image.jpg"; 

file_put_contents($file_destino_path, $image_Url) 
+0

¿Cómo resuelve el problema? – Fr0zenFyr

3

Sé que es una pregunta muy antigua, pero quería añadir la buena solución con un poco de profundidad explicación. Tendrás que ejecutar dos instrucciones en Ubuntu como sistemas y luego funciona como un encanto.

Los permisos en Linux se pueden representar con tres dígitos. El primer dígito define el permiso del propietario de los archivos. El segundo dígito los permisos de un grupo específico de usuarios. El tercer dígito define los permisos para todos los usuarios que no son el propietario ni miembro del grupo.

Se supone que el servidor web se ejecutará con una identificación que sea miembro del grupo. El servidor web nunca debe ejecutarse con la misma identificación que el propietario de los archivos y directorios. En Ubuntu ejecuta apache bajo el id www-data. Esa identificación debe ser un miembro del grupo para el que se especifican los permisos.

Para dar el directorio en el que desea cambiar el contenido de los archivos de los derechos adecuados, ejecutar la instrucción:

find %DIR% -type d -exec chmod 770 {} \; 

.Es implicaría en la cuestión de la OP que los permisos para el directorio% ROOT%/database debe cambiarse en consecuencia. Por eso es importante no tener archivos dentro de ese directorio que nunca deberían cambiarse o eliminarse. Por lo tanto, es una buena práctica crear un directorio separado para los archivos cuyo contenido debe modificarse.

Leer los permisos (4) para un directorio significa poder recopilar todos los archivos y directorios con sus metadatos dentro de un directorio. Los permisos de escritura (2) dan el permiso para cambiar el contenido del directorio. Implica agregar y eliminar archivos, cambiar permisos, etc. Permiso de ejecución (1) significa que tiene derecho a acceder a ese directorio. Sin este último es imposible profundizar en el directorio. El servidor web necesita permisos de lectura, escritura y ejecución cuando se debe cambiar el contenido de un archivo. Para ello necesita el grupo del dígito 7.

La segunda afirmación es en la cuestión de la OP:

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \; 

Ser capaz de leer y escribir un documento que se requiere, pero no se requiere para ejecutar el archivo . El 7 se le da al propietario de los archivos, el 6 al grupo. El servidor web no necesita tener el permiso para ejecutar el archivo para cambiar su contenido. Esos permisos de escritura solo se deben dar a los archivos en ese directorio.

No se debe dar ningún permiso a los demás usuarios.

Para los directorios que no requieren cambiar sus archivos son permisos de grupo de 5 suficientes. documentación acerca de los permisos y algunos ejemplos:

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/

-2

Existen 2 manera de resolver este emite
1. Uso chmod 777 path-to-your-directory.
si no funciona, entonces
2. simplemente proporcione la ruta completa de su archivo query.txt.

+1

Esto es terriblemente inseguro y extremadamente mala práctica. También es difícil de detectar y corregir al desarrollar aplicaciones personalizadas y se puede pasar por alto fácilmente. Por favor, realmente averigua los permisos correctos. – ftrotter

6

La otra opción

es que se puede hacer Apache (www-data), el propietario de la carpeta

sudo chown -R www-data:www-data /var/www 

que debe hacer el trabajo file_put_contents ahora. Sin embargo, para mayor seguridad es mejor que también establece los permisos, como a continuación

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder 
find /var/www -type f -print0 | xargs -0 chmod 0644 # files 
  • cambio /var/www a la carpeta raíz de los archivos php
1

Recopilación de información desde este enlace stackoverflow-image save doesn't work with chmod 777 y desde azerafati usuario y Loek Bergman

si fuera a mirar en/etc/apache/envvars de archivo verá algo como:

export APACHE_RUN_USER=www-data 
export APACHE_RUN_GROUP=www-data 

Apache se ejecuta bajo el nombre de usuario 'www-data'

'0755' significa que el propietario del fichero puede leer/escribir/ejecutar, pero en grupo y otros usuarios no pueden escribir. entonces en tu terminal, cd a la carpeta que contiene tu carpeta 'images'. luego escriba:

find images -type d -exec chmod 0755 {} \; 
find images -type f -exec chmod 0755 {} \; 
sudo chown -R www-data:www-data images 

debe cambiar las persianas primero antes de cambiar de propietario. ingrese su contraseña cuando se le solicite. esto hará que el propietario de 'www-data' de la carpeta de imágenes.

su carga debería funcionar ahora.