Yii2 的php定时脚本

1 篇文章 0 订阅
1 篇文章 0 订阅

YIi2 console中

<?php
/**
 * Created by PhpStorm.
 * User: weiqiang
 * Date: 2018/8/17
 * Time: 下午4:56
 */

namespace app\modules\console\controllers;


use yii\console\Controller;
use Yii;

class TimeController extends Controller
{
    const REDIS_KEY = "time_command";

    public function actionIndex()
    {
        $redis = Yii::$app->get('redis');

        $appDirectory =  Yii::getAlias('@app/modules/console/yii');

        $file = Yii::getAlias('@app/web/config/timeCommand/config.json');
        $jsonArr = json_decode(file_get_contents($file), true);

        $commandList = $jsonArr['commandList'];
        $phpDirectory = $jsonArr['phpDirectory'];
        $start = $jsonArr['start'];



        while($start){
            $jsonArr = json_decode(file_get_contents($file), true);
            $start = $jsonArr['start'];
            sleep($jsonArr['interval']);
            foreach ($jsonArr['commandList'] as $name=>$content) {
                $pid = pcntl_fork();   // 启动一个字进程,并返回进程号

                if($pid == -1){

                    //进程创建失败

                }else if(!$pid){
                    $time = time();
                    if (strtotime($content['start'])<=$time&&strtotime($content['end'])>=$time){
                        $tmp = $redis->HGET(static::REDIS_KEY,$name);
                        if ($time>=$tmp+$content['interval']-5){
                            $redis->HSET(static::REDIS_KEY,$name,$time);
                            $res = shell_exec($phpDirectory." ".$appDirectory." ".$content['command']);
                            $this->myLog($res);
                        }

                    }
                    //$this->myLog("Time/Index succeed");
                    exit;

                }else{

                    pcntl_wait($status, WNOHANG);//把僵尸进程关闭

                    //这里就是 父进程在创建完子进程后 要执行的部分,可以写一些信号控制等内容

                }

            }
        }



    }
    private function myLog($string){
        $directory = Yii::getAlias('@app/web/config/timeCommand/log');
        $date = date("Ymd");
        $myfile = fopen($directory."/".$date.".log", "a+");
        $dateTime = date("Y-m-d H:i:s");
        fwrite($myfile, "[".$dateTime."] ".$string."\n");
        fclose($myfile);
    }
    public function actionIndex1()
    {
        sleep(1);
        echo "index1 succeed";

    }
    public function actionIndex2()
    {
        echo "index2 succeed";

    }



}

config.json内容

{
  "commandList":{
    "everyDay":{
    "command": "console/time/index1",
    "start": "2018-10-10 00:00:00",
    "end": "2018-10-20 00:00:00",
    "interval": "6"
   },

    "everyMonth":{
      "command": "console/time/index2",
      "start": "2018-10-01 00:00:00",
      "end": "2018-10-20 00:00:00",
      "interval": "6"
    }
  },
  "interval":6,
  "start":false,
  "phpDirectory":"/usr/local/opt/php@7.1/bin/php"
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值