Perbedaan antara file Shell dan PHP Cron di 1.9

16

Judulnya cukup meringkasnya. Apakah ada perbedaan antara file shell dan file php untuk cron Magento?

Jika ada perbedaan, adakah alasan untuk menjalankan salah satunya?

Chris Morris
sumber
Anda lebih baik menggunakan cron.sh, itu akan memeriksa apakah ada proses cron.php yang berjalan sebelum memanggilnya.
Tai Christian

Jawaban:

7

Cron.sh menunjuk ke file cron.php, jadi Anda harus mengarahkan tugas cronjob Anda ke file .sh.

Pada dasarnya di dalam file PHP tersimpan semua logika untuk cron untuk mengambil pekerjaan dari Magento dan file sh memanggil file PHP.

mbalparda
sumber
4
The cron.shfile dibentuk untuk memeriksa bahwa tidak ada proses cron berjalan di Magento sebelum memulai yang baru. Selalu gunakan itu sebagai pemicunya. Di bawah skema keamanan tertentu dengan WHM / cPanel, Anda mungkin tidak diizinkan menjalankan skrip shell sebagai tugas cron dan hanya dengan demikian Anda langsung menjalankannya cron.phpdari crontab.
Fiasco Labs
Untuk menambahkan @FiascoLabs, Anda mungkin telah shell_execmenonaktifkan di WHM / cPanel, tetapi itu tidak berarti dilaporkan sebagai dinonaktifkan saat cron.phpmemeriksa ini_get('disable_functions'). Jadi cron mencoba untuk menjalankan, dilihat shell_execsebagai tidak dinonaktifkan, mencoba untuk menggunakannya dan gagal karena dinonaktifkan. mengangkat bahu
pspahn
7

Anda harus menggunakan cron.sh, yaitu

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

Bergantung pada lingkungan Anda, cron.shmenjalankan cron.phpyang menjalankan cron.shyang berjalan cron.php. Ini dirancang untuk mencegah cron Magento dari mengeksekusi pekerjaan beberapa kali, atau menelurkan terlalu banyak proses yang tumpang tindih.


Pertama kali dijalankan, cron.shakan memeriksa proses yang sedang berjalan untuk melihat apakah cron.phpsudah berjalan (tanpa argumen). Jika tidak, itu akan dieksekusi

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

Saat cron.phppertama kali dijalankan (dan tergantung apakah OS / host Anda mendukungnya), ia akan memunculkan cron.sh lagi , dua kali, tetapi kali ini meneruskan argumen:

/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 &

Kembali cron.shuntuk kedua kalinya, itu akan memeriksa lagi untuk melihat apakah cron berjalan dengan params yang ditentukan. Jika tidak, itu akan mengembalikannya ke cron.phpsalah satu defaultatau always.

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

Dan cron.phpuntuk yang terakhir kalinya, itu akan memicu Magento untuk menjalankan defaultpekerjaan cron (hampir semuanya), serta alwayspekerjaan cron (seperti enterprise_refresh_index). Dengan memisahkan mereka menjadi dua proses, hal ini mengurangi risiko pekerjaan yang berjalan lama dari memblokir orang lain.

Steve Robbins
sumber
4

cron.sh

Gunakan /bin/shuntuk memproses skrip ini

#!/bin/sh

Tetapkan sebuah konstanta CRONSCRIPTdengan file yang akan dipanggil. $ 1 adalah argumen pertamacron.sh /whatever/path/cron.php

# location of the php binary
if [ ! "$1" = "" ] ; then
    CRONSCRIPT=$1
else
    CRONSCRIPT=cron.php
fi

atur konstanta lain, di sini Anda dapat lulus alwaysatau defaultsecara eksplisit.

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

cron tidak memiliki variabel lingkungan, oleh karena itu Anda tidak dapat menelepon begitu saja php. whichmemberitahu Anda, di mana php binary tinggal, kemungkinan besar di/bin/php

PHP_BIN=`which php`

$0adalah file itu sendiri, seperti __FILE__di php

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

Tidak yakin persis bagaimana ini bekerja, tetapi apa fungsinya: panggilan cron.phpdengan 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

Seperti yang sudah dikatakan, cron tidak memiliki direktori kerja atau variabel lingkungan lainnya, oleh karena itu direktori kerja ditetapkan.

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

Jika Anda memanggil cron.php dengan ikal atau sesuatu, nama filenya sudah diperbaiki?

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

Tetapkan umask, yang mendefinisikan dengan izin apa file baru dibuat - nol izin, tidak ada yang diizinkan untuk melakukan apa pun.

umask(0);

Pastikan, semua fungsi diizinkan yang dibutuhkan.

$disabledFuncs = explode(',', ini_get('disable_functions'));
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

set $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) {

jika cronmode tidak disetel, kami memanggil cron.shdengan kedua mode

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

Dan kemudian magento akhirnya melakukan tugasnya:

  • memuat pengamat acara dan menambahkannya ke kolam pengamat

    Mage::getConfig()->init()->loadEventObservers('crontab');
    Mage::app()->addEventArea('crontab');

jika shell_execdinonaktifkan, kirim acara, jadi \Aoe_Scheduler_Model_Observer::dispatchAlwaysdan \Mage_Cron_Model_Observer::dispatchsedang menjalankan tugas cron.

    if ($isShellDisabled) {
        Mage::dispatchEvent('always');
        Mage::dispatchEvent('default');
    } else {
        Mage::dispatchEvent($cronMode);
    }
} catch (Exception $e) {
    Mage::printException($e);
    exit(1);
}
Fabian Blechschmidt
sumber