Yii2 console執行定時腳本

 

爲何要作crontab腳本

咱們的項目使用YII2開發,並非很大的一個電商平臺,pv、IP訪問量並非很高,但客戶的數據是日積月累已經產生100萬條數據了,以前更新訂單等數據使用定時腳本直接訪問內網的一個url,由於更新訂單只是部分數據,php後臺執行10s徹底能夠勝任。php

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

繼續使用crontab 訪問一個內網的url進行更新操做,這樣不可取,由於如今是100w條數據,php的url訪問確定會超時。git

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

 

Test Yii2 console

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

項目用的是YII2的yii2-app-advanced 高級版,因此下載 https://github.com/yiisoft/yii2-app-advanced 中的init文件(項目中有,但未使用Del了),執行初始化生成yii文件數據庫

目錄結構bootstrap

F:\project\web\yii2-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.

HelloControlleryii2

namespace console\controllers;
 
use yii\console\Controller;

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" . "\n";
    }

}

訪問試試cookie

$ php yii hello
hello world

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

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 \common\models\Ztest();
        $model->text = "sdkfjlskdjflsdf";
        $model->save();
        echo 'ok';
    }

查看數據庫已經插入。

 

crontab執行

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

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

相關文章
相關標籤/搜索