2012-11-30 173 views
1

這是我的控制器看起來像
cron作業

<?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分鐘運行一次?

回答

1

要檢查腳本是否從命令行訪問,請使用php_sapi_name() == 'cli'使用它來檢測腳本是否從cli或瀏覽器訪問。詳情請參閱here

要使代碼每隔X分鐘運行一次,請創建一個新的任務計劃程序,以使用命令行運行.bat文件。請確保您調用使用全路徑PHP可執行文件,e.g C:\apache\php.exe "C:\Program Files (x86)\EasyPHP\www\myweb\index.php" --uri=cron/index

歡呼

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(); 
+0

HTTP_Exception_403給我一個ExceptionError,通常它顯示403錯誤頁面 – DeathCoder

+0

你必須改變你的index.php捕捉這些例外並做相應的動作,如顯示一個空白頁面或簡單的403頁面,如'

403 Forbidden

'。如果你正在使用Kohana 3.3,你應該使用minion作爲CLI的東西。我更新了捕獲異常的'index.php'部分的代碼 – pocesar