Laravel 5.4 – caché artesanal de php: borrar no borra los archivos de caché cuando se usa el controlador de caché ‘archivo’

5 minutos de lectura

avatar de usuario de fronzee
congelado

Aplicación Laravel 5.4. CACHE_DRIVER se establece en file y QUEUE_DRIVER se establece en sync en .env.

cuando corro php artisan cache:clear Dice Cache cleared successfully sin embargo, todavía tengo 236K de archivos en mi storage/framework/cache directorio.

Frustrado por esto, también eliminé manualmente todos los archivos/directorios bajo storage/framework/cache usando rm -rf * de ese directorio.

Ahora, cuando corro art queue:restart yo obtengo [ErrorException] file_put_contents(/var/www/vhosts/my-app.com/releases/28/storage/framework/cache/ee/2f/ee2f842aa7bb1f53ed
f3a2ed2c09a1807ffa6c90): failed to open stream: No such file or directory

Entonces, tengo dos problemas en mis manos. La primera es: ¿por qué Artisan no elimina todos los archivos de caché? ¿Cómo los elimino de forma segura? El segundo problema es: ¿cómo me recupero de esto para que php artisan queue:restart no me da error?

ACTUALIZACIÓN: se me ocurrió que probablemente no tengo motivos para reiniciar un trabajador de cola si QUEUE_DRIVER se establece en sync, por lo que omitir ese comando por completo resuelve la mitad de mi problema. Sin embargo, todavía no estoy seguro de cómo eliminar correctamente esos 236 K de archivos de caché.

  • conseguiste encontrar una solucion? estoy enfrentando el mismo problema y sin suerte

    – Rafay

    26 mayo 2019 a las 21:27

Avatar de usuario de Precastic
precastico

Actualización enero 2020

Parece que hay una solución fácil para todo esto. Usando esta respuesta https://serverfault.com/a/96349 como referencia, puede configurar el bit gid en la carpeta principal para que todos los archivos y carpetas posteriores creados en ./storage/* pueden ser escritos por cualquier persona en el grupo correcto, independientemente de quién los haya creado; superando así los problemas de permisos de seguridad del grupo como se explica a continuación.

Esto funciona para mí:

# Assumes all required users belong to the www-data group
sudo chgrp -R www-data /path/to/storage

sudo chmod g+s /path/to/storage

Respuesta corta

Usa sudo: sudo rm -r ./storage/framework/cache

Respuesta larga

Asegúrese de que todos los procesos que escriben en el caché usen el mismo usuario (y no solo pertenezcan al mismo grupo) porque resulta que Laravel escribe archivos de caché con privilegios similares a 0755 que restringe las escrituras al propietario.

Si como yo usas un usuario diferente para cada uno de estos:

  • proceso PHP
  • CLI artesanal
  • Artesano vía supervisor (para trabajos)

Termina con archivos que pertenecen a diferentes usuarios y los otros usuarios no pueden escribirlos ni eliminarlos, incluso si pertenecen al grupo requerido (www-data como ejemplo).

Con suerte, alguien puede encontrar una manera de establecer nuevos privilegios de archivo de caché en Larvel en algo así como 0775. Sería bueno si solo se heredara del padre.

Nota al margen

Esto para mí también estaba causando un problema con Cache::remember() entre el proceso supervisor y el proceso PHP de tal manera que estaba recibiendo put_file_contents errores porque los diferentes usuarios no pudieron escribir en los archivos almacenados en caché.

respuesta original

Estaba teniendo el mismo problema y, en mi caso, los archivos no se eliminaban porque estaban protegidos contra escritura. Cuando fui a eliminarlos manualmente usando rm -r ./storage/framework/cache Recibí la advertencia rm: descend into write-protected directory 'cache/c5'?. No iba a escribir sí para cada archivo en el caché, así que ejecuté el mismo comando que sudo y funcionó sin problemas. sudo rm -r ./storage/framework/cache.

Esto responde a su pregunta de por qué Artisan no los elimina cache:clear & correr rm es una solución bastante sencilla; aunque no resuelve el problema de por qué los archivos se escriben como protegidos contra escritura.

Después de eliminar el caché, Laravel vuelve a crear el caché como protegido contra escritura. Esto significa que probablemente sea un error y requiere que alguien envíe un informe de error a los desarrolladores de Laravel. Dado que la solución es trivial, lo dejaré para que lo haga otra persona.

  • ¿Eliminarlos manualmente no rompe nada? ¿Es esto todo lo que hace cache:clear, eliminar todos estos archivos de caché?

    – Andrés

    18 de marzo de 2018 a las 0:52

  • Parece funcionar, gracias! Aunque es extraño, borrar el caché con cache:clear funciona localmente pero no en producción =/

    – Andrés

    18 de marzo de 2018 a las 1:11

  • @Andrew Por lo que he leído y hasta donde yo sé, todo cache:clear lo que hace es eliminar los archivos almacenados en caché. En cuanto a su segundo punto, ¿podría ser miembro de sudo localmente?

    – Precastico

    20 de marzo de 2018 a las 9:30

  • Buscando en Illuminate\Cache\FileStore.php, qué sucede en caso de un flush es que cada directorio a continuación framework/cache/data se elimina Por lo tanto, estoy usando rm -rf framework/cache/data/*que también evita que se elimine la carpeta de caché interna .gitignore.

    – panpeter

    10 de abril de 2018 a las 11:13

  • Una nota: hacer la respuesta corta a veces puede causar problemas con la eliminación .gitignore archivos Si es posible, prefiero y encuentro más seguro simplemente hacer sudo php artisan cache:clear si es un problema de permisos.

    – Desarrollador de verano

    12 abr 2021 a las 18:16

Avatar de usuario de Leonardo Cabré
leonardo cabre

Puedes probar:

php artisan config:cache

Resuelve la mayoría de mis problemas.

  • Gracias, pero no hay suerte aquí. No resolvió el problema.

    – congelado

    8 de agosto de 2017 a las 15:55

  • Hay varios cachés en Laravel & config:cache solo borra y almacena en caché los archivos de configuración de la aplicación. Los archivos de caché creados por el método Cache::remember() son lo que cache:clear debería estar despejando. config:cache no es relevante para el problema de los OP.

    – Precastico

    24 de noviembre de 2017 a las 17:25


También puedes usar Tinker:

php artisan tinker
Cache::store("file")->flush()

Me encontré con un problema similar recientemente. Los archivos de caché creados a través de Cache la fachada parece persistir incluso después de correr php artisan cache:clear y como lo mencionó @Precastic, resultó ser un problema de permiso de archivo.

En lugar de eliminar los archivos/carpetas manualmente, solo ejecuté el mismo comando con privilegios de administrador como este

sudo php artisan cache:clear

Y funcionó para mí. Espero que esto ayude a alguien.

¿Ha sido útil esta solución?