回答:
cron.shはcron.phpファイルを指しているので、cronjobタスクを.shファイルに向ける必要があります。
基本的にPHPファイル内には、Magentoからジョブを取得するcronのすべてのロジックが存在し、shファイルはPHPファイルを呼び出します。
cron.sh
ファイルは新しいものを始める前に、Magentoの中で実行されているcronプロセスがないことを確認するために設定されています。常にトリガーとして使用してください。WHM / cPanelを使用した特定のセキュリティスキームでは、シェルスクリプトをcronジョブとして実行することは許可されずcron.php
、crontabから直接実行できます。
shell_exec
、WHM / cPanelで無効にした可能性がありますが、それはcron.php
チェック時に無効と報告されるという意味ではありませんini_get('disable_functions')
。そのため、cronは実行を試み、無効になってshell_exec
いないと見なし、使用しようとしますが、無効になっているため失敗します。肩をすくめる
を使用する必要がありますcron.sh
、すなわち
* * * * * /bin/sh /var/www/html/magento/cron.sh
ご使用の環境によっては、cron.sh
実行cron.php
走るcron.sh
ランをcron.php
。これは、Magentoのcronが複数回ジョブを実行したり、重複するプロセスを大量に生成したりするのを防ぐように設計されています。
初回の実行時にcron.sh
は、現在実行中のプロセスをチェックして、cron.php
すでに実行されているかどうか(引数なし)を確認します。そうでない場合は、実行されます
/usr/bin/php /var/www/html/magento/cron.php &
上cron.php
の最初の実行(およびあなたのOS /ホストがサポートしている場合によっては)それが出現しますcron.sh
再び二回、しかし、この時間は引数を渡します:
/bin/sh /var/www/html/magento/cron.sh cron.php -mdefault 1 > /dev/null 2>&1 &
/bin/sh /var/www/html/magento/cron.sh cron.php -malways 1 > /dev/null 2>&1 &
バックでのcron.sh
二度目の、それはcronのは、指定のparamsで実行されているかどうかを確認するためにもう一度チェックします。そうでない場合は、またはで返されcron.php
ます。default
always
/usr/bin/php /var/www/html/magento/cron.php -mdefault &
/usr/bin/php /var/www/html/magento/cron.php -malways &
そしてcron.php
最後に、Magentoがdefault
cronジョブ(ほとんどすべて)とalways
cronジョブ(などenterprise_refresh_index
)を実行するようにトリガーします。これらを2つのプロセスに分けることにより、長時間実行されるジョブが他のジョブをブロックするリスクを減らします。
/bin/sh
このスクリプトの処理に使用
#!/bin/sh
CRONSCRIPT
呼び出すファイルに定数を設定します。$ 1は次のような最初の引数ですcron.sh /whatever/path/cron.php
# location of the php binary
if [ ! "$1" = "" ] ; then
CRONSCRIPT=$1
else
CRONSCRIPT=cron.php
fi
別の定数を設定します。ここではalways
、default
明示的に渡すことができます。
MODE=""
if [ ! "$2" = "" ] ; then
MODE=" $2"
fi
cronには環境変数がないため、単にを呼び出すことはできませんphp
。which
PHPバイナリがどこに存在するかを教えてくれます。/bin/php
PHP_BIN=`which php`
$0
__FILE__
phpのように、ファイル自体です
# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`
わからない正確にどのようにこの作品が、それが何をするか:コールcron.php
とphp
。
# prepend the intallation path if not given an absolute path
if [ "$INSTALLDIR" != "" -a "`expr index $CRONSCRIPT /`" != "1" ];then
if ! ps auxwww | grep "$INSTALLDIR$CRONSCRIPT$MODE" | grep -v grep 1>/dev/null 2>/dev/null ; then
$PHP_BIN $INSTALLDIR$CRONSCRIPT$MODE &
fi
else
if ! ps auxwww | grep "$CRONSCRIPT$MODE" | grep -v grep | grep -v cron.sh 1>/dev/null 2>/dev/null ; then
$PHP_BIN $CRONSCRIPT$MODE &
fi
fi
すでに述べたように、cronには作業ディレクトリまたは他の環境変数はないため、作業ディレクトリが設定されます。
// Change current directory to the directory of current script
chdir(dirname(__FILE__));
require 'app/Mage.php';
if (!Mage::isInstalled()) {
echo "Application is not installed yet, please complete install wizard first.";
exit;
}
curlなどでcron.phpを呼び出すと、ファイル名は修正されますか?
// Only for urls
// Don't remove this
$_SERVER['SCRIPT_NAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_NAME']);
$_SERVER['SCRIPT_FILENAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_FILENAME']);
Mage::app('admin')->setUseSessionInUrl(false);
umaskを設定します。これは、作成される新しいファイルのパーミッションを定義します-パーミッションなし、誰も何も許可されません。
umask(0);
必要なすべての機能が許可されていることを確認してください。
$disabledFuncs = explode(',', ini_get('disable_functions'));
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;
セットする $cronmode
try {
if (stripos(PHP_OS, 'win') === false) {
$options = getopt('m::');
if (isset($options['m'])) {
if ($options['m'] == 'always') {
$cronMode = 'always';
} elseif ($options['m'] == 'default') {
$cronMode = 'default';
} else {
Mage::throwException('Unrecognized cron mode was defined');
}
} else if (!$isShellDisabled) {
cronmodeが設定されていない場合cron.sh
、両方のモードで呼び出します
$fileName = basename(__FILE__);
$baseDir = dirname(__FILE__);
shell_exec("/bin/sh $baseDir/cron.sh $fileName -mdefault 1 > /dev/null 2>&1 &");
shell_exec("/bin/sh $baseDir/cron.sh $fileName -malways 1 > /dev/null 2>&1 &");
exit;
}
}
そして、magentoはようやく仕事を始めました。
イベントオブザーバーを読み込み、オブザーバープールに追加します
Mage::getConfig()->init()->loadEventObservers('crontab');
Mage::app()->addEventArea('crontab');
場合はshell_exec
無効になっているので、イベントを送出\Aoe_Scheduler_Model_Observer::dispatchAlways
し、\Mage_Cron_Model_Observer::dispatch
cronタスクを実行しています。
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}