Різниця між файлами Shell та PHP Cron у 1.9


16

Назва в значній мірі підсумовує це. Чи є різниця між файлом оболонки та файлом php для Cron Magento?

Якщо є різниця, чи є причина запустити одну замість іншої?


Ви краще скористайтеся cron.sh, він перевірить, чи працює якийсь процес cron.php, перш ніж викликати його.
Тай Крістіан

Відповіді:


7

Cron.sh вказує на файл cron.php, тому ви повинні вказати своє завдання cronjob на файл .sh.

Фактично всередині файлу PHP міститься вся логіка, щоб cron виводив завдання з Magento, а файл sh викликає файл PHP.


4
cron.shФайл створений , щоб перевірити , що це не процес хрон працює в Magento , перш ніж почати новий. Завжди використовуйте його як тригер. За певних схем захисту з WHM / cPanel, вам можуть не дозволити запускати скрипти оболонки як завдання cron, і тільки тоді ви безпосередньо запускаєтесь cron.phpіз crontab.
Лабораторії Фіаско

Щоб додати до @FiascoLabs, можливо, ви shell_execвідключили WHM / cPanel, але це не означає, що він cron.phpперевіряється як відключений під час перевірки ini_get('disable_functions'). Тож cron намагається запустити, вважає shell_exec, що він не відключений, намагається використовувати його і не вдається, оскільки він відключений.
знизати

7

Ви повинні використовувати cron.sh, тобто

* * * * * /bin/sh /var/www/html/magento/cron.sh

Залежно від вашого оточення, cron.shпрацює, cron.phpякий працює, cron.shякий працює cron.php. Він розроблений для того, щоб крон Magento не міг виконувати завдання кілька разів або нерестував занадто багато процесів, які перетинаються.


Перший раз, коли він буде запущений, cron.shперевірить поточні запущені процеси, щоб побачити, чи cron.phpвже запущений (без аргументів). Якщо ні, то він виконає

/usr/bin/php /var/www/html/magento/cron.php &

Під час cron.phpпершого запуску (і залежно від того, чи підтримує його ОС / хост) він породжується 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 із зазначеними парамами. Якщо ні, то він передасть його назад 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завдань на крон (в основному всі вони), а також alwaysроботи з cron (як enterprise_refresh_index). Поділяючи їх на два процеси, це зменшує ризик тривалої роботи від блокування інших.


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

встановіть іншу константу, тут ви можете пройти 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.php

Як вже було сказано, у cron немає робочого dir або будь-якої іншої змінної середовища, тому робочий dir встановлюється.

// 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;
}

Якщо ви називаєте cron.php curl чи щось подібне, імена файлів виправлені?

// 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) {

якщо кронмода не встановлена, ми викликаємо 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;
        }
    }

І тоді Магенто нарешті робить свою роботу:

  • завантажте спостерігачів події та додайте їх до пулу спостерігачів

    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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.