শিরোনাম অনেক সুন্দর এটি অঙ্ক আপ। ম্যাজেন্টো ক্রনের জন্য শেল ফাইল এবং পিএইচপি ফাইলের মধ্যে পার্থক্য রয়েছে কি?
পার্থক্য থাকলে অন্যটির পরিবর্তে একটি চালানোর কারণ আছে?
শিরোনাম অনেক সুন্দর এটি অঙ্ক আপ। ম্যাজেন্টো ক্রনের জন্য শেল ফাইল এবং পিএইচপি ফাইলের মধ্যে পার্থক্য রয়েছে কি?
পার্থক্য থাকলে অন্যটির পরিবর্তে একটি চালানোর কারণ আছে?
উত্তর:
Cron.sh ক্রোন.এফপি ফাইলের দিকে নির্দেশ করছে, সুতরাং আপনার ক্রোনজব টাস্কটি .sh ফাইলের দিকে নির্দেশ করা উচিত।
মূলত পিএইচপি ফাইলের ভিতরে ম্যাগন্টো থেকে চাকরি পুনরুদ্ধার করতে ক্রোনের সমস্ত যুক্তি রয়েছে এবং sh ফাইলটি পিএইচপি ফাইলটি আহ্বান করে।
cron.sh
ফাইল সেখানে ক্রন প্রক্রিয়া Magento চলমান একটি নতুন এক শুরু করার আগে নয় যে পরীক্ষা করার জন্য সেট আপ করা হয়। এটি সর্বদা ট্রিগার হিসাবে ব্যবহার করুন। ডাব্লুএইচএম / সিপ্যানেলের সাথে নির্দিষ্ট সুরক্ষা স্কিমের অধীনে আপনাকে শেল স্ক্রিপ্টগুলি ক্রোন জব হিসাবে চালানোর অনুমতি দেওয়া হতে পারে এবং কেবল তখনই আপনি সরাসরি cron.php
ক্রন্টব্যাট থেকে চালিত হন।
shell_exec
/ সিপ্যানেলে অক্ষম করে থাকতে পারেন , তবে এর অর্থ এই নয় যে এটি 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
। এটি ম্যাজেন্টোর ক্রোনকে একাধিকবার কাজ সম্পাদন করা থেকে বিরত রাখতে বা অনেকগুলি প্রক্রিয়া ওভারল্যাপ করা থেকে রক্ষা করার জন্য ডিজাইন করা হয়েছে।
প্রথমবার এটি চালানো হলে, 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
কল করার জন্য ফাইলের সাথে একটি ধ্রুবক সেট করুন। Argument 1 হ'ল প্রথম যুক্তি likecron.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
আপনাকে বলে যে পিএইচপি বাইনারি কোথায় বাস করছে, সম্ভবত এটি/bin/php
PHP_BIN=`which php`
$0
ফাইলটি __FILE__
পিএইচপি-র মতোই
# 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;
}
আপনি যদি কার্ল বা কিছু দ্বারা ক্রোন.এফপি কল করেন তবে ফাইলের নামগুলি স্থির?
// 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(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);
}