質問

次のコマンドを使用して、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 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構成を取得します。

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

これがあなたを助けることを願っています。

他のヒント

フランシス、私はあなたの問題についていくつかの研究をしました、そして、2つの解決策が出会いました: APC.ENABLE_CLI = 1apc prefix_for_store_ local.xmlで。 APC構成を変更した後、Apache/nginxを再起動する必要がある場合があります。これらの記事のレシピを確認してください(まだ持っていない場合): http://www.magentocommerce.com/boards/viewthread/180339/, http://www.magentodeveloperleedsuk.co.uk/zend_cache_exception-cant-apc-memory-size/, http://phpbugs.wordpress.com/2012/11/03/magento-exception-zend_cache_exception--message-cant-get-apc-memory-size/, http://www.magecorner.com/magento-apc-cache/, http://www.qicai.us/solved-uncaught-exception-zend_cache_exception-with-cant-get-apc-memory-size, http://www.creation-site-lyon.com/2010/10/28/magento-cron-et-apc/(this 1つはフランス語ですが、Googleを使用して翻訳できます)。

あなたの質問に答えるために、あなたはrootとして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);

オリジナルとほぼ同じ行を使用してこのコマンドを実行します 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. CRON出力を受信するためのMailToラインを追加します(デバッグに役立ちます)
  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 最後の2行を挿入しました:

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サーバーのランタイムから生成されたオペコードをキャッシュし、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