我使用以下命令来设置我的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 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. 。这将为您提供用于运行CRON PHP脚本的实际PHP。

例如,就我而言,我有 /usr/bin/php.

现在运行 /usr/bin/php -m | grep "apc" 检查是否启用了APC库。接下来的检查 /usr/bin/php -i | grep apc 获取APC配置。

推荐的洋红色值是

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

希望这会帮助你。

其他提示

弗朗西斯(Francis),我对您的问题进行了一些研究,并提出了两个解决方案: apc.enable_cli = 1apc prefix_for_store_ 在local.xml中。更改任何APC配置后,您可能需要重新启动Apache/nginx。检查这些文章中的食谱(如果还没有): http://www.magentocommerce.com/boards/viewthread/180339/, http://www.magentodeveloperledsuk.co.uk/zend_cache_exception-cant-cant-get-apc-memory-size/, http://phpbugs.wordpress.com/2012/11/03/magento-exception-zend_cache_cache_expection-with-message-cant-cant-get-ap-apc-memory-size/, http://www.magecorner.com/magento-apc-cache/, http://www.qicai.us/solved-uncaught-exception-zend_cache_cache_exception-with-message-cant-get-get-apc-memory-mize, http://www.creation-site-lyon.com/2010/10/28/magento-cron-et-et-apc/(THIS 一个是法语,但您可以使用Google翻译它。

要回答您的问题,不,您不需要将cron.sh作为根。我无法回答为什么您的网站可以通过启用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);

使用与原始的几乎相同的行运行此命令 克朗, ,但有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. 添加以接收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将从现有的PHP/Web服务器运行时缓存生成OpCode,并缓存它们,而不管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归因
scroll top