【问题标题】:How to setup a cron job in Magento module?如何在 Magento 模块中设置 cron 作业?
【发布时间】:2012-06-26 07:20:43
【问题描述】:

我想在我的模块中设置一个 cron 作业。我按照 Magento wiki - how_to_setup_a_cron_job 上的说明进行操作,但我的 cron 作业根本没有执行。

这是我的 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 调度程序模块,它显示了我的 cron 作业,但是当我尝试“立即运行”(用于调试)时,我收到错误 -

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

这很简单,经过多次尝试,我仍然无法找到错误。请告知其他方法,或在此代码中指出错误。

谢谢!

【问题讨论】:

    标签: php xml magento


    【解决方案1】:

    一定要在 crontab 中添加 Magento cron.sh 文件

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

    【讨论】:

      【解决方案2】:

      在您的模块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
      • 嗨,我尝试过使用相同的代码,但它不适合我。你能告诉我除了配置和观察者之外还需要设置什么吗?
      • 查看模块是否出现在系统->配置->高级。 (如果没有,请确保将模块添加到 /app/etc/modules/
      • Cron 没有自动调用。当我执行 localhost/magento/cron.php 时,它会调用。我和你一样安排了cron。你能告诉我我错过了什么吗??
      【解决方案3】:
       <crontab>
              <jobs>
                  <CompanyName_ModuleName>
                      <schedule>
                          <cron_expr>*/5 * * * *</cron_expr>
                      </schedule>
                      <run>
                          <model>ModuleName/observer::setStatus</model>
                      </run>
                  </CompanyName_ModuleName>
              </jobs>
          </crontab>
      

      并在模型中创建 Observer.php 文件

          class CompanyName_ModuleName_Model_Observer extends Mage_Core_Model_Abstract
      {
      
         public function setStatus()
         { 
      
         }
      }
      

      【讨论】:

        【解决方案4】:

        您可以轻松地为 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 的路径。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 感谢您的回答