需求:
帶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 . "
";
}
}