शीर्षक बहुत अधिक यह रकम है। क्या Magento Cron के लिए शेल फ़ाइल और php फ़ाइल के बीच अंतर है?
यदि अंतर है तो क्या एक के बजाय एक को चलाने का कारण है?
शीर्षक बहुत अधिक यह रकम है। क्या Magento Cron के लिए शेल फ़ाइल और php फ़ाइल के बीच अंतर है?
यदि अंतर है तो क्या एक के बजाय एक को चलाने का कारण है?
जवाबों:
Cron.sh cron.php फ़ाइल की ओर इशारा कर रहा है, इसलिए आपको अपने cronjob कार्य को .sh फ़ाइल की ओर इंगित करना चाहिए।
मूल रूप से PHP फ़ाइल के अंदर क्रोन के लिए Magento से नौकरी पुनः प्राप्त करने के लिए सभी तर्क रहते हैं और sh फ़ाइल PHP फ़ाइल को आमंत्रित करती है।
cron.sh
फ़ाइल में वहां एक क्रॉन प्रक्रिया Magento में चल रहे एक नया एक शुरू करने से पहले नहीं है कि जांच करने के लिए सेट किया गया है। हमेशा इसे ट्रिगर के रूप में उपयोग करें। WHM / cPanel के साथ कुछ सुरक्षा योजनाओं के तहत, आपको शेल स्क्रिप्ट को क्रोन जॉब्स के रूप में चलाने की अनुमति नहीं दी जा सकती है और उसके बाद ही आप सीधे cron.php
क्रेस्टब से भाग सकते हैं ।
shell_exec
WHM / cPanel में अक्षम हो सकते हैं , लेकिन इसका मतलब यह नहीं है कि इसे cron.php
चेक के रूप में अक्षम किया गया है ini_get('disable_functions')
। क्रॉन की कोशिश करता चलाने के लिए तो, देखता है shell_exec
के रूप में नहीं विकलांग, इसका इस्तेमाल करने की कोशिश करता है और विफल रहता है, क्योंकि यह अक्षम है। कंधे उचकाने की क्रिया
आपको उपयोग करना चाहिए cron.sh
, अर्थात
* * * * * /bin/sh /var/www/html/magento/cron.sh
अपने परिवेश के आधार पर cron.sh
रन cron.php
है जो रन cron.sh
है जो रन बनाने cron.php
। यह Magento के क्रोन को कई बार नौकरियों को निष्पादित करने से रोकने के लिए डिज़ाइन किया गया है, या ओवरलैप करने वाली कई प्रक्रियाओं को भी पैदा कर रहा है।
यह पहली बार चलने पर, cron.sh
चालू चल रही प्रक्रियाओं को यह देखने के लिए जाँच करेगा कि cron.php
क्या पहले से चल रहा है (बिना किसी तर्क के)। यदि नहीं, तो यह निष्पादित करेगा
/usr/bin/php /var/www/html/magento/cron.php &
पर cron.php
पहला रन (और यदि आपके ओएस / मेजबान यह समर्थन करता है निर्भर करता है) यह अंडे जाएगा cron.sh
फिर से , दो बार, लेकिन इस बार तर्क गुजर:
/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
दूसरी बार वापस , यह देखने के लिए फिर से जाँच करेगा कि क्या क्रोन निर्दिष्ट परिमों के साथ चल रहा है। यदि नहीं, तो यह या cron.php
तो के साथ वापस पारित करेगा default
या always
।
/usr/bin/php /var/www/html/magento/cron.php -mdefault &
/usr/bin/php /var/www/html/magento/cron.php -malways &
और cron.php
अंतिम समय के लिए, यह default
क्रोन जॉब्स (उनमें से बहुत अधिक), साथ ही always
क्रोन जॉब्स (जैसे enterprise_refresh_index
) को चलाने के लिए मैगेंटो को ट्रिगर करेगा । उन्हें दो प्रक्रियाओं में अलग करके यह दूसरों को अवरुद्ध करने से लंबी चलने वाली नौकरी के जोखिम को कम करता है।
/bin/sh
इस स्क्रिप्ट को संसाधित करने के लिए उपयोग करें
#!/bin/sh
CRONSCRIPT
कॉल करने के लिए फ़ाइल के साथ एक स्थिरांक सेट करें। $ 1 पहला तर्क है, जैसेcron.sh /whatever/path/cron.php
# location of the php binary
if [ ! "$1" = "" ] ; then
CRONSCRIPT=$1
else
CRONSCRIPT=cron.php
fi
एक और स्थिरांक निर्धारित करें, यहाँ आप पास always
या default
स्पष्ट रूप से कर सकते हैं ।
MODE=""
if [ ! "$2" = "" ] ; then
MODE=" $2"
fi
क्रोन का कोई भी पर्यावरण चर नहीं है, इसलिए आप सिर्फ कॉल नहीं कर सकते php
। which
आपको बताता है, जहां php बाइनरी जीवित है, सबसे अधिक संभावना है/bin/php
PHP_BIN=`which php`
$0
फ़ाइल ही है, जैसे __FILE__
php में
# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`
निश्चित रूप से नहीं कि यह कैसे काम करता है, लेकिन यह क्या करता है: cron.php
साथ बुलाओ 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
जैसा कि पहले ही कहा गया है, क्रोन में वर्किंग डीआईआर या कोई अन्य पर्यावरण वैरिएबल नहीं है, इसलिए वर्किंग डीआईआर सेट है।
// 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 को कर्ल या कुछ और कहते हैं, तो फ़ाइल नाम निश्चित हैं?
// 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);
Umask सेट करें, जो यह निर्धारित करता है कि नई अनुमतियाँ क्या बनाई गई हैं - शून्य अनुमतियाँ, किसी को कुछ भी करने की अनुमति नहीं है।
umask(0);
सुनिश्चित करें, सभी कार्यों की अनुमति है जो आवश्यक हैं।
$disabledFuncs = explode(',', ini_get('disable_functions'));
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;
सेट $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) {
यदि क्रोनमोड सेट नहीं है, तो हम cron.sh
दोनों मोड के साथ कॉल करते हैं
$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;
}
}
और फिर मैजेंटो आखिरकार अपना काम कर रहा है:
ईवेंट पर्यवेक्षकों को लोड करें और उन्हें पर्यवेक्षक पूल में जोड़ें
Mage::getConfig()->init()->loadEventObservers('crontab');
Mage::app()->addEventArea('crontab');
यदि shell_exec
अक्षम किया गया है, तो घटनाओं को भेजें , \Aoe_Scheduler_Model_Observer::dispatchAlways
और \Mage_Cron_Model_Observer::dispatch
क्रोन कार्यों को चला रहे हैं।
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}