如何在Magento模块中设置定时任务?

17

我想在我的模块中设置一个定时任务。我按照Magento维基上的说明 - how_to_setup_a_cron_job,但我的定时任务根本没有执行。

这是我的config.xml文件(app/code/local/Roomstory/Invoice/etc/config.xml):

<?xml version="1.0"?>
<config>    
    <modules>
        <Roomstory_Invoice>
            <version>0.1.1</version>
        </Roomstory_Invoice>
    </modules>
<!-- -->
    <crontab>
        <jobs>
            <roomstoryinvoice_setstatus>
                <schedule><cron_expr>*/10 * * * *</cron_expr></schedule>
                <run><model>roomstory_invoice/setstatus::run</model></run>
            </roomstoryinvoice_setstatus>
        </jobs>
    </crontab>
</config>

这是我的类。(app/code/local/Roomstory/Invoice/Model/Setstatus.php)

<?php
class Roomstory_Invoice_Model_Setstatus {

  public function run() {
    return true;
  }

}
?>

我安装了一个Cron Scheduler模块,显示我的cron作业已列出,但是当我尝试“立即运行”(以进行调试)时,我会收到错误消息-

无效的回调:roomstory_invoice/setstatus::run不存在

这很简单,但经过尝试后,我仍然找不到错误。请告诉我其他做法或指出代码中的错误。

谢谢!

5个回答

34

在您的模块中的config.xml文件中添加以下内容:

<config>
    <global>
        <models>
            <roomstoryinvoicecron>
                <class>Roomstory_Invoice_Model</class>
            </roomstoryinvoicecron>                         
        </models>
    </global>
    <crontab>
        <jobs>
            <roomstoryinvoicecron>
                <schedule>
                    <cron_expr>*/10 * * * *</cron_expr>
                </schedule>
                <run>
                    <model>roomstoryinvoicecron/observer::setStatus</model>
                </run>
            </roomstoryinvoicecron>
        </jobs>
    </crontab>
</config>

app/code/local/Roomstory/Invoice/Model/Observer.php中添加以下内容:

<?php
class Roomstory_Invoice_Model_Observer {
    public function setStatus() {
        Mage::log("WORKS!");
    }
}

确保启用了日志记录,它应该可以工作,检查日志以确保 ;)


我仍然收到相同的错误信息 - Invalid callback: roomstoryinvoicecron/observer::setStatus does not exist - Vinayak Garg
嗨,我尝试使用相同的代码,但它对我不起作用。除了配置和观察者之外,您能告诉我还需要设置什么吗? - jdhaar
请检查模块是否出现在“系统 -> 配置 -> 高级”中。(如果没有,请确保将模块添加到<magento-root>/app/etc/modules/中。) - Kenny
Cron没有自动调用。当我执行localhost/magento/cron.php时,它才会被调用。我已经像你一样安排了cron。你能告诉我我错过了什么吗? - UnderGround

8
请务必将Magento的cron.sh文件添加到crontab中。
crontab -e

*/5 * * * * /bin/sh /path-to-magento/cron.sh

2
 <crontab>
        <jobs>
            <CompanyName_ModuleName>
                <schedule>
                    <cron_expr>*/5 * * * *</cron_expr>
                </schedule>
                <run>
                    <model>ModuleName/observer::setStatus</model>
                </run>
            </CompanyName_ModuleName>
        </jobs>
    </crontab>

在 Model 中创建 Observer.php 文件,其中包含以下内容:

    class CompanyName_ModuleName_Model_Observer extends Mage_Core_Model_Abstract
{

   public function setStatus()
   { 

   }
}

1
你可以轻松地创建一个用于cron作业的模块,只需按照以下步骤操作:
创建Config.xml文件并在其中设置cron作业。
<?xml version="1.0"?>
<config>    
<crontab>
        <jobs>
            <Namespace_Module>
                <schedule>
                    <cron_expr>* * * * *</cron_expr>
                </schedule>
                <run>
                    <model>module/observer::method</model>
                </run>
            </Namespace_Module>
        </jobs>
    </crontab>
</config>

你的观察者方法:
  class CompanyName_ModuleName_Model_Observer extends Mage_Core_Model_Abstract
{

   public function setStatus()
   { 
//your action
   }
}

现在,最后一步是进入您的托管cpanel,在cron作业部分设置cron.php文件的路径和运行时间。默认情况下,您可以在Magento中设置路径,例如php -f /home/mercodec/public_html/cron.php

0

在此之前,您需要在终端中运行此脚本。 对于Ubuntu:*/1 * * * * /usr/bin/php /var/www/html/modulename/cron.php > /dev/null


感谢您的回答。 - Jeeva Chezhiyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接