【问题标题】:Setting up CRON job in Magento在 Magento 中设置 CRON 作业
【发布时间】:2014-02-10 23:26:46
【问题描述】:

那里有很多设置 cron 的教程,我认为我做得正确,但由于某种原因它不起作用。我还创建了一个控制器类来测试模型并且它工作正常。

这是我的 config.xml:

<config>
    <modules>
        <VPS_Export>
            <version>0.1.0</version>
        </VPS_Export>
    </modules>
    <global>
        <models>
            <vps_export>
                <class>VPS_Export_Model</class>
            </vps_export>
        </models>
        <helpers>
            <vps_export>
                <class>VPS_Export_Helper</class>
            </vps_export>
        </helpers>
    </global>
<frontend>
    <routers>
        <vps_export>
            <use>standard</use>
            <args>
                <module>VPS_Export</module>
                <frontName>vpsexport</frontName>
            </args>
        </vps_export>
    </routers>  
</frontend>
    <crontab>
        <jobs>
            <vps_export>
                <schedule>
                    <cron_expr>*/5 * * * *</cron_expr><!-- every 5 minutes -->
                </schedule>
                <run>
                    <model>vps_export/observer::exportProducts</model>
                </run>
            </vps_export>
        </jobs>
    </crontab>
</config>

我的 Observer.php 文件是:

<?php
class VPS_Export_Model_Observer
{
    public function exportProducts()
    {
        echo "VPS Export Products called!";
        Mage::Log("exportProducts called!");
    }
}
?>

而我的测试 IndexController.php 文件是:

<?php
class VPS_Export_IndexController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        echo "index action called!";
        Mage::getModel('vps_export/observer')->exportProducts();
    }
}
?>

如果我将浏览器指向 http://my_server/vpsexport/index,我会看到 echo 语句的正确输出,并且消息会打印到日志中,所以我知道模型是正确的配置。但是,cron 没有相同的结果。如果我手动运行 cron.php,我不会收到任何错误,但它似乎仍然没有做任何事情。

有什么想法吗?

【问题讨论】:

  • 手动运行 cron 后,你的数据库中的 'cron_schedule' 表中有什么东西吗?
  • 我之前不知道 cron_schedule 表。是的,表中有项目,它们似乎正在执行,但我的日志消息仍然没有进入日志。我如何测试以确保它在执行 cron 作业时实际上调用了正确的函数?

标签: magento cron crontab


【解决方案1】:

据我了解 magento 的 cron 系统,它分两个阶段工作:

  1. 它检查模块 config.xml 以找出必须由 cron 运行的方法并将它们插入数据库 (cron_schedule)
  2. 它从此表中获取信息并运行与scheduled_at 列与实际时间相匹配的方法。

正如你所说,cron_schedule 表中有条目,第一阶段还可以
因此,为了检查您的 cron 是否正常执行,您实际上必须在服务器中设置一个 cronjob,如果您在本地工作,这将是您的计算机。
在 ubuntu 上其实很简单,我想在 windows 上会更复杂,但(再次猜测)并非不可能。
或者,也许每 5 分钟刷新几次指向您​​的 cron.php 文件的浏览器(正如您在 config.xml 中配置的那样)就可以了,但是设置一个 cronjob 会更有效:)
希望有帮助

编辑:这是我的 cronjob 的样子,如果它对你有帮助的话:

*/5 * * * * wget -q http://magento.local/cron.php

【讨论】:

  • 谢谢@david-parloir。我之前应该提到过这一点,但我已经将它添加到我的 Ubuntu 服务器上的 crontab 中。我添加了以下行:*/5 * * * * www-data /usr/bin/php /var/www/vps_local_5/cron.php。这看起来对吗?我还尝试刷新指向 cron.php 的浏览器,但它从未在日志中放入任何内容。它可能正在运行 cron 作业,但我无法确认...
  • 谢谢@david-parloir,但我还是遇到了麻烦。您的 crontab 使用调用 cron.php 的 wget 版本,但它本质上是相同的。那不是问题。正在调用 cron.php...如果不是,则条目将不会进入数据库。 cron_schedule 表包含我期望的条目,它们声称执行成功,但我的日志消息和预期结果都没有发生。我错过了什么?
【解决方案2】:

根据是本地调用还是通过网络服务器调用,运行 cron 脚本的性能和后果可能存在根本差异。

一个重要的区别是当您使用 PHP 的 APC 操作码缓存器时(这是一个非常好的主意)。根据文档,从命令行访问 PHP 将清除缓存,这可能不是您真正希望每 5 分钟发生一次的事情!

【讨论】:

  • 感谢您的回复!我最近注意到一个可能与缓存刷新有关的问题。您能否详细说明从命令行访问 PHP 时的缓存刷新?你指的是什么文档?
  • @BrianVPS,您确认 APC 确实做到了这一点吗?您找到说明的文档了吗?
  • 不,我还没有研究过 APC 或对此做更多的事情。老实说,我不记得遇到这个问题时我在做什么,但 cron 现在似乎正在为我工​​作。
【解决方案3】:

我知道这是很久以后的事了,但我应该扩大一点。我有点说错了,因为从启用 APC 的命令行运行 PHP 使用它自己的私有缓存。如果您通过 Web 服务器运行 cron 作业,那么它的现有缓存是可用的,并被添加到。

这将存储从运行到运行的相关内容。将 APC 与命令行作业一起使用可能会造成障碍,因为您可能正在做的只是加载缓存,然后将其删除。

【讨论】: