php - generate - file_put_contents no crea el archivo txt
php to txt (5)
Actualmente tengo un script php que se ejecuta cuando un navegador explora la página web. Lo que intento hacer es escribir un archivo de texto cuando se ejecuta el script que almacena una variable. El propietario de la carpeta es apache, pero todos han leído y escrito, estrictamente para fines de prueba. (Pensé que podría ser un problema de permisos) SELINUX está habilitado en el servidor, y cuando ejecuto el script desde la consola, crea el archivo de texto muy bien y en el directorio correcto.
file_put_contents("My working file location", $myString);
Estoy usando esta línea para tratar de escribir y crear el archivo de texto, sé que la ubicación de mi archivo funciona porque puedo ejecutarlo y crearlo en modo fuera de línea, por ejemplo, ejecutarlo a través de la consola. El problema es que la variable que estoy intentando escribir se rellena a través de HTTP Post, y cuando ejecuto el script a través del navegador, o cuando apache ejecuta el script, no escribe ni crea el archivo. ¿Qué debo hacer para permitir el acceso a escribir / cambiar la sintaxis para que este script escriba este archivo de texto?
Es probable que su problema se deba a que apache no tiene permisos para escribir en la ubicación del archivo que especificó. Vaya a ese directorio y verifique los permisos y la propiedad del grupo con el comando ls
:
cd "My working file location"
ls -l .
Hay tres columnas en el resultado que muestran los permisos, el propietario y el grupo para el directorio. Lo más probable es que sean propiedad de root y no tengan permisos para que apache
escriba en el directorio.
Si este es el caso, verá aparecer un error en su registro de Apache cuando intente crear el archivo. Intente seguir sus registros mientras ejecuta el script en su navegador:
tail -f /var/log/apache2/error.log
¿Has probado chmodding el directorio a 777
?
Prueba esto:
if(file_put_contents(''file.txt'', ''text'')){
die(''yes'');
} else {
die(''no'');
}
Podría de algo mal escrito. ^
Recientemente tuve el mismo problema y tropecé con esta pregunta. Desafortunadamente choppyfireballs OP dijo en un comentario que encontró su propia solución y simplemente aceptó una respuesta que no estaba ayudando a ninguno de nosotros ... Luego, después de una búsqueda y un éxito para hacer que file_put_contents funcionara nuevamente, decidí compartir mi solución.
Los permisos de mis archivos y directorios estaban bien para aceptar cualquier escritura (asegúrese de que sus directorios sean chmod 757
esto le dará a la raíz y otros la concesión para escribir archivos en la ubicación). Si todavía no funciona como no lo hizo para mí, es porque su sistema probablemente sea SELinux (Security Enhanced Linux).
Si quiere asegurarse de que escriba setenforce 0
esto convertirá a selinux en modo permisivo, ejecute su script nuevamente, si funciona entonces significa que el problema está bien descrito.
En ese caso, convierta selinux en la copia setenforce 1
y pruebe ls -Zl
en el directorio donde está el directorio de su proyecto. esto te dará una línea como
drwx---r-x. 9 root root system_u:object_r:httpd_sys_content_t:s0 4096 Dec 8 00:25 project
o algo diferente, pero httpd_sys_content_t
si httpd_sys_content_t
chcon
para transferir el contexto de un directorio a este. pero si no tiene httpd_sys_content_t
, está bien porque necesitamos cambiar el contexto de ese directorio de todos modos.
primero debe aceptar cualquier contexto public_content_rw_t
para escribir el archivo. Tipo
setsebool -P httpd_anon_write on
Esto establecerá (P) erríticamente SELinux booleano httpd_anon_write
en verdadero y cualquier contexto denominado public_content_rw_t
tendrá los derechos para escribir cualquier archivo en su propia ubicación.
Ahora debe decir SELinux que su directorio de proyecto es public_content_rw_t
o aún no podrá escribir archivos. Tipo :
semanage fcontext --add --type public_content_rw_t "/project(/.*)?"
y restorecon -RvF /project
para decirle a selinux que aplique las especificaciones anteriores.
Ahora su directorio es public_content_rw_t y usted debería poder escribir archivos.
Estoy seguro de que mi solución es muy clara pero funcionó:
cd /mydir/
setsebool -P allow_httpd_anon_write true
Atentamente
Me encontré con este problema también. En mi caso, descubrí que la propiedad del directorio era incorrecta. Para una instalación típica de Apache, el directorio debe ser propiedad de www-data: www-data, no root: root.