【问题标题】:Execute a Function in Silverstripe via Cronjob通过 Cronjob 在 Silverstripe 中执行函数
【发布时间】:2013-09-29 11:06:04
【问题描述】:

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

控制器有这个代码http://pastie.org/8351266

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

谢谢!

【问题讨论】:

    标签: php cron silverstripe


    【解决方案1】:

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

    还有sake,它只是 cli-script.php 的一个 bash 包装器(但需要安装清酒)

    所以,从您的项目目录中,您可以运行将执行相同操作的两个命令(在这种情况下,运行 dev/build):

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

    有关 silverstripe 的命令行用法,请参阅文档: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 访问,它是在操作之前运行的“设置”
    注意:除 @ 之外的所有操作987654331@ 必须通过将它们添加到 $allowed_actions 来允许(另请注意,添加到 $allowed_actions 后您需要 ?flush=1 以重新加载配置缓存)

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

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

    【讨论】:

    • 嗨 zauberfisch,我尝试像您上面所说的那样通过 ssh 终端运行开发/构建,但我收到以下错误 => `X-Powered-By: PHP/4.4.9 Content-type: text/html
      解析错误:语法错误,_testpage/framework/core/Core.php 中的意外 T_OBJECT_OPERATOR 在第 113 行' 如果我使用 /usr/local/bin/php54 ...我会卡在登录消息上,如果我使用 php-cli。 putty 告诉我找不到该命令
    • 嗯,第一个错误信息显然是一个错误,因为 php 版本太低了。像使用 php54 一样使用新的 php 版本是解决方案。但我不明白您所说的“卡在登录消息上”是什么意思
    • 如果页面未处于开发模式,我会收到以下输出 -> sspaste.com/paste/show/5256860510ca9 我想我需要以某种方式登录,但是如何登录?
    • 看来 silverstripe 确实希望您登录。如果您在网络浏览器中以实时模式访问 /dev/build,这应该会发生,但 silverstripe 应该实际检测到您正在使用 cli 并且应该绕过登录。不确定这是否是 silverstripe 错误,或者这里是否使用了错误的 php
    • 想详细说明一下吗?我请求您的原谅,但我没有在您的评论中看到新的观点。
    【解决方案2】:

    没有 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
    

    【讨论】:

      【解决方案3】:

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

      <?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”或使用“sake dev/tasks/ArticleCsvUpdateTask”(如果您安装了sake)。

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

      【讨论】:

        【解决方案4】:

        请参阅Zauberfisch's answer 以获得完整的解决方案

        我对 Silverstripe 不熟悉,但如果我理解正确的话,这个控制器 init 函数可以通过 HTTP 请求调用。

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

        php framework/cli-script.php Update/init
        

        更多信息请参见here,并考虑使用sake 完成此任务。

        【讨论】:

        • 这个答案是正确的,但是silverstripe中控制器的init()方法不能通过这种方式访问​​,因为它是控制器的设置。
        • 啊,好的,谢谢,我会测试它,让我们看看@Zauberfisch 会发生什么,所以我只需要重命名这个函数?
        • 我已经写了一个完整的答案,我认为它应该涵盖这个问题,如果没有,请随时再次提问
        • @Zauberfisch 我添加了对您答案的引用
        • 参考?我不知道你在说什么
        【解决方案5】:

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

        #!/usr/bin/env php
        <?php
        
        require_once "/path/to/your/class/Update.php";
        $class = new Update();
        $class->init();
        

        给这个文件添加权限

        chmod 755 consolefile
        

        最后用 cronjob 运行这个脚本

        【讨论】:

        • 您好,谢谢!但在执行 cronjob 后,我收到此错误
          Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /kunden/xxxx/webspace/ xxxx/mysite/code/Update.php 上线 5
        • 你是如何执行这个脚本的?
        • 这个想法适用于普通 php,但使用 silverstripe 并不那么容易。 SilverStripe 有一个自动加载器,您不包括在此处,因此您将收到一个错误,即找不到类 Controller(因为更新扩展了 Controller)我建议使用 silverstripe cli-script.php 或清酒(请参阅我的答案)跨度>
        • 通过主机的控制面板@zauberfisch。好的,我试试这个!非常感谢。
        猜你喜欢
        • 1970-01-01
        • 2015-09-06
        • 2023-03-20
        • 2013-10-15
        • 2018-04-02
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        • 2021-03-14
        相关资源
        最近更新 更多