通过Kohana控制器的Cron工作

时间:2012-11-30 16:37:41

标签: php cron kohana command-line-interface

这就是我的控制器的样子

<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Cron extends Controller {

    public function before() {

        if(!Kohana::$is_cli) ;
    }

    public function action_index() {
        $myFile = "C:\cron.txt";
        $fh = fopen($myFile, 'w') or die("can't open file");
        fwrite($fh, "\n");
        $stringData = date('Y-m-d H:i:s');
        fwrite($fh, $stringData);
        fclose($fh);
    }
}

?>

我使用此

通过命令行运行脚本
php "C:\Program Files (x86)\EasyPHP\www\myweb\index.php" --uri=cron/index

其中 cron 是控制器,索引是一个函数。

现在我需要的是每x分钟运行一次脚本

当我通过浏览器运行脚本时,只是修改了 C:\ cron.txt 的时间。 我把这个放在心里

public function before() {

        if(!Kohana::$is_cli) ;
    }

是为了避免通过浏览器访问? 所以, 1.我如何拒绝浏览器的访问? 2.如何每隔x分钟运行一次代码?

3 个答案:

答案 0 :(得分:1)

要检查脚本是否从命令行访问,请使用php_sapi_name() == 'cli'使用它来检测您的脚本是从cli还是浏览器访问的。有关详细信息,请参阅here

要使代码每X分钟运行一次,请创建一个新的任务调度程序,以便在其中运行带有命令行的.bat文件。确保使用完整路径调用php可执行文件,例如C:\apache\php.exe "C:\Program Files (x86)\EasyPHP\www\myweb\index.php" --uri=cron/index

欢呼声

答案 1 :(得分:1)

因为它的窗户,它实际上不是“cron”。你有两个选择:

  • 设置action_index执行无限循环,然后检查所需的时间间隔,并usleep一段时间以节省CPU周期,如100,因此不需要进行所有处理功率
  • 每次使用Windows Scheduler运行脚本。

before()中的代码应为

function before(){
  if (!Kohana::$is_cli) { throw new HTTP_Exception_403; // Denied };
} 

确保正确处理异常。或者您可以在403例外情况下将屏幕设为空白。您只能将--uri="cron"传递给PHP命令行,因为index部分始终是默认操作(在引导程序中的默认Route::set中)

您必须在index.php

中捕获例外情况
 $request = Request::factory();

 try
 {
      $response = $request->execute();
 }
 catch (HTTP_Exception $exc)
 {
    $response = Request::factory('your/error')->execute();
    // or $response = Response::factory()->status(403)->body('<h1>403 Forbidden</h1>');
 }

 echo
   $response     
   ->send_headers()
   ->body();

答案 2 :(得分:1)

使用这两个链接获取您需要的内容。Cron Jobs in Kohana 3

可以帮助kohana-cron的模块 Kohana Minion