Назва в значній мірі підсумовує це. Чи є різниця між файлом оболонки та файлом php для Cron Magento?
Якщо є різниця, чи є причина запустити одну замість іншої?
Назва в значній мірі підсумовує це. Чи є різниця між файлом оболонки та файлом php для Cron Magento?
Якщо є різниця, чи є причина запустити одну замість іншої?
Відповіді:
Cron.sh вказує на файл cron.php, тому ви повинні вказати своє завдання cronjob на файл .sh.
Фактично всередині файлу PHP міститься вся логіка, щоб cron виводив завдання з Magento, а файл sh викликає файл PHP.
cron.sh
Файл створений , щоб перевірити , що це не процес хрон працює в Magento , перш ніж почати новий. Завжди використовуйте його як тригер. За певних схем захисту з 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.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
). Поділяючи їх на два процеси, це зменшує ризик тривалої роботи від блокування інших.
Використовуйте /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 немає робочого 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);
}