Sự khác biệt giữa các tệp Shell và PHP Cron trong 1.9


16

Tiêu đề khá nhiều tổng hợp nó lên. Có sự khác biệt giữa tệp shell và tệp php cho cron Magento không?

Nếu có sự khác biệt thì có lý do gì để chạy cái này thay vì cái kia không?


Tốt hơn bạn nên sử dụng cron.sh, nó sẽ kiểm tra xem có quá trình cron.php nào chạy trước khi gọi nó không.
Tai Christian

Câu trả lời:


7

Cron.sh đang trỏ đến tệp cron.php, vì vậy bạn nên trỏ tác vụ cronjob của mình vào tệp .sh.

Về cơ bản bên trong tệp PHP chứa tất cả logic cho cron để lấy các công việc từ Magento và tệp sh gọi tệp PHP.


4
Các cron.shtập tin được thiết lập để kiểm tra xem có không phải là một quá trình cron chạy trong Magento trước khi bắt đầu một cái mới. Luôn luôn sử dụng nó như là kích hoạt. Theo các chương trình bảo mật nhất định với WHM / cPanel, bạn có thể không được phép chạy các tập lệnh shell dưới dạng công việc định kỳ và chỉ sau đó bạn mới trực tiếp chạy cron.phptừ crontab.
Phòng thí nghiệm Fiasco

Để thêm vào @FiascoLabs, bạn có thể đã shell_exectắt trong WHM / cPanel, nhưng điều đó không có nghĩa là nó được báo cáo là bị vô hiệu hóa khi cron.phpkiểm tra ini_get('disable_functions'). Vì vậy, cron cố gắng chạy, xem shell_execnhư không bị vô hiệu hóa, cố gắng sử dụng nó và thất bại vì nó bị vô hiệu hóa. nhún vai
pspahn

7

Bạn nên sử dụng cron.sh, tức là

* * * * * /bin/sh /var/www/html/magento/cron.sh

Tùy thuộc vào môi trường của bạn, cron.shchạy cron.phpmà chạy cron.shmà chạy cron.php. Nó được thiết kế để ngăn cron của Magento thực hiện công việc nhiều lần hoặc sinh ra quá nhiều quá trình chồng chéo.


Lần đầu tiên nó chạy, cron.shsẽ kiểm tra các quy trình đang chạy để xem cron.phpcó đang chạy hay không (không có bất kỳ đối số nào). Nếu không, nó sẽ thực thi

/usr/bin/php /var/www/html/magento/cron.php &

Trong cron.phplần chạy đầu tiên (và tùy thuộc vào việc hệ điều hành / máy chủ của bạn có hỗ trợ hay không), nó sẽ sinh sản cron.sh lần nữa , hai lần, nhưng lần này sẽ truyền các đối số:

/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 &

Quay lại cron.shlần thứ hai, nó sẽ kiểm tra lại để xem cron có chạy với các thông số đã chỉ định hay không. Nếu không, nó sẽ chuyển nó trở lại cron.phpvới một trong hai defaulthoặc always.

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

Và trong cron.phplần cuối cùng, nó sẽ kích hoạt Magento để chạy các defaultcông việc định kỳ (khá nhiều trong số chúng), cũng như các alwayscông việc định kỳ (như enterprise_refresh_index). Bằng cách tách chúng thành hai quy trình, nó làm giảm nguy cơ công việc lâu dài không thể chặn người khác.


4

cron.sh

Sử dụng /bin/shđể xử lý tập lệnh này

#!/bin/sh

Đặt một hằng số CRONSCRIPTvới tệp để gọi. $ 1 là đối số đầu tiên, nhưcron.sh /whatever/path/cron.php

# location of the php binary
if [ ! "$1" = "" ] ; then
    CRONSCRIPT=$1
else
    CRONSCRIPT=cron.php
fi

đặt một hằng số khác, ở đây bạn có thể vượt qua alwayshoặc defaultrõ ràng.

MODE=""
if [ ! "$2" = "" ] ; then
    MODE=" $2"
fi

cron không có bất kỳ biến môi trường nào, do đó bạn không thể gọi php. whichcho bạn biết, nơi nhị phân php đang sống, rất có thể trong/bin/php

PHP_BIN=`which php`

$0là tập tin chính nó, giống như __FILE__trong php

# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`

Không chắc chắn chính xác làm thế nào điều này hoạt động, nhưng những gì nó làm: gọi cron.phpvới 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

Như đã nói, cron không có thư mục làm việc hoặc bất kỳ biến môi trường nào khác, do đó, thư mục làm việc được đặt.

// 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;
}

Nếu bạn gọi cron.php bằng curl hoặc một cái gì đó, tên tệp đã được sửa?

// 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);

Đặt umask, định nghĩa với quyền nào là tệp mới được tạo - quyền không, không ai được phép làm bất cứ điều gì.

umask(0);

Hãy chắc chắn rằng, tất cả các chức năng được cho phép là cần thiết.

$disabledFuncs = explode(',', ini_get('disable_functions'));
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

bộ $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) {

nếu cronmode không được đặt, chúng tôi gọi cron.shbằng cả hai chế độ

            $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;
        }
    }

Và rồi magento cuối cùng cũng thực hiện được công việc của mình:

  • tải trình quan sát sự kiện và thêm chúng vào nhóm người quan sát

    Mage::getConfig()->init()->loadEventObservers('crontab');
    Mage::app()->addEventArea('crontab');
    

nếu shell_execbị vô hiệu hóa, gửi các sự kiện, \Aoe_Scheduler_Model_Observer::dispatchAlways\Mage_Cron_Model_Observer::dispatchđang chạy các tác vụ cron.

    if ($isShellDisabled) {
        Mage::dispatchEvent('always');
        Mage::dispatchEvent('default');
    } else {
        Mage::dispatchEvent($cronMode);
    }
} catch (Exception $e) {
    Mage::printException($e);
    exit(1);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.