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.sh
file 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.php
dari crontab.
shell_exec
menonaktifkan di WHM / cPanel, tetapi itu tidak berarti dilaporkan sebagai dinonaktifkan saat cron.php
memeriksa ini_get('disable_functions')
. Jadi cron mencoba untuk menjalankan, dilihat shell_exec
sebagai 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.sh
menjalankan cron.php
yang menjalankan cron.sh
yang 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.sh
akan memeriksa proses yang sedang berjalan untuk melihat apakah cron.php
sudah berjalan (tanpa argumen). Jika tidak, itu akan dieksekusi
/usr/bin/php /var/www/html/magento/cron.php &
Saat cron.php
pertama 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.sh
untuk kedua kalinya, itu akan memeriksa lagi untuk melihat apakah cron berjalan dengan params yang ditentukan. Jika tidak, itu akan mengembalikannya ke cron.php
salah satu default
atau always
.
/usr/bin/php /var/www/html/magento/cron.php -mdefault &
/usr/bin/php /var/www/html/magento/cron.php -malways &
Dan cron.php
untuk yang terakhir kalinya, itu akan memicu Magento untuk menjalankan default
pekerjaan cron (hampir semuanya), serta always
pekerjaan 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/sh
untuk memproses skrip ini
#!/bin/sh
Tetapkan sebuah konstanta CRONSCRIPT
dengan 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 always
atau default
secara eksplisit.
MODE=""
if [ ! "$2" = "" ] ; then
MODE=" $2"
fi
cron tidak memiliki variabel lingkungan, oleh karena itu Anda tidak dapat menelepon begitu saja php
. which
memberitahu Anda, di mana php binary tinggal, kemungkinan besar di/bin/php
PHP_BIN=`which php`
$0
adalah 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.php
dengan 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.sh
dengan 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_exec
dinonaktifkan, kirim acara, jadi \Aoe_Scheduler_Model_Observer::dispatchAlways
dan \Mage_Cron_Model_Observer::dispatch
sedang menjalankan tugas cron.
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}