通过Cronjob在Silverstripe中执行一个功能

时间:2013-09-24 09:45:05

标签: php cron silverstripe

您好我想通过cronjob执行一个函数来启动csv导入。目前,通过访问浏览器tld.de/Update

中的控制器来触发导入

控制器具有此代码http://pastie.org/8351266

如何通过Cronjob执行函数init()

THX!

5 个答案:

答案 0 :(得分:5)

在SilverStripe中,您还可以通过在命令行中运行cli-script.php来访问可通过HTTP访问的任何路由

还有sake只是围绕cli-script.php的bash包装器(但是需要安装它)

因此,从项目目录中,您可以运行两个将执行相同操作的命令(在本例中,运行dev / build):

php framework/cli-script.php dev/build
sake dev/build

请参阅silverstripe命令行ussage的文档:http://doc.silverstripe.org/framework/en/topics/commandline


问题的第二部分(如何从控制器调用方法)实际上更多的是在silverstripe中进行路由的问题,而与调用它的方式无关(cronjob)

我假设您的控制器是Page_Controller或其子类(因此绑定到SiteTree模型),然后为您完成路由(它采用您在CMS中设置的URL)。 所以让我们看一些示例代码,并假设您有一个包含URLSegment about的页面:

class Page_Controller extends ContentController {
    private static $allowed_actions = array('something');
    public function init() {
        // the init method will run before every action
        // this means this code will run, no matter if you visit /about or /about/something
    }
    public function index() {
        // this is the default action (this code is optional and can be removed), 
        // and will be called if you visit website.com/about
        return $this;
    }
    public function something() {
        // this is the somethingaction, 
        // and will be called if you visit website.com/about/something
        // do something here
        return $this;
    }
}

然后您可以调用run来获取index()

的结果
php framework/cli-script.php about

这是为了获得something()的结果:

php framework/cli-script.php about/something

注意:init方法本身不能通过URL访问,它是在操作之前运行的“设置”
注意:将index()添加到$allowed_actions之后,必须允许其他所有操作(同时请注意,您需要在添加到$allowed_actions后刷新= 1重新加载配置缓存)

编辑:在看到您的代码示例后,这实际上是对您的第一个问题的回复,此次添加:

对于独立控制器,它的工作方式相同,只需要定义路由,并确保路由中有$Action,以便可以调用something()

答案 1 :(得分:5)

你可以在没有Silverstripe的情况下做到这一点。安装curl并通过cronjob调用URL,即:

0 0 * * * curl --silent http://tld.de/Update

执行此操作的正确方法是编写Silverstripe任务,并从任务中调用控制器。我没有测试过这段代码,但它会是这样的:

class YourTask extends BuildTask {
    public $description = "...";
    //...
    public function run($request) {
        YourController::init();
    }
}

您可以使用以下方式调用它:

0 0 * * * /path/to/framework/sake dev/tasks/YourTask

答案 2 :(得分:2)

为什么不创建构建任务?这是专为此类要求而设计的(至少我考虑构建任务的方式)

<?php
    class ArticleCsvUpdateTask extends BuildTask {

    protected $title = 'Article Csv Update';

    protected $description = 'Build task for article Csv update';

    public function run($request) {
        $loader = new ArticleCsvBulkLoader('Color');
        if($loader->load('import-new.csv')) {
            $loader->load('import-new.csv');
        } 
    }
}

可以使用“ yoursite / dev / tasks / ArticleCsvUpdateTask ”从浏览器评估,也可以使用“ php framework / cli-script.php dev / tasks / ArticleCsvUpdateTask <从命令行评估< / strong>“或使用”清酒dev / tasks / ArticleCsvUpdateTask “(如果你已经安装了)。

可能是我没有得到您的确切要求,但我相信这是使用银色条纹运行cron作业的更清洁和更好的方法。

答案 3 :(得分:1)

有关完整的解决方案,请参阅Zauberfisch's answer

我不熟悉Silverstripe,但如果我理解正确,可以使用HTTP请求调用此控制器init函数。

正如silverstripe文档所说,你可以从命令行调用任何url:

php framework/cli-script.php Update/init

有更多信息here,请考虑使用sake执行此任务。

答案 4 :(得分:0)

我认为正确的方法是创建一个php文件控制台,如:

#!/usr/bin/env php
<?php

require_once "/path/to/your/class/Update.php";
$class = new Update();
$class->init();

将正确的权限添加到此文件

chmod 755 consolefile

最后用cronjob

运行这个脚本