ผลรวมของชื่อค่อนข้างมาก มีความแตกต่างระหว่างไฟล์เชลล์และไฟล์ php สำหรับ Magento cron หรือไม่?
หากมีความแตกต่างคือมีเหตุผลที่จะทำงานอย่างใดอย่างหนึ่งแทนคนอื่น ๆ ?
ผลรวมของชื่อค่อนข้างมาก มีความแตกต่างระหว่างไฟล์เชลล์และไฟล์ php สำหรับ Magento cron หรือไม่?
หากมีความแตกต่างคือมีเหตุผลที่จะทำงานอย่างใดอย่างหนึ่งแทนคนอื่น ๆ ?
คำตอบ:
cron.sh ชี้ไปที่ไฟล์ cron.php ดังนั้นคุณควรชี้งาน cronjob ของคุณไปที่ไฟล์. sh
โดยทั่วไปภายในไฟล์ PHP นั้นจะอยู่ที่ตรรกะทั้งหมดสำหรับ cron เพื่อดึงงานจาก Magento และไฟล์ sh จะเรียกใช้ไฟล์ PHP
cron.sh
ไฟล์ถูกตั้งขึ้นมาเพื่อตรวจสอบว่ามีไม่ได้เป็นกระบวนการ cron ทำงานในวีโอไอพีก่อนที่จะเริ่มหนึ่งใหม่ ใช้เป็นตัวกระตุ้นเสมอ ภายใต้แผนการรักษาความปลอดภัยบางอย่างกับ WHM / cPanel คุณอาจไม่ได้รับอนุญาตให้เรียกใช้เชลล์สคริปต์เป็นงาน cron และจากนั้นคุณเรียกใช้cron.php
จาก crontab โดยตรง
shell_exec
ปิดใช้งานใน WHM / cPanel แต่นั่นไม่ได้หมายความว่าจะรายงานเป็นคนพิการเมื่อการตรวจสอบcron.php
ini_get('disable_functions')
ดังนั้น cron จึงพยายามเรียกใช้, เห็นshell_exec
ว่าไม่ถูกปิดใช้งาน, พยายามใช้และล้มเหลวเนื่องจากถูกปิดใช้งาน ยัก
คุณควรจะใช้cron.sh
เช่น
* * * * * /bin/sh /var/www/html/magento/cron.sh
ขึ้นอยู่กับสภาพแวดล้อมของคุณcron.sh
ทำงานcron.php
ที่ทำงานcron.sh
ซึ่งทำงานcron.php
ที่วิ่งมันถูกออกแบบมาเพื่อป้องกัน cron ของวีโอไอพีไม่ให้ทำงานหลายครั้งหรือวางไข่กระบวนการมากเกินไปที่ทับซ้อนกัน
ครั้งแรกที่เรียกใช้cron.sh
จะตรวจสอบกระบวนการที่กำลังทำงานอยู่เพื่อดูว่าcron.php
กำลังทำงานอยู่หรือไม่ (โดยไม่มีข้อโต้แย้ง) ถ้าไม่มันจะทำงาน
/usr/bin/php /var/www/html/magento/cron.php &
ในการcron.php
รันครั้งแรก (และขึ้นอยู่กับว่า OS / โฮสต์ของคุณรองรับ) มันจะวางไข่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 กำลังทำงานกับ params ที่ระบุหรือไม่ ถ้าไม่ได้ก็จะผ่านมันกลับไป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
ครั้งสุดท้ายมันจะเรียก Magento ให้ทำงานdefault
cron (เกือบทั้งหมดนั้น) และalways
cron jobs (เช่น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
cron ไม่ได้มีตัวแปรสภาพแวดล้อมใด ๆ 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
ดังที่ได้กล่าวแล้ว cron ไม่มี dir ที่ทำงานหรือตัวแปรสภาพแวดล้อมอื่น ๆ ดังนั้น dir ที่ทำงานจึงถูกตั้งค่า
// 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) {
หากไม่ได้ตั้ง cronmode เราจะโทรหา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
กำลังรันภารกิจ cron
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}