Вопрос

Я использовал следующую команду для настройки моего Cronjob:

sudo crontab -e -u www-data

и фактический Cronjob:

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

У меня также есть APC, работающий на моем сайте. APC CLI включен:

apc.enable_cli = 1

Однако я получаю следующую ошибку. Такое ощущение, что Cron, возможно, не работает с достаточным количеством предыдущих. Следует ли запустить Cron как корень? Источники советовали мне против этого.

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)

После небольшого отслеживания я оказался на следующем:

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

Так что это должно означать $memSize == 0 Однако, когда я настраиваю тестовый скрипт PHP и оцениваю $memSize, это дает мне правильную ценность. Так почему же во время Cronjob это было бы другое?

Я прокомментировал в local.xml Следующий узел кеша и Cronjob работают нормально. Было бы идеально понять, что на самом деле делает следующий узел. Я считаю, что Zend смотрит на эту конфигурацию:

    <cache>
        <backend>apc</backend>
        <prefix>MAGE_</prefix>
    </cache>
Это было полезно?

Решение

Если вы включили <backend>apc</backend> И ваш сайт работал нормально, но cron.sh Это не так, это могло означать, что у вас есть несколько инсталляций PHP на вашем сервере.

Прежде всего беги в консоли which php. Анкет Это даст вам фактический PHP, который используется для запуска вашего сценария PHP Cron.

Например, в моем случае у меня есть /usr/bin/php.

Теперь беги /usr/bin/php -m | grep "apc" Чтобы проверить, включена ли библиотека APC. Следующая проверка /usr/bin/php -i | grep apc Чтобы получить конфигурацию APC.

Рекомендуемые значения для Magento

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

Надеюсь, что это поможет вам.

Другие советы

Фрэнсис, я провел некоторое исследование вашей проблемы, и наступило два решения: apc.enable_cli = 1 а также APC PREFIX_FOR_STORE_ в local.xml. Возможно, вам потребуется перезапустить Apache/Nginx после изменения любой конфигурации APC. Проверьте рецепты в этих статьях (если вы еще этого не сделали): http://www.magentocommerce.com/boards/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-memory-size/, http://www.magecorner.com/magento-apc-cache/, http://www.qicai.us/solved-uncauge-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 Один из них на французском языке, но вы можете перевести его с помощью Google).

Чтобы ответить на ваш вопрос, нет, вам не нужно запускать Cron.sh как root. Я не могу ответить, почему ваш сайт работает нормально с включенным APC, но Cron.sh нет. Я бы порекомендовал создать сценарий отладки /var/www/debug.php и скопировать строки из getFillingPercentage() внутрь:

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

Запустите эту команду, используя почти ту же строку, что и ваш оригинал Cron.sh, но с 3 важными изменениями:

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. Ваш сценарий отладки - первый аргумент Cron.sh. Это будет запускаться вместо cron.php
  2. Добавьте линию Mailto для получения вывода Cron (полезно для отладки)
  3. Не выводите вывод в /dev /null, поэтому электронные письма Cron отправляются (они не отправляются, если нет вывода)

А apc.enable_cli = 1 не читали из моего /etc/php5/fpm/php.ini или же /etc/php5/fpm/php.ini. Анкет Вместо этого в /etc/php5/cli/conf.d/20-apcu.ini Я вставил две последние линии:

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

Это решило проблему. Эта команда php -i | grep 'apc' помог мне понять apc.enable_cli действительно был в противоречии тому, что я думал.

Во -первых, если у вас есть APC, определяемый как тип бэкэнд -кэша или хранилище сеанса в local.xml. Анкет не. APC сможет делать то, что ему нужно, без деталей от Magento. Известно, что тип кэша проблематичен (По крайней мере, из моего использования) APC будет кэшировать сгенерированный OPCODE из существующего времени запуска PHP/веб -сервера и кэшировать их независимо от Magento local.xml определение или нет.

Во -вторых, попробуйте php -f /full/path/to/magento/cron.php и обойти удар cron.sh, если вы видите исключения, брошенные после выполнения. Обычно я копирую дословно в оболочке Crontab, чтобы убедиться, что она стреляет.

Тем не менее, я бы подозревал просто удаление

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

из local.xml и/или использовать что -то вроде Redds или Memcache вместо этого было бы лучше.

Использовать apc.php Чтобы подтвердить кэш APC, все равно будет функционировать без записи, если вам также нравится.

У меня такая же проблема. Мой провайдер сказал мне, что Cron.Sh попытается изменить права APC, что это не разрешено. Поэтому я удалил команды, и APC тоже в порядке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top