शीर्षक बहुत अधिक यह रकम है। क्या Magento Cron के लिए शेल फ़ाइल और php फ़ाइल के बीच अंतर है?
यदि अंतर है तो क्या एक के बजाय एक को चलाने का कारण है?
शीर्षक बहुत अधिक यह रकम है। क्या Magento Cron के लिए शेल फ़ाइल और php फ़ाइल के बीच अंतर है?
यदि अंतर है तो क्या एक के बजाय एक को चलाने का कारण है?
जवाबों:
Cron.sh cron.php फ़ाइल की ओर इशारा कर रहा है, इसलिए आपको अपने cronjob कार्य को .sh फ़ाइल की ओर इंगित करना चाहिए।
मूल रूप से PHP फ़ाइल के अंदर क्रोन के लिए Magento से नौकरी पुनः प्राप्त करने के लिए सभी तर्क रहते हैं और sh फ़ाइल PHP फ़ाइल को आमंत्रित करती है।
cron.shफ़ाइल में वहां एक क्रॉन प्रक्रिया Magento में चल रहे एक नया एक शुरू करने से पहले नहीं है कि जांच करने के लिए सेट किया गया है। हमेशा इसे ट्रिगर के रूप में उपयोग करें। WHM / cPanel के साथ कुछ सुरक्षा योजनाओं के तहत, आपको शेल स्क्रिप्ट को क्रोन जॉब्स के रूप में चलाने की अनुमति नहीं दी जा सकती है और उसके बाद ही आप सीधे cron.phpक्रेस्टब से भाग सकते हैं ।
shell_execWHM / 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);
}