1

这就是我的控制器的样子

<?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是控制器,index是一个函数。

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

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

public function before() {

        if(!Kohana::$is_cli) ;
    }

是为了避免通过浏览器进行任何访问?那么,1.如何拒绝来自浏览器的访问?2. 如何让代码每 x 分钟运行一次?

4

3 回答 3

1

要检查脚本是否从命令行访问,请使用php_sapi_name() == 'cli'使用它来检测您的脚本是从 cli 还是浏览器访问。详情见这里

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

干杯

于 2012-12-01T09:01:20.733 回答
1

因为它是 Windows,所以它实际上不是“cron”。你有两个选择:

  • 设置action_index为执行无限循环,然后检查所需的间隔,并usleep节省一段时间以节省 CPU 周期,如 100,因此它不会占用您所有的处理能力
  • 每次都使用 Windows 调度程序运行您的脚本。

您的代码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();
于 2012-12-01T10:15:29.107 回答
1

使用这两个链接来获得你需要的东西。Kohana 3 中的 Cron 作业

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

于 2012-12-12T19:30:21.887 回答