Tiêu đề khá nhiều tổng hợp nó lên. Có sự khác biệt giữa tệp shell và tệp php cho cron Magento không?
Nếu có sự khác biệt thì có lý do gì để chạy cái này thay vì cái kia không?
Tiêu đề khá nhiều tổng hợp nó lên. Có sự khác biệt giữa tệp shell và tệp php cho cron Magento không?
Nếu có sự khác biệt thì có lý do gì để chạy cái này thay vì cái kia không?
Câu trả lời:
Cron.sh đang trỏ đến tệp cron.php, vì vậy bạn nên trỏ tác vụ cronjob của mình vào tệp .sh.
Về cơ bản bên trong tệp PHP chứa tất cả logic cho cron để lấy các công việc từ Magento và tệp sh gọi tệp PHP.
cron.sh
tập tin được thiết lập để kiểm tra xem có không phải là một quá trình cron chạy trong Magento trước khi bắt đầu một cái mới. Luôn luôn sử dụng nó như là kích hoạt. Theo các chương trình bảo mật nhất định với WHM / cPanel, bạn có thể không được phép chạy các tập lệnh shell dưới dạng công việc định kỳ và chỉ sau đó bạn mới trực tiếp chạy cron.php
từ crontab.
shell_exec
tắt trong WHM / cPanel, nhưng điều đó không có nghĩa là nó được báo cáo là bị vô hiệu hóa khi cron.php
kiểm tra ini_get('disable_functions')
. Vì vậy, cron cố gắng chạy, xem shell_exec
như không bị vô hiệu hóa, cố gắng sử dụng nó và thất bại vì nó bị vô hiệu hóa. nhún vai
Bạn nên sử dụng cron.sh
, tức là
* * * * * /bin/sh /var/www/html/magento/cron.sh
Tùy thuộc vào môi trường của bạn, cron.sh
chạy cron.php
mà chạy cron.sh
mà chạy cron.php
. Nó được thiết kế để ngăn cron của Magento thực hiện công việc nhiều lần hoặc sinh ra quá nhiều quá trình chồng chéo.
Lần đầu tiên nó chạy, cron.sh
sẽ kiểm tra các quy trình đang chạy để xem cron.php
có đang chạy hay không (không có bất kỳ đối số nào). Nếu không, nó sẽ thực thi
/usr/bin/php /var/www/html/magento/cron.php &
Trong cron.php
lần chạy đầu tiên (và tùy thuộc vào việc hệ điều hành / máy chủ của bạn có hỗ trợ hay không), nó sẽ sinh sản cron.sh
lần nữa , hai lần, nhưng lần này sẽ truyền các đối số:
/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 &
Quay lại cron.sh
lần thứ hai, nó sẽ kiểm tra lại để xem cron có chạy với các thông số đã chỉ định hay không. Nếu không, nó sẽ chuyển nó trở lại cron.php
với một trong hai default
hoặc always
.
/usr/bin/php /var/www/html/magento/cron.php -mdefault &
/usr/bin/php /var/www/html/magento/cron.php -malways &
Và trong cron.php
lần cuối cùng, nó sẽ kích hoạt Magento để chạy các default
công việc định kỳ (khá nhiều trong số chúng), cũng như các always
công việc định kỳ (như enterprise_refresh_index
). Bằng cách tách chúng thành hai quy trình, nó làm giảm nguy cơ công việc lâu dài không thể chặn người khác.
Sử dụng /bin/sh
để xử lý tập lệnh này
#!/bin/sh
Đặt một hằng số CRONSCRIPT
với tệp để gọi. $ 1 là đối số đầu tiên, nhưcron.sh /whatever/path/cron.php
# location of the php binary
if [ ! "$1" = "" ] ; then
CRONSCRIPT=$1
else
CRONSCRIPT=cron.php
fi
đặt một hằng số khác, ở đây bạn có thể vượt qua always
hoặc default
rõ ràng.
MODE=""
if [ ! "$2" = "" ] ; then
MODE=" $2"
fi
cron không có bất kỳ biến môi trường nào, do đó bạn không thể gọi php
. which
cho bạn biết, nơi nhị phân php đang sống, rất có thể trong/bin/php
PHP_BIN=`which php`
$0
là tập tin chính nó, giống như __FILE__
trong php
# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`
Không chắc chắn chính xác làm thế nào điều này hoạt động, nhưng những gì nó làm: gọi cron.php
với 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
Như đã nói, cron không có thư mục làm việc hoặc bất kỳ biến môi trường nào khác, do đó, thư mục làm việc được đặt.
// 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;
}
Nếu bạn gọi cron.php bằng curl hoặc một cái gì đó, tên tệp đã được sửa?
// 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);
Đặt umask, định nghĩa với quyền nào là tệp mới được tạo - quyền không, không ai được phép làm bất cứ điều gì.
umask(0);
Hãy chắc chắn rằng, tất cả các chức năng được cho phép là cần thiết.
$disabledFuncs = explode(',', ini_get('disable_functions'));
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;
bộ $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) {
nếu cronmode không được đặt, chúng tôi gọi cron.sh
bằng cả hai chế độ
$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;
}
}
Và rồi magento cuối cùng cũng thực hiện được công việc của mình:
tải trình quan sát sự kiện và thêm chúng vào nhóm người quan sát
Mage::getConfig()->init()->loadEventObservers('crontab');
Mage::app()->addEventArea('crontab');
nếu shell_exec
bị vô hiệu hóa, gửi các sự kiện, \Aoe_Scheduler_Model_Observer::dispatchAlways
và \Mage_Cron_Model_Observer::dispatch
đang chạy các tác vụ cron.
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}