¿Cómo borrar las entradas de caché APC?

170

Necesito borrar todas las entradas de caché de APC cuando implemente una nueva versión del sitio. APC.php tiene un botón para borrar todas las cachés de código de operación, pero no veo botones para borrar todas las entradas de usuario, o todas las entradas del sistema, o todas las entradas por directorio.

¿Es posible borrar todas las entradas de caché a través de la línea de comandos o de alguna otra manera?

lo_fye
fuente
1
¡Me interesaría cómo borrar entradas caducadas! puede especificar un ttl, pero php.net doc dice que se borró en la siguiente solicitud cuando expiró ...
The Surrican

Respuestas:

145

Puedes usar la función PHP apc_clear_cache.

Las llamadas apc_clear_cache()borrarán la memoria caché del sistema y las llamadas apc_clear_cache('user')borrarán la memoria caché del usuario.

Travis Beale
fuente
20
Descubrí que para hacer esto a través de la línea de comandos debes ingresar a apc.ini y configurar: apc.enable_cli = 1
lo_fye
51
lo_fye: ¿Eso realmente funciona? En mi experiencia, descubrí que la CLI de APC estaba totalmente separada del caché de APC de apache, y con razón, ya que cualquier proceso de CLI se ejecuta en un proceso completamente separado de Apache.
Frank Farmer
9
Frank Farmer: Confirmo que esto funciona con Apache o Nginx con PHP 5.3.10 y la interfaz PHP-FPM. php -r "apc_clear_cache();"
Creé
13
Esto NO funciona si ejecuta PHP usando mod_php. Por la razón que declaró Frank Farmer.
David
11
Ejecuto Ubuntu Server 12.04 con Nginx y PHP-FPM con PHP versión 5.4. ¡apc_clear_cache () y apc_clear_cache ('usuario') en la línea de comando NO borran el caché APC del servidor web / páginas web!
Pieter Vogelaar
117

No creo que ninguna de estas respuestas realmente funcione para borrar el caché APC de la línea de comando. Como Frank Farmer comentó anteriormente, la CLI se ejecuta en un proceso separado de Apache.

Mi solución para borrar desde la línea de comandos fue escribir un script que copiara un script de borrado de APC en el webdirectorio y accede a él y luego lo elimina. El script está restringido a que se acceda desde el host local.

  1. apc_clear.php

    Este es el archivo que el script copia en el directorio web, accede y elimina.

    <?php
    if (in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1')))
    {
      apc_clear_cache();
      apc_clear_cache('user');
      apc_clear_cache('opcode');
      echo json_encode(array('success' => true));
    }
    else
    {
      die('SUPER TOP SECRET');
    }
  2. Script de limpieza de caché

    Este script copia apc_clear.php en el directorio web, accede a él y luego lo elimina. Esto se basa en una tarea de Symfony. En la versión de Symfony, las llamadas se realizan a la forma de Symfony de copiar y desvincular, que manejan los errores. Es posible que desee agregar controles para que tengan éxito.

    copy($apcPaths['data'], $apcPaths['web']); //'data' is a non web accessable directory
    
    $url = 'http://localhost/apc_clear.php'; //use domain name as necessary
    $result = json_decode(file_get_contents($url));
    
    if (isset($result['success']) && $result['success'])
    {
      //handle success
    }
    else
    {
      //handle failure
    }
    
    unlink($apcPaths['web']);
Jeremy Kauffman
fuente
8
También puede simplemente reiniciar el servidor, por ejemplo, Apache si está usando mod_php o PHP FPM si está usando eso. Su solución es más elegante (no se requiere reiniciar el servidor) pero más compleja :)
El Yobo
55
Esto es mejor que reiniciar php-fpm / apache porque no requiere que su usuario de implementación tenga acceso a sudo. Si está implementando en múltiples servidores, escribir la contraseña de sudo para cada uno podría ser agotador.
Andrew
Personalmente, no me importa escribir la contraseña de sudo (mi script de implementación guarda la contraseña). Pero me gustaría evitar el tiempo de inactividad tanto como sea posible, es por eso que estoy interesado en vaciar los archivos APC. Para Nginx hay una forma (no tan fácil) de reiniciar sin ningún tiempo de inactividad. No sé para PGPfcgi, pero no lo creo. ¿La descarga de APC causa tiempo de inactividad?
Julien
@andrew Puede configurar su usuario para usar sudo sin escribir su contraseña. Sin embargo, si borrar APC es todo lo que se necesita, eso es realmente mejor, como dijo Julien.
ChocoDeveloper
1
@Julien Supongo que puede aumentar la carga del servidor si está almacenando resultados intensivos de la CPU o algo así. No lo haría en una hora pico.
ChocoDeveloper
68

Sé que no es para todos, pero: ¿por qué no hacer un reinicio elegante de Apache?

Por ejemplo, en el caso de Centos / RedHat Linux:

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful
Tadas Sasnauskas
fuente
44
Sé que esto no es ideal, pero me alegro de que hayas mencionado esto para una solución rápida y sucia.
Bryan Petty
1
Perdón por volver a abrir este hilo, pero me enfrento al mismo problema y me pregunto por qué un cronjob no hace que un reinicio apache2 sea ideal. ¿Cuáles son algunas de las desventajas de este enfoque?
user2028856
@ user2028856 No tiene nada de malo, excepto que algunos no siempre tienen el control total del servidor. Entonces, si funciona para usted, úselo.
Tadas Sasnauskas
@TadasSasnauskas ¿Qué quiere decir con "no siempre tener el control total del servidor"? Quiero decir, ¿ejecutarlo cada media hora más o menos hará que apache se bloquee o interrumpa algunas otras acciones en ejecución, como una copia de seguridad cron?
user2028856
@ user2028856 Quise decir que algunos podrían alojar sus sitios en un servidor compartido sin la capacidad de reiniciar el servidor web. Ejecutar un reinicio elegante cada 30 minutos debería estar bien dado que no ejecuta trabajadores en segundo plano a través de cli con apc habilitado (en pocas palabras: en algunos casos puede causar pánico en el núcleo)
Tadas Sasnauskas
29

Esto no se indica en la documentación, pero para borrar el caché del código de operación debe hacer:

apc_clear_cache('opcode');

EDITAR: Esto parece aplicarse solo a algunas versiones anteriores de APC.

No importa qué versión esté utilizando, no puede borrar el caché mod_php o fastcgi APC de un script php cli ya que el script cli se ejecutará desde un proceso diferente como mod_php o fastcgi. Debe llamar a apc_clear_cache () desde el proceso (o proceso hijo) para el que desea borrar el caché. Usar curl para ejecutar un script php simple es uno de esos enfoques.

ColinM
fuente
1
Debo agregar, si está ejecutando mod_php y desea borrar el caché a través de cli-mode php, realmente no puede hacer esto ya que los dos se ejecutan en entornos diferentes. Mi solución fue hacer que el modo cli php se llamara a través de http usando file_get_contents. Feo, pero funciona.
ColinM
Canalizar un volcado de una solicitud fastcgi válida directamente a php-fpm con netcat funciona sin tener que instalar un servidor http real, ya que el servidor php-fpm podría estar separado del http
baloo
Esta respuesta es incorrecta. Como se explica en la documentación, el caché del código de operación siempre se borra si el parámetro dado es! = 'Usuario'.
naitsirch
@naitsirch Quizás este fue un error que se corrigió en la última versión. En el momento en que publiqué la respuesta, esto es lo que funcionó para mí. Desafortunadamente, no sé qué versión estaba usando en ese momento, pero esta respuesta aparentemente es útil para otras 25 personas que aparentemente usaban la misma versión que yo ... La documentación no siempre es correcta y definitivamente no siempre es correcta para las versiones anteriores.
ColinM
12

Si desea borrar el caché de apc en el comando: (use sudo si lo necesita)

APCu

php -r "apcu_clear_cache();" 

APC

php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
Léo Benoist
fuente
Recibo un error en mi terminal así, por favor, ayúdame "Error fatal de PHP: Llamada a la función indefinida apc_clear_cache () en el código de línea de comando en la línea 1"
RaviPatidar
1
Debe probar si su APC está instalada correctamente con "php -m | grep apc"
Léo Benoist
9

Si está ejecutando en una pila NGINX / PHP-FPM, su mejor opción es probablemente volver a cargar php-fpm

service php-fpm reload (o cualquiera que sea su comando de recarga en su sistema)

passion4code
fuente
servicio de php5-FPM de recarga es lo que hacer que funcione he comprobado apc.php archivo de estado y el estado de caché que se restableció me necesito esto después de opción adicional apc.stat = 0 a php.ini
Salem
5

Como se define en el documento de APC:

Para borrar el caché, ejecute:

php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
codificadores del oscuro
fuente
4

Otra posibilidad para el uso de la línea de comandos, aún no mencionada, es usar curl.

Esto no resuelve su problema para todas las entradas de caché si está utilizando el script stock apc.php, pero podría llamar un script adaptado u otro que haya implementado.

Esto borra el caché del código de operación:

curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=1&`date +%s`"

Cambie el parámetro OB a 3 para borrar la memoria caché del usuario:

curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=3&`date +%s`"

Pon ambas líneas en un script y llámalo con $ PASSWORD en tu env.

Andy Triggs
fuente
4

Si desea monitorear los resultados a través de json, puede usar este tipo de script:

<?php

$result1 = apc_clear_cache();
$result2 = apc_clear_cache('user');
$result3 = apc_clear_cache('opcode');
$infos = apc_cache_info();
$infos['apc_clear_cache'] = $result1;
$infos["apc_clear_cache('user')"] = $result2;
$infos["apc_clear_cache('opcode')"] = $result3;
$infos["success"] = $result1 && $result2 && $result3;
header('Content-type: application/json');
echo json_encode($infos);

Como se menciona en otras respuestas, esta secuencia de comandos deberá llamarse a través de http o curl y deberá asegurarse si está expuesta en la raíz web de su aplicación. (por ip, token ...)

Bobina
fuente
3

apc_clear_cache () solo funciona en el mismo php SAPI que desea borrar su caché. Si tiene PHP-FPM y desea borrar el caché de apc, debe hacerlo a través de uno de los scripts php, NO la línea de comando, porque los dos cachés están separados.

He escrito CacheTool , una herramienta de línea de comandos que resuelve exactamente este problema y con un comando puede borrar su caché PHP-FPM APC de la línea de comandos (se conecta a php-fpm por usted y ejecuta funciones apc)

También funciona para opcache.

Vea cómo funciona aquí: http://gordalina.github.io/cachetool/

Samuel Gordalina
fuente
2

El establo de APC tiene la opción de borrar un caché en su propia interfaz. Para borrar esas entradas, debe iniciar sesión en la interfaz de apc.

APC tiene la opción de configurar el nombre de usuario y la contraseña en el archivo apc.php.

ingrese la descripción de la imagen aquí

vinothvetrivel
fuente
¿De dónde sacas esta página?
Pacerier
@Pacerier Obtendrá esta interfaz si tiene un php-apcpaquete instalado en su sistema.
Extraño
2

si ejecuta fpm en ubuntu, debe ejecutar el siguiente código (marcado en 12 y 14)

service php5-fpm reload
hrnsky
fuente
1

apc.ini

apc.stat = "1" obligará a APC a registrar (verificar) el script en cada solicitud para determinar si se ha modificado. Si se ha modificado, recompilará y almacenará en caché la nueva versión.

Si esta configuración está desactivada, APC no comprobará, lo que generalmente significa que para forzar a APC a volver a verificar los archivos, el servidor web tendrá que reiniciarse o el caché tendrá que borrarse manualmente. Tenga en cuenta que las configuraciones del servidor web FastCGI pueden no borrar el caché al reiniciar. En un servidor de producción donde los archivos de script rara vez cambian, las estadísticas deshabilitadas pueden lograr un aumento significativo del rendimiento.

mal
fuente
1

La nueva interfaz de administración de APC tiene opciones para agregar / borrar caché de usuario y caché de código de operación. Una funcionalidad interesante es agregar / actualizar / eliminar directorios de la caché de código de operación.

Documentación de administración de APC

ingrese la descripción de la imagen aquí

Jithin jose
fuente
0

Una buena solución para mí era simplemente no usar el caché de usuario obsoleto después de la implementación.

Si agrega un prefijo a cada una de las claves, puede cambiar el prefijo al cambiar la estructura de datos de las entradas de caché. Esto lo ayudará a obtener el siguiente comportamiento en la implementación:

  1. No use entradas de caché obsoletas después de implementar solo estructuras actualizadas
  2. No limpie todo el caché en la implementación para no ralentizar su página
  3. Algunas entradas antiguas en caché se pueden reutilizar después de revertir su implementación (si las entradas ya no se eliminaron automáticamente)
  4. APC eliminará las entradas de caché antiguas después de caducar O en el espacio de caché perdido

Esto es posible solo para el caché del usuario.

mabe.berlin
fuente
0

Crear archivo APC.php

foreach(array('user','opcode','') as $v ){
    apc_clear_cache($v);
}

Ejecútelo desde su navegador.

anshuman
fuente
2
Según tengo entendido, la instancia de CLI no compartirá el mismo segmento de memoria caché APC, por lo que esto no hará más que borrar un segmento de caché APC vacío y aislado.
AB Carroll
dependiendo de las distribuciones y configuraciones, el caché APC puede tener un segmento de memoria separado, lo tengo actualizado para una solución más genérica.
Anshuman
0

Mi solución para la compilación de Symfony con un montón de instancias en el mismo servidor:

Paso 1. Crea un disparador o algo para establecer un indicador de archivo (por ejemplo, comando Symfony) y luego crea marker file...

file_put_contents('clearAPCU','yes sir i can buggy')

Paso 2. En el archivo de índice al inicio, agregue el código de limpieza y elimine marker file.

if(file_exists('clearAPCU')){
    apcu_clear_cache();
    unlink('clearAPCU');
}

Paso 2. Ejecute la aplicación.

Ajsti.pl - Maciej Szewczyk
fuente
-1

Tuvimos un problema con APC y enlaces simbólicos a enlaces simbólicos a archivos; parece ignorar los cambios en los archivos en sí. De alguna manera, el toque táctil en el archivo en sí ayudó. No puedo decir cuál es la diferencia entre modificar un archivo y tocarlo, pero de alguna manera era necesario ...

jakub.lopuszanski
fuente