Question

J'utilisé la commande suivante pour configurer mon cronjob:

sudo crontab -e -u www-data

et la cronjob réelle:

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

J'ai également APC en cours d'exécution sur mon site. APC CLI est le:

apc.enable_cli = 1

Cependant, je reçois l'erreur suivante. On se sent comme le Cron ne peut pas être en cours d'exécution avec assez previlages. le Cron doit être exécuté en tant que root? Sources m'a conseillé contre.

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)

Après un peu de suivi, je me suis retrouvé à ce qui suit:

    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)));
}

Il doit vouloir dire $memSize == 0 mais quand je configurer un script PHP tester et évaluer $memSize, il me donne la bonne valeur. Alors, pourquoi lors d'une tâche cron serait-ce différent?

J'ai commenté dans local.xml le noeud de cache suivant et le cronjob fonctionne bien!. Il serait idéal pour comprendre ce que le noeud suivant fait en réalité. Je suppose que Zend regarde cette config:

    <cache>
        <backend>apc</backend>
        <prefix>MAGE_</prefix>
    </cache>
Était-ce utile?

La solution

Si vous avez activé <backend>apc</backend> et votre site a bien fonctionné, mais cron.sh était pas, cela pourrait signifier que vous avez plusieurs installations de php sur votre serveur.

D'abord en terme which php de la console. Cela vous donnera le php réel qui est utilisé pour l'exécution de votre script php cron.

Par exemple, dans mon cas, j'ai /usr/bin/php.

exécuter /usr/bin/php -m | grep "apc" pour vérifier si la bibliothèque APC est activée. Prochaine vérification /usr/bin/php -i | grep apc pour obtenir config APC.

Les valeurs recommandées pour Magento sont

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

Espérons que cela vous aidera.

Autres conseils

Francis, je l'ai fait quelques recherches sur votre problème et solution à deux est tombé sur: apc.enable_cli = 1 et apc prefix_for_store_ dans local.xml. Vous devrez peut-être redémarrer Apache / Nginx après avoir modifié une configuration APC. Vérifiez les recettes dans ces articles (si vous avez pas déjà): http: //www.magentocommerce .com / conseils / viewthread / 180339 / , http://www.magentodeveloperleedsuk.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-mémoire taille / , http: // www.magecorner.com/magento-apc-cache/ , http://www.qicai.us/solved-uncaught-exception-zend_cache_exception-w ième message-cant-get-apc-mémoire de taille , http://www.creation-site-lyon.com/2010/10/28/magento-cron-et-apc/ (celui-ci est en français, mais vous pouvez le traduire avec Google).

Pour répondre à votre question, non vous ne devriez pas besoin d'exécuter cron.sh en tant que root. Je ne peux pas répondre à pourquoi votre site fonctionne bien avec APC activé mais cron.sh ne fonctionne pas. Je recommande la création d'un script de débogage /var/www/debug.php et copiez les lignes de getFillingPercentage() en elle:

$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);

Exécutez cette commande en utilisant presque la même ligne que votre original cron.sh , mais avec 3 changements importants:

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. Votre script de débogage est le premier argument de cron.sh. Ce sera exécuté au lieu de cron.php
  2. Ajoutez une ligne pour recevoir la sortie Cron MAILTO (utile pour le débogage)
  3. Ne pas sortie de tuyau vers / dev / null, de sorte que les e-mails sont envoyés Cron (ils ne sont pas envoyés s'il n'y a pas de sortie)

Le apc.enable_cli = 1 n'a pas lu de mon /etc/php5/fpm/php.ini ou /etc/php5/fpm/php.ini. Au lieu de cela dans /etc/php5/cli/conf.d/20-apcu.ini Je les 2 dernières inséré lignes:

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

résolu la question. Cette commande php -i | grep 'apc' m'a aidé à réaliser apc.enable_cli était en effet hors contrairement à ce que je pensais.

Tout d'abord si vous avez APC défini comme un type de cache de back-end ou le stockage de session dans local.xml. ne sont pas. APC sera en mesure de faire ce dont il a besoin sans les détails de Magento. Le type de cache est connu pour être problématique ( du moins de mon utilisation ). APC cache généré à partir OpCode serveur php / web existants et les runtimes cache quelle que soit la définition de local.xml Magento ou non.

En second lieu, essayer php -f /full/path/to/magento/cron.php et le by-pass cron.sh bash, si vous voyez des exceptions étant jeté après l'exécution. Je copie normalement l'entrée crontab mot pour mot dans la coque pour vous assurer que son tir hors.

Cependant, je suppose simplement enlever

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

de local.xml et / ou utiliser quelque chose comme Redds ou Memcache serait mieux à la place.

Utiliser apc.php pour valider le cache APC fonctionnera quand même sans l'entrée si vous aimez aussi bien.

J'ai eu le même problème. Mon fournisseur m'a dit, le cron.sh essaierait de modifier les droits de apc, il ne peut pas. Donc, je l'ai enlevé les commandes et l'apc est bien aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top