为什么要做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:\project\web\yii2-app-advanced-master
$ php init
Yii Application Initialization Tool v1. Which environment do you want the application to be initialized in? [] Development
[] Production Your choice [-, or "q" to quit] 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 backend/runtime
chmod backend/web/assets
chmod frontend/runtime
chmod frontend/web/assets
chmod yii
chmod yii_test ... initialization completed.

HelloController

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";
} }

访问试试

$ 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 \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

Yii2 console执行定时脚本的更多相关文章

  1. 【转】linux 定时执行shell脚本

    在oracle 中可以利用dbms_job包定时执行pl/sql.sql过程,在像备份等需要在操作系统级定时任务只能采用crontab来完成 本文讲述crontab具体用法,以供备忘. 在oracle ...

  2. linux 定时执行shell脚本

    转自:http://blog.csdn.net/jingxiangren/article/details/4745631 在oracle 中可以利用dbms_job包定时执行pl/sql.sql过程, ...

  3. linux crontab定时执行shell脚本

    linux下使用crontab命令被用来提交和管理用户的需要周期性执行的任务,示例如下:crontab -e 编辑周期任务30 21 * * * /etc/init.d/smb restart 每晚的 ...

  4. 如何使用Linux的Crontab定时执行PHP脚本的方法

    我们的PHP程序有时候需要定时执行,我们可以使用ignore_user_abort函数或是在页面放置js让用户帮我们实现.但这两种方法都不太可靠,不稳定.我们可以借助Linux的Crontab工具来稳 ...

  5. php定时执行PHP脚本一些方法总结

    本文章总结了php定时执行PHP脚本一些方法总结,有,linux中,windows,php本身的方法,有需要的朋友可参考参考. linux下定时执行php脚本 执行PHP脚本 方法1如果你想定时执行某 ...

  6. 使用sae定时执行Python脚本

    使用sae定时执行Python脚本 使用sae定时执行Python脚本 12,May,2014 | 57 Views 毕设压力略大,必须是桂林游的锅.去之前放松了几天,回来又休闲了几天,加上桂林的一周 ...

  7. 如何使用Linux的Crontab定时执行PHP脚本的方法[转载]

    首先说说cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 crontab 工具来配置 cron 任务.所有用户定义的 crontab 都被保存在/var/spool/cron 目 ...

  8. 定时执行自动化脚本-(二)ant发送邮件及邮件中添加附件

    发送邮件及邮件添加附件均需要用java来实现 1.idea创建一个maven的java项目,目录结构如下 2.pom.xml文件添加依赖的javax.mail <dependencies> ...

  9. 在LINUX环境下定时执行php脚本

    1. 使用Crontab定时执行linux环境下的php脚本文件 Cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 crontab 工具来配置 cron 任务.所有用户定义的 c ...

随机推荐

  1. Nginx下配置SSL模块,支持https

    Http与Https的区别 HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效 ...

  2. P1996 约瑟夫问题-题解(队列??明明是单循环链好吗)

    一如既往的题目传送:     https://www.luogu.org/problemnew/show/P1996 这里不讲数组模拟的方法(毕竟多做点题的模拟功力足以暴力出这道题),而是讲一种单循环 ...

  3. 洛谷P3480 KAM-Pebbles

    题目大意: 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件.谁没有石子可移时输掉游戏.问先手是 ...

  4. 生成ISO文件

    cat /dev/cdrom > image.iso dd if=/dev/cdrom of=image.iso mkisofs -V "Label" -o image.is ...

  5. python基础1之 由来、种类、优缺点、安装环境

    python基础1之由来.种类.优缺点.安装环境 一.前世今生 Python的创始人是吉多·范罗苏姆(Guido van Rossum),在1989年开发.今年最新的编程语言排行榜中,python名列 ...

  6. html的分类与特点

    ##块级元素##|元素|描述||--|--||h1-h6|标题||div|区分大模块||p|段落||ul>li|无序列表||ol>li|有序列表||dl>dt dd|自定义列表||t ...

  7. Linux VPS通过安装CPULimit来限制CPU使用率

    说明:我们手上经常有很多廉价的VPS,有时候使用某些软件应用的时候,会出现CPU跑满的情况,而长时间跑满会被VPS商家停掉,所以这里我们需要想办法来限制进程CPU使用率,这里就说个教程. 简介 cpu ...

  8. <发条游戏设计>粗翻——第一部分 理论(一)

    段落1 游戏 游戏设计定义 相对而言,游戏设计是一个新的学科,专业的作曲家.画家.作家.建筑师已经至少存在了500多年,然而游戏设计师只在最近50年才被特分出来单作一类.然而这个类别仅仅在最近20-2 ...

  9. 简单文本悬浮div提示效果

    <html> <head> <script src="jquery-1.9.1.min.js" type="text/javascript& ...

  10. UOJ #460 新年的拯救计划

    清真的构造题 UOJ# 460 题意 求将$ n$个点的完全图划分成最多的生成树的数量,并输出一种构造方案 题解 首先一棵生成树有$ n-1$条边,而原完全图只有$\frac{n·(n-1)}{2}$ ...