ความแตกต่างระหว่างไฟล์ Shell และ PHP Cron ใน 1.9


16

ผลรวมของชื่อค่อนข้างมาก มีความแตกต่างระหว่างไฟล์เชลล์และไฟล์ php สำหรับ Magento cron หรือไม่?

หากมีความแตกต่างคือมีเหตุผลที่จะทำงานอย่างใดอย่างหนึ่งแทนคนอื่น ๆ ?


คุณควรใช้ cron.sh มันจะตรวจสอบว่ามีกระบวนการ cron.php ใด ๆ ที่เรียกใช้ก่อนที่จะเรียกใช้หรือไม่
Tai Christian

คำตอบ:


7

cron.sh ชี้ไปที่ไฟล์ cron.php ดังนั้นคุณควรชี้งาน cronjob ของคุณไปที่ไฟล์. sh

โดยทั่วไปภายในไฟล์ PHP นั้นจะอยู่ที่ตรรกะทั้งหมดสำหรับ cron เพื่อดึงงานจาก Magento และไฟล์ sh จะเรียกใช้ไฟล์ PHP


4
cron.shไฟล์ถูกตั้งขึ้นมาเพื่อตรวจสอบว่ามีไม่ได้เป็นกระบวนการ cron ทำงานในวีโอไอพีก่อนที่จะเริ่มหนึ่งใหม่ ใช้เป็นตัวกระตุ้นเสมอ ภายใต้แผนการรักษาความปลอดภัยบางอย่างกับ WHM / cPanel คุณอาจไม่ได้รับอนุญาตให้เรียกใช้เชลล์สคริปต์เป็นงาน cron และจากนั้นคุณเรียกใช้cron.phpจาก crontab โดยตรง
Fiasco Labs

เพื่อเพิ่มความ @FiascoLabs ที่คุณอาจจะshell_execปิดใช้งานใน WHM / cPanel แต่นั่นไม่ได้หมายความว่าจะรายงานเป็นคนพิการเมื่อการตรวจสอบcron.php ini_get('disable_functions')ดังนั้น cron จึงพยายามเรียกใช้, เห็นshell_execว่าไม่ถูกปิดใช้งาน, พยายามใช้และล้มเหลวเนื่องจากถูกปิดใช้งาน ยัก
pspahn

7

คุณควรจะใช้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ด้วยหรือdefaultalways

/usr/bin/php /var/www/html/magento/cron.php -mdefault &
/usr/bin/php /var/www/html/magento/cron.php -malways &

และในcron.phpครั้งสุดท้ายมันจะเรียก Magento ให้ทำงานdefaultcron (เกือบทั้งหมดนั้น) และalwayscron jobs (เช่นenterprise_refresh_index) โดยแยกพวกเขาออกเป็นสองกระบวนการจะช่วยลดความเสี่ยงของงานที่ใช้เวลานานจากการปิดกั้นผู้อื่น


4

cron.sh

ใช้/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.php

ดังที่ได้กล่าวแล้ว 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);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.