天天看點

Yii2 console執行定時腳本 為什麼要做crontab腳本 Test Yii2 consoleActiveRecord操作 crontab執行

為什麼要做crontab腳本

我們的項目使用YII2開發,并不是很大的一個電商平台,pv、IP通路量并不是很高,但客戶的資料是日積月累已經産生100萬條資料了,之前更新訂單等資料使用定時腳本直接通路内網的一個url,因為更新訂單隻是部分資料,php背景執行10s完全可以勝任。

現在需求是這樣的:之前系統沒有考慮客戶的積分等級,現在需要加入這個功能,是以必須給客戶表添加積分字段,在添加一個積分記錄表,那麼之前老客戶資料因下單,本應該也生成對應的積分等級,而且要每晚上執行一次昨天下單客戶對應的成長值,每月定期計算一次過期積厘清零操作(類似支付寶會員積分、網易遊戲積分:http://game.163.com/news/2011/3/22/442_233242.html)。好,需求就這麼簡單。

繼續使用crontab 通路一個内網的url進行更新操作,這樣不可取,因為現在是100w條資料,php的url通路肯定會逾時。

那就隻能執行php腳本了,執行php腳本想了兩個方案,第一種,寫一個pdo類,直接單獨檔案執行,第二種,使用YII自帶的console,兩者之間選擇了後者。

Test Yii2 console

官文手冊: http://www.yiiframework.com/doc-2.0/guide-tutorial-console.html

項目用的是YII2的yii2-app-advanced 進階版,是以下載下傳 https://github.com/yiisoft/yii2-app-advanced 中的init檔案(項目中有,但未使用Del了),執行初始化生成yii檔案

目錄結構

F:projectwebyii2-app-advanced-master
$ php init
Yii Application Initialization Tool v1.0

Which environment do you want the application to be initialized in?

  [0] Development
  [1] Production

  Your choice [0-1, or "q" to quit] 0

  Initialize the application under 'Development' environment? [yes|no] yes

  Start initialization ...

      exist backend/config/main-local.php
            ...overwrite? [Yes|No|All|Quit] yes
  overwrite backend/config/main-local.php
  unchanged backend/config/params-local.php
   generate backend/config/test-local.php
   generate backend/web/index-test.php
      exist backend/web/index.php
            ...overwrite? [Yes|No|All|Quit] yes
  overwrite backend/web/index.php
      exist common/config/main-local.php
            ...overwrite? [Yes|No|All|Quit] All
  overwrite common/config/main-local.php
  unchanged common/config/params-local.php
   generate common/config/test-local.php
  overwrite console/config/main-local.php
  unchanged console/config/params-local.php
  overwrite frontend/config/main-local.php
  unchanged frontend/config/params-local.php
   generate frontend/config/test-local.php
   generate frontend/web/index-test.php
  overwrite frontend/web/index.php
   generate yii
   generate yii_test
   generate yii_test.bat
   generate cookie validation key in backend/config/main-local.php
   generate cookie validation key in frontend/config/main-local.php
      chmod 0777 backend/runtime
      chmod 0777 backend/web/assets
      chmod 0777 frontend/runtime
      chmod 0777 frontend/web/assets
      chmod 0755 yii
      chmod 0755 yii_test

  ... initialization completed.      

HelloController

namespace consolecontrollers;
 
use yiiconsoleController;

class HelloController extends Controller {

    /**
     * This command echoes what you have entered as the message.
     * @param string $message the message to be echoed.
     */
    public function actionIndex() {
        echo "hello world" . "
";
    }

}      

通路試試

$ php yii hello
hello world      

這裡有個問題需要說下,剛開始我執行的時候一直提示:

Error: Unknown command "hello".      

因為目錄别名的問題,是以,如果沒有生成bootstrap.php 中的别名配置,可以直接在yii檔案中加上:

Yii::setAlias('@console', (dirname(__DIR__)) . '/console');      

如果在console中要使用ActiveRecord 操作 models,必須設定common别名

Yii::setAlias('common', (dirname(__DIR__)) . '/common');      

config檔案中db的引用應該使用決定路徑而不是相對路徑

$db= require(dirname(dirname(__DIR__))."/common/config/main.php");      

否則提示: 找不到../../common/config/main.php

代碼下載下傳: http://files.cnblogs.com/files/dcb3688/yii2-console.7z

YII2 的基礎版那更簡單了,執行下載下傳 https://github.com/yiisoft/yii2-app-basic  解壓後發現根目錄下已經有yii檔案和commands目錄了,

可以直接執行

$ php yii hello
hello world      

ActiveRecord操作

在上面說過,要連接配接資料必須要給common使用别名執行路徑,下面測試下資料庫操作

public function actionCreate() {

        $model = new commonmodelstest();
        $model->text = "sdkfjlskdjflsdf";
        $model->save();
        echo 'ok';
    }      

檢視資料庫已經插入。

crontab執行

寫好了邏輯代碼,直接用Linux的crontab指令執行定時任務

關于crontab指令可參考: http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html