Judulnya cukup meringkasnya. Apakah ada perbedaan antara file shell dan file php untuk cron Magento?
Jika ada perbedaan, adakah alasan untuk menjalankan salah satunya?
Judulnya cukup meringkasnya. Apakah ada perbedaan antara file shell dan file php untuk cron Magento?
Jika ada perbedaan, adakah alasan untuk menjalankan salah satunya?
Jawaban:
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.
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.
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
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.
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
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);
}