Pregunta

Usé el siguiente comando para configurar mi cronjob:

sudo crontab -e -u www-data

y el cronjob real:

*/5 * * * * /bin/sh /var/www/cron.sh >/dev/null 2>&1

También tengo APC ejecutándose en mi sitio. APC CLI está en:

apc.enable_cli = 1

Sin embargo, recibo el siguiente error. Parece que el Cron puede no estar funcionando con suficientes previlientes. ¿Debería ejecutarse el cron como root? Las fuentes me aconsejaron contra esto.

Cron error while executing rule_apply_all:

exception 'Zend_Cache_Exception' with message 'can't get apc memory size' in /var/www/lib/Zend/Cache.php:209
Stack trace:
#0 /var/www/lib/Zend/Cache/Backend/Apc.php(191): Zend_Cache::throwException('can't get apc m...')
#1 /var/www/lib/Zend/Cache/Backend/TwoLevels.php(518): Zend_Cache_Backend_Apc->getFillingPercentage()
#2 /var/www/lib/Zend/Cache/Backend/TwoLevels.php(192): Zend_Cache_Backend_TwoLevels->_getFastFillingPercentage('saving')
#3 /var/www/lib/Zend/Cache/Core.php(390): Zend_Cache_Backend_TwoLevels->save('1391196921', 'MAGE_AW_FUE_LOC...', Array, 1800)
#4 /var/www/lib/Varien/Cache/Core.php(76): Zend_Cache_Core->save('1391196921', 'AW_FUE_LOCK', Array, 1800, 8)
#5 /var/www/app/code/core/Mage/Core/Model/Cache.php(380): Varien_Cache_Core->save('1391196921', 'AW_FUE_LOCK', Array, 1800)
#6 /var/www/app/code/core/Mage/Core/Model/App.php(1147): Mage_Core_Model_Cache->save(1391196921, 'aw_fue_lock', Array, 1800)
#7 /var/www/app/code/local/AW/Followupemail/Model/Cron.php(98): Mage_Core_Model_App->saveCache(1391196921, 'aw_fue_lock', Array, 1800)

Después de un poco de rastreo, terminé a lo siguiente:

    public function getFillingPercentage()
{
    $mem = apc_sma_info(true);
    $memSize    = $mem['num_seg'] * $mem['seg_size'];
    $memAvailable= $mem['avail_mem'];
    $memUsed = $memSize - $memAvailable;
    if ($memSize == 0) {
        Zend_Cache::throwException('can\'t get apc memory size');
    }
    if ($memUsed > $memSize) {
        return 100;
    }
    return ((int) (100. * ($memUsed / $memSize)));
}

Entonces debe significar $memSize == 0 Sin embargo, cuando configuro un script de PHP y evalúo $memSize, me da el valor correcto. Entonces, ¿por qué durante un Cronjob sería esto diferente?

He comentado en local.xml El siguiente nodo de caché y el Cronjob se está ejecutando bien. Sería ideal comprender lo que realmente hace el siguiente nodo. Supongo que Zend mira esta configuración:

    <cache>
        <backend>apc</backend>
        <prefix>MAGE_</prefix>
    </cache>
¿Fue útil?

Solución

Si estás habilitado <backend>apc</backend> Y su sitio funcionó bien pero cron.sh No fue, podría significar que tiene varias instalaciones de PHP en su servidor.

En primer lugar, correr en consola which php. Esto le dará el PHP real que se utiliza para ejecutar su script CRON PHP.

Por ejemplo, en mi caso tengo /usr/bin/php.

Ahora corre /usr/bin/php -m | grep "apc" Para verificar si la biblioteca APC está habilitada. Siguiente cheque /usr/bin/php -i | grep apc Para obtener la configuración APC.

Los valores recomendados para Magento son

apc.enabled=1
apc.shm_size=512M
apc.num_files_hint=10000
apc.user_entries_hint=10000
apc.max_file_size=5M
apc.stat=0
apc.optimization=0
apc.shm_segments=1
apc.enable_cli=1
apc.cache_by_default=1
apc.include_once_override=1

Espero que esto te ayudará.

Otros consejos

Francis, investigué un poco sobre su problema y se encontraron dos solución: apc.enable_cli = 1 y APC prefix_for_store_ en local.xml. Es posible que deba reiniciar Apache/Nginx después de cambiar cualquier configuración APC. Consulte las recetas en estos artículos (si aún no lo ha hecho): http://www.magentocommerce.com/boards/viewthread/180339/, http://www.magentodeveloveledsuk.co.uk/zend_cache_exception-cant-get-apc-memory-size/, http://phpbugs.wordpress.com/2012/11/03/magento-exception-zend_cache_exception-with-message-cant-get-apc-memory-size/, http://www.magecorner.com/magento-apc-cache/, http://www.qicai.us/solved-ingeught-exception-zend_cache_exception-with-message-cant-get-apc-memory --size, http://www.creation-site-lyon.com/2010/10/28/magento-cron-et-apc/(THIS Uno está en francés, pero puedes traducirlo usando Google).

Para responder a su pregunta, no, no debería necesitar ejecutar cron.sh como root. No puedo responder por qué su sitio funciona bien con APC habilitado, pero Cron.sh no. Recomendaría crear un script de depuración /var/www/debug.php y copiar las líneas de getFillingPercentage() en ello:

$mem = apc_sma_info(true);
$memSize    = $mem['num_seg'] * $mem['seg_size'];
$memAvailable= $mem['avail_mem'];
$memUsed = $memSize - $memAvailable;

var_dump($mem, $memSize, $memAvailable, $memUsed);

Ejecute este comando usando casi la misma línea que su original cron.sh, pero con 3 cambios importantes:

MAILTO="admin@example.com"  # <-- Obvi this should be a real email address. #
*/5 * * * * /bin/sh /var/www/cron.sh /var/www/debug.php 2>&1
  1. Su guión de depuración es el primer argumento a Cron.sh. Esto se ejecutará en lugar de cron.php
  2. Agregue una línea MailTo para recibir la salida cron (útil para la depuración)
  3. No tuve la salida a /dev /null, por lo que se envían los correos electrónicos de Cron (no se envían si no hay salida)

los apc.enable_cli = 1 no estaba siendo leído de mi /etc/php5/fpm/php.ini o /etc/php5/fpm/php.ini. En su lugar en /etc/php5/cli/conf.d/20-apcu.ini Inserté las 2 últimas líneas:

extension=apcu.so
apc.enabled = 1
apc.enable_cli = 1

Esto resolvió el problema. Este comando php -i | grep 'apc' me ayudó a darme cuenta apc.enable_cli De hecho, estaba fuera de lo contrario a lo que pensaba.

Primero si tiene APC definido como un tipo de caché de backend o almacenamiento de sesión en local.xml. no. APC podrá hacer lo que necesita sin detalles de Magento. Se sabe que el tipo de caché es problemático (al menos de mi uso). APC se generó Cache Generado OpCode a partir de horarios de ejecución de servidor PHP/web existentes y caché independientemente de Magento's local.xml definición o no.

Segundo intento php -f /full/path/to/magento/cron.php y pasar la fiesta cron.sh, si ve que se están lanzando excepciones después de ejecutar. Normalmente copio la entrada crontab textualmente en el shell para asegurarme de que se dispare.

Sin embargo, sospecharía simplemente eliminar

<cache>
    <backend>apc</backend>
    <prefix>MAGE_</prefix>
</cache>

de local.xml Y/o usar algo como Redds o Memcache sería mejor.

Utilizar apc.php Para validar el caché APC seguirá funcionando sin la entrada si también lo desea.

Yo tuve el mismo problema. Mi proveedor me dijo que el Cron.sh intentaría cambiar los derechos de APC que no se le permite. Así que eliminé los comandos y el APC también está bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top