咱们的项目使用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
官文手册: 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
在上面说过,要链接数据必需要给common使用别名执行路径,下面测试下数据库操做
public function actionCreate() { $model = new \common\models\Ztest(); $model->text = "sdkfjlskdjflsdf"; $model->save(); echo 'ok'; }
查看数据库已经插入。
写好了逻辑代码,直接用Linux的crontab命令执行定时任务
关于crontab命令可参考: http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html