yii框架,掃描目錄下檔案入資料庫

Jason發表於2019-02-16

需求:

帶yii框架下寫一個定時任務,掃描某一目錄$target下的json檔案,並匯入指定的資料庫中

實現:

1.把需要入庫的json檔案放在指定目錄$target下
2.執行定時任務,匯入到mongo庫Vote_teacher中

/opt/modules/php/bin/php /www/web/protected/yiic.php import VoteTeacher

3.定時任務程式碼:
/web/protected/commandsImportCommand.php

<?php
/**
 * 匯入mongo庫到測試環境
 *
 * @author      lizhihui
 * @date        2018-4-9
 * @console     php  www/web/protected/yiic.php import VoteTeacher> /tmp/abc1.txt
 */
class ImportCommand extends CConsoleCommand 
{

    public $target=`/www/web/html/import/`;     //掃描的目錄

    public $model;    //入庫的資料庫物件

    public function run($args) {

        if (isset($args[0])) {
            $this->showMessage("params error", 1);
            exit;
        }
        $this->model = $args[0];
        $this->import();
    }

    /**
     * 分析使用者回答的資訊並按格式入庫vote_answer
     * @author      lizhihui
      * @date        2018-4-9
     */
    private function import() 
    {
        $files = scandir($this->target);
        //讀取目錄下檔案
        foreach ($files as $key => $val) {
            $val = pathinfo($val);
            $extension = $val[`extension`];
            //過濾掉非json格式
            if($extension!=`json`){
                continue;
            }

            $filePath=$this->target.$val[`basename`];
            $fp=fopen($filePath,`r`);
            $content=``;
            while (!feof($fp)){
                $content.=fread($fp, filesize($filePath)/10);//每次讀出檔案10分之1
            //進行處理
            }
            $arr=json_decode($content);
            if(empty($arr)){
                $this->showMessage("no data to import");
                die();
            }

            //例項化不同資料庫
            $tag=true;
            foreach ($arr as $key => $val) {                
                //儲存
                $aVal = (array)$val;
                $model = new $this->model;
                if($model instanceof SMongodb){//動態欄位儲存
                    foreach ($aVal as $k => $v) {
                        $model->$k=$v;
                    }
                }else{//非動態欄位儲存
                    $model->attributes=$aVal;
                }

                if(!$model->save()){
                    $tag=false;
                }else{
                    unset($model);    //銷燬一個物件,再次使用的時候會new一個新的
                }
            }

        }
        if(!$tag){
            $this->showMessage("some error in import");
        }else{
            $this->showMessage(`import success!`);
        }
    }    


    /**
     * 資訊輸出
     * @author      lizhihui
      * @date        2018-4-9
     */
    private function showMessage($str, $err = 0) {
        if (!$str) {
            return false;
        }
        if ($err) {
            echo "[ERROR]";
        } else {
            echo "[SUCCESS]";
        }

        echo date("Y-m-d H:i:s", time()) . " " . $str . "
";

    }
}

相關文章