Başlık hemen hemen özetliyor. Magento cron için kabuk dosyası ve php dosyası arasında bir fark var mı?
Bir fark varsa birini diğerinin yerine çalıştırmak için bir neden var mı?
Başlık hemen hemen özetliyor. Magento cron için kabuk dosyası ve php dosyası arasında bir fark var mı?
Bir fark varsa birini diğerinin yerine çalıştırmak için bir neden var mı?
Yanıtlar:
Cron.sh cron.php dosyasını işaret ediyor, bu nedenle cronjob görevinizi .sh dosyasına işaret etmelisiniz.
Temelde PHP dosyasının içinde Magento'dan iş almak için cronun tüm mantığı bulunur ve sh dosyası PHP dosyasını çağırır.
cron.sh
Dosya bir yenisini başlatmadan önce Magento çalışan bir cron süreci olmadığını kontrol etmek için kurulur. Her zaman tetikleyici olarak kullanın. WHM / cPanel ile belirli güvenlik şemaları altında, kabuk komut dosyalarını cron işleri olarak çalıştırmanıza izin verilmeyebilir ve yalnızca o zaman doğrudan cron.php
crontab'dan çalıştırılırsınız .
shell_exec
WHM / cPanel'de devre dışı bırakmış olabilirsiniz , ancak bu, cron.php
kontroller sırasında devre dışı olarak bildirildiği anlamına gelmez ini_get('disable_functions')
. Cron çalışır çalışmasına Yani görür shell_exec
olarak değil bunu kullanmaya çalışır, özürlü ve özürlü olduğu için başarısız olur. shrug
Kullanıyor olmalısınız cron.sh
, yani
* * * * * /bin/sh /var/www/html/magento/cron.sh
Ortamınızda bağlı olarak cron.sh
ishal cron.php
olan ishal cron.sh
hangi çalışır cron.php
. Magento'nun cronunun işleri birkaç kez yürütmesini veya çakışan çok fazla süreç oluşturmasını önlemek için tasarlanmıştır.
İlk kez çalıştırıldığında, halihazırda çalışmakta cron.sh
olup olmadığını görmek için mevcut cron.php
herhangi bir işlemi kontrol eder (herhangi bir argüman olmadan). Değilse, yürütür
/usr/bin/php /var/www/html/magento/cron.php &
On'un cron.php
ilk çalıştırma (ve OS / konak destekleri bunu bağlı olarak), bu doğacaktır cron.sh
tekrar iki kez, ama bu sefer argümanları geçen:
/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
İkinci kez geri döndüğümüzde, cron'un belirtilen parametrelerle çalışıp çalışmadığını tekrar kontrol edecektir. Değilse, cron.php
ya default
ya ile geri döner always
.
/usr/bin/php /var/www/html/magento/cron.php -mdefault &
/usr/bin/php /var/www/html/magento/cron.php -malways &
Ve cron.php
son kez Magento'yu default
cron işleri (hemen hemen hepsi) ve always
cron işleri (gibi enterprise_refresh_index
) çalıştırması için tetikleyecek . Bunları iki prosese ayırarak uzun süren bir işin başkalarını engellememe riskini azaltır.
/bin/sh
Bu komut dosyasını işlemek için kullanın
#!/bin/sh
CRONSCRIPT
Aranacak dosyayla bir sabit ayarlayın . 1 $ ilk argüman.cron.sh /whatever/path/cron.php
# location of the php binary
if [ ! "$1" = "" ] ; then
CRONSCRIPT=$1
else
CRONSCRIPT=cron.php
fi
başka bir sabit belirleyin, buradan geçebilir always
veya default
açıkça yapabilirsiniz .
MODE=""
if [ ! "$2" = "" ] ; then
MODE=" $2"
fi
cron herhangi bir ortam değişkenine sahip değildir, bu nedenle sadece arayamazsınız php
. which
php ikili dosyasının nerede yaşadığını söyler, büyük olasılıkla/bin/php
PHP_BIN=`which php`
$0
__FILE__
php gibi, dosyanın kendisi
# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`
Emin değil tam olarak nasıl bu çalışır, ancak ne yaptığını: çağrı cron.php
ile 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
Daha önce de belirtildiği gibi, cron'un bir çalışma dizini veya başka bir ortam değişkeni yoktur, bu nedenle çalışma dizini ayarlanır.
// 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'yi kıvrılma veya başka bir şeyle çağırırsanız, dosya adları sabit mi?
// 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);
Yeni izinlerin hangi izinlerle oluşturulduğunu tanımlayan umask'ı ayarlayın - sıfır izin, hiç kimsenin bir şey yapmasına izin verilmez.
umask(0);
Gerekli tüm işlevlere izin verildiğinden emin olun.
$disabledFuncs = explode(',', ini_get('disable_functions'));
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;
Ayarlamak $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 ayarlanmadıysa, cron.sh
her iki modla da çağırırız
$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;
}
}
Ve sonra magento sonunda işini yapıyor:
olay gözlemcilerini yükleyin ve gözlemci havuzuna ekleyin
Mage::getConfig()->init()->loadEventObservers('crontab');
Mage::app()->addEventArea('crontab');
eğer shell_exec
özürlü, yani, olaylar gönderir \Aoe_Scheduler_Model_Observer::dispatchAlways
ve \Mage_Cron_Model_Observer::dispatch
cron görevlerini yayınlanıyor.
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}