1.9でのシェルとPHP Cronファイルの違い


16

タイトルはほとんどそれを要約しています。Magento cronのシェルファイルとphpファイルに違いはありますか?

違いがある場合、他の代わりに一方を実行する理由がありますか?


cron.shを使用した方がよいでしょう。それは、呼び出す前にcron.phpプロセスが実行されているかどうかをチェックします。
タイのキリスト教

回答:


7

cron.shはcron.phpファイルを指しているので、cronjobタスクを.shファイルに向ける必要があります。

基本的にPHPファイル内には、Magentoからジョブを取得するcronのすべてのロジックが存在し、shファイルはPHPファイルを呼び出します。


4
cron.shファイルは新しいものを始める前に、Magentoの中で実行されているcronプロセスがないことを確認するために設定されています。常にトリガーとして使用してください。WHM / cPanelを使用した特定のセキュリティスキームでは、シェルスクリプトをcronジョブとして実行することは許可されずcron.php、crontabから直接実行できます。
Fiasco Labs 14年

@FiascoLabsに追加するにはshell_exec、WHM / cPanelで無効にした可能性がありますが、それはcron.phpチェック時に無効と報告されるという意味ではありませんini_get('disable_functions')。そのため、cronは実行を試み、無効になってshell_execないと見なし、使用しようとしますが、無効になっているため失敗します。肩をすくめる
-pspahn

7

を使用する必要があります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ます。defaultalways

/usr/bin/php /var/www/html/magento/cron.php -mdefault &
/usr/bin/php /var/www/html/magento/cron.php -malways &

そしてcron.php最後に、Magentoがdefaultcronジョブ(ほとんどすべて)とalwayscronジョブ(などenterprise_refresh_index)を実行するようにトリガーします。これらを2つのプロセスに分けることにより、長時間実行されるジョブが他のジョブをブロックするリスクを減らします。


4

cron.sh

/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

別の定数を設定します。ここではalwaysdefault明示的に渡すことができます。

MODE=""
if [ ! "$2" = "" ] ; then
    MODE=" $2"
fi

cronには環境変数がないため、単にを呼び出すことはできませんphpwhichPHPバイナリがどこに存在するかを教えてくれます。/bin/php

PHP_BIN=`which php`

$0__FILE__phpのように、ファイル自体です

# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`

わからない正確にどのようにこの作品が、それが何をするか:コールcron.phpphp

#   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.php

すでに述べたように、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::dispatchcronタスクを実行しています。

    if ($isShellDisabled) {
        Mage::dispatchEvent('always');
        Mage::dispatchEvent('default');
    } else {
        Mage::dispatchEvent($cronMode);
    }
} catch (Exception $e) {
    Mage::printException($e);
    exit(1);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.