Frage

Ich habe den folgenden Befehl verwendet, um meinen Cronjob einzurichten:

sudo crontab -e -u www-data

und der eigentliche Cronjob:

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

Ich habe auch APC auf meiner Website. APC CLI ist auf:

apc.enable_cli = 1

Ich bekomme jedoch den folgenden Fehler. Es fühlt sich an, als würde der Cron möglicherweise nicht mit genügend Prävilages laufen. Sollte der Cron als Wurzel ausgeführt werden? Quellen beriet mich dagegen.

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)

Nach ein wenig Verfolgung landete ich Folgendes:

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

Also muss es bedeuten $memSize == 0 Wenn ich jedoch ein Test -PHP -Skript eingerichte und bewerten $memSize, Es gibt mir den richtigen Wert. Warum wäre das während eines Cronjobs anders?

Ich habe mich kommentiert local.xml Der folgende Cache -Knoten und der Cronjob laufen gut. Es wäre ideal zu verstehen, was der folgende Knoten tatsächlich tut. Ich nehme an, dass Zend diese Konfiguration betrachtet:

    <cache>
        <backend>apc</backend>
        <prefix>MAGE_</prefix>
    </cache>
War es hilfreich?

Lösung

Wenn Sie aktiviert sind <backend>apc</backend> Und Ihre Website hat aber gut funktioniert cron.sh Nicht, es könnte bedeuten, dass Sie mehrere PHP -Installationen auf Ihrem Server haben.

Zunächst einmal in der Konsole rennen which php. Dadurch erhalten Sie den tatsächlichen PHP, der zum Ausführen Ihres Cron -PHP -Skripts verwendet wird.

Zum Beispiel habe ich in meinem Fall /usr/bin/php.

Jetzt rennen /usr/bin/php -m | grep "apc" So überprüfen Sie, ob die APC -Bibliothek aktiviert ist. Nächster Scheck /usr/bin/php -i | grep apc APC -Konfiguration erhalten.

Empfohlene Werte für Magento sind

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

Hoffe das wird dir helfen.

Andere Tipps

Franziskus, ich habe einige Nachforschungen über Ihr Problem gemacht und zwei Lösung standen auf: apc.enable_cli = 1 und APC PREFIX_FOR_STORE_ in lokal.xml. Möglicherweise müssen Sie Apache/Nginx neu starten, nachdem Sie eine APC -Konfiguration geändert haben. Überprüfen Sie die Rezepte in diesen Artikeln (falls Sie es noch nicht getan haben): http://www.magentocommerce.com/boards/viewthread/180339/, http://www.magentodevelduedsuk.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-uncaughaus-exception-zend_cache_exception-with-message-cant-get-apc-memory-size, http://www.creation-siite-lyon.com/2010/10/28/magento-cron-et-apc/(this Einer ist in Französisch, aber Sie können es mit Google übersetzen).

Um Ihre Frage zu beantworten, müssen Sie Cron.sh nicht als Root ausführen. Ich kann nicht beantworten, warum Ihre Website mit aktiviertem APC gut funktioniert, aber Cron.sh nicht. Ich würde empfehlen, ein Debug -Skript zu erstellen /var/www/debug.php und kopieren Sie die Zeilen von getFillingPercentage() hinein:

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

Führen Sie diesen Befehl mit fast der gleichen Zeile wie Ihr Original aus cron.sh, aber mit 3 wichtigen Änderungen:

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. Ihr Debug -Skript ist das erste Argument für Cron.sh. Dies wird statt cron.php ausgeführt
  2. Fügen Sie eine Mailto -Linie hinzu, um die Cron -Ausgabe zu erhalten (nützlich zum Debuggen).
  3. NICHT AUSGABE AUF /DEV /NULL REPET, DASS DIE CRON -E -Mails gesendet werden (sie werden nicht gesendet, wenn keine Ausgabe vorliegt).

Das apc.enable_cli = 1 wurde nicht von meinem gelesen /etc/php5/fpm/php.ini oder /etc/php5/fpm/php.ini. Stattdessen in /etc/php5/cli/conf.d/20-apcu.ini Ich habe die 2 letzten Zeilen eingefügt:

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

Dies löste das Problem. Dieser Befehl php -i | grep 'apc' half mir zu erkennen apc.enable_cli war in der Tat im Widerspruch zu dem, was ich dachte.

Zuerst, wenn Sie APC als Backend -Cache -Typ oder Sitzungsspeicher in definiert haben local.xml. nicht. APC wird in der Lage sein, das zu tun, was es braucht, ohne Details von Magento. Der Cache -Typ ist als problematisch bekannt (Zumindest aus meiner Verwendung). APC wird generiert OPCode aus vorhandenen PHP/Web -Server -Runtimes und danach, unabhängig von Magento's local.xml Definition oder nicht.

Zweiter Versuch php -f /full/path/to/magento/cron.php und umgehen die Bash cron.sh, Wenn Sie Ausnahmen sehen, die nach der Ausführung geworfen werden. Normalerweise kopiere ich den Crontab -Eintragsverbatim in die Schale, um sicherzustellen, dass er abbricht.

Ich würde jedoch vermuten, einfach nur zu entfernen

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

aus local.xml Und/oder stattdessen so etwas wie Redds oder Memcache zu verwenden, wäre besser.

Nutzen apc.php Um den APC -Cache zu validieren, funktioniert auch ohne den Eintrag, wenn Sie auch möchten.

Ich hatte das gleiche Problem. Mein Anbieter sagte mir, der Cron.sh würde versuchen, die Rechte der APC zu ändern, darf er nicht gestattet sein. Also habe ich die Befehle entfernt und die APC ist auch in Ordnung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top