1.9 sürümünde Shell ve PHP Cron dosyaları arasındaki fark


16

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ı?


Cron.sh dosyasını kullanmanız daha iyi olur, çağırmadan önce çalışan herhangi bir cron.php işlemi olup olmadığını kontrol eder.
Tai Christian

Yanıtlar:


7

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.


4
cron.shDosya 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.phpcrontab'dan çalıştırılırsınız .
Fiasco Labs

@FiascoLabs'a eklemek için shell_execWHM / cPanel'de devre dışı bırakmış olabilirsiniz , ancak bu, cron.phpkontroller 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_execolarak değil bunu kullanmaya çalışır, özürlü ve özürlü olduğu için başarısız olur. shrug
pspahn

7

Kullanıyor olmalısınız cron.sh, yani

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

Ortamınızda bağlı olarak cron.shishal cron.phpolan ishal cron.shhangi ç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.sholup olmadığını görmek için mevcut cron.phpherhangi 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.phpilk ç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.phpya defaultya 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.phpson kez Magento'yu defaultcron işleri (hemen hemen hepsi) ve alwayscron 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.


4

cron.sh

/bin/shBu komut dosyasını işlemek için kullanın

#!/bin/sh

CRONSCRIPTAranacak 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 alwaysveya defaultaçı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. whichphp 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.phpile 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

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.shher 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::dispatchAlwaysve \Mage_Cron_Model_Observer::dispatchcron 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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.