質問
次のコマンドを使用して、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 = 1 と apc 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
- デバッグスクリプトは、cron.shの最初の議論です。これは、cron.phpの代わりに実行されます
- CRON出力を受信するためのMailToラインを追加します(デバッグに役立ちます)
- /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も問題ありません。