'.$signer.''; } //生成远程目录数组 function addDir($filedir='', $description='', $dfserv=0, $state=0, $issystem=0) { return array( 'filedir' => $filedir, 'description' => $description, 'dfserv' => $dfserv, 'state' => $state, 'issystem' => $issystem ); } //将配置数组生成配置内容 function makeConfig($dirarray=array()) { $config_str = ''; foreach($dirarray as $k => $val) { $config_str .= '$remotefile['.$k.'] = array('."\n"; $config_str .= ' \'filedir\'=>\''.$val['filedir']."',\n"; $config_str .= ' \'description\'=>\''.$val['description']."',\n"; $config_str .= ' \'dfserv\'=>'.$val['dfserv'].",\n"; $config_str .= ' \'state\'=>'.$val['state'].",\n"; $config_str .= ' \'issystem\'=>'.$val['issystem']."\n"; $config_str .= ");\n"; } return ($config_str == '')? '' : $config_str; } //递归获取目录 by:tianya function getDirs($directory,$exempt = array('.','..','.ds_store','.svn'),&$files = array()) { //没有则创建 if(is_dir($directory) && !opendir($directory)) mkdir($directory,0777,TRUE); $handle = opendir($directory); while(false !== ($resource = readdir($handle))) { if(!in_array(strtolower($resource),$exempt)) { //排除目录 if(is_dir($directory.$resource.'/')) { array_merge($files, getDirs($directory.$resource.'/',$exempt,$files)); } else { //if(!is_file($directory.'/'.$resource)) //{ $files[] = $directory.'/'.$resource; //} } } } closedir($handle); return $files; } function updateConfig($dirarray=array()) { //将其转换为配置写入文件 $configfile = DEDEDATA.'/config.file.inc.php'; $old_config = @file_get_contents($configfile); $config_str = makeConfig($dirarray); //替换配置项 $new_config = preg_replace("/#(.*)#/s", "#\n\n{$config_str}#", $old_config); file_put_contents($configfile, $new_config); } if($dopost == '') { } /* function Updateremote() */ else if($dopost == 'updateremote') { $dirbox = array(); // 定义一个目录容器,确保目录的唯一性 //获取所有HTML生成文件夹列表 $query = "SELECT id,typedir,ispart FROM #@__arctype WHERE ispart <> '3'"; $dsql->SetQuery($query); $dsql->Execute('al'); $dirarray = array(); $i = 0; while ($row = $dsql->GetArray("al")) { $darray = explode('/', preg_replace('/{cmspath}/', '', $row['typedir'])); //仅获取顶级目录作为文件同步更新目录 if(!in_array($darray[1], $dirbox)) { $dirarray[$i] = addDir('/'.$darray[1], '文档HTML默认保存路', 0, 0, 1); $dirbox[] = $darray[1]; $i++; } } //系统附件存放目录 $dirarray[$i++] = addDir($cfg_medias_dir, '图片/上传文件默认路径', 0, 0, 1); //专题目录 $dirarray[$i++] = addDir('/special', '专题目录', 0, 0, 1); //data/js目录 $dirarray[$i++] = addDir('/data/js', '生成js目录', 0, 0, 1); //$remotefile = array(); //把非系统目录的内容提取出来 foreach ($remotefile as $key => $value) { //处理用户自定义配置 if($value['issystem'] == 0) { $dirarray[$i++] = addDir($value['filedir'], $value['description'], $value['dfserv'], $value['state'], $value['issystem']); } } updateConfig($dirarray); ShowMsg("成功更新同步目录,请重新对目录进行同步操作!","makeremote_all.php"); exit; } /* function Make()&MakeAll() */ else if($dopost == 'make') { if($step == 1) { if($maketype == 'makeall') { //如果更新所有,则需要重新组合$Iterm foreach($remotefile as $key => $val) { $Iterm[] = $val['filedir']; } } else { //初始化配置 $Iterm = !isset($Iterm)? array(): $Iterm; } $serviterm = !isset($serviterm)? array(): $serviterm; $cacheMakeFile = DEDEDATA.'/cache/filelist.inc.php'; $dirlist = $alllist = $updir = array(); $dirindex = 0;//目录统一索引 //采用比较人性化的更新方式进行提示更新 //初始化本地文件夹底层的子集目录 if(count($Iterm) > 0) { //获取远程文件(夹)列表 foreach($Iterm as $key => $val) { $config = $serviterm[$key]; if(is_array($dirlist = getDirs(DEDEROOT.$val))) { foreach($dirlist as $k => $v) { $alllist[] = $v.'|'.$config; if(!in_array($val, array_values($updir))) $updir[] = $val; } } } //遍历文件夹列表,如果存在子集文件夹大于3的则需要进行细分 //将列表写入缓存 $cachestr = " $val) { list($filename,$fileconfig) = explode('|', $val); if(is_dir($filename)) { $deepDir = getDirs($filename); $dd = 0; //先遍历一遍确定子集文件夹数目 foreach($deepDir as $k => $v) { if(is_dir($v)) $dd++; } if($dd > 3) { //如果自己文件夹数目大于3则 foreach($deepDir as $k => $v) { $v .= '|'.$fileconfig; $cachestr .= " \$dirlist['$dirindex']='$v';\n"; $dirindex++; } }else{ $cachestr .= " \$dirlist['$dirindex']='$val';\n"; $dirindex++; } } } foreach($updir as $key => $val) { $cachestr .= " \$upremote['$key']='$val';\n"; } $cachestr .= "?>"; file_put_contents($cacheMakeFile, $cachestr); $tnum = count($alllist); ShowMsg("成功获取远程列表,下面进行文件远程发布!","makeremote_all.php?dopost=make&step=2&sta=1&totalnum=$tnum"); exit; } else { echo '您没有选择,请先选择再点击更新!'; } exit; } elseif ($step == 2) { if(file_exists(DEDEDATA.'/cache/filelist.inc.php')) { require_once(DEDEDATA.'/cache/filelist.inc.php'); } if(is_array($dirlist)) { if($sta > 0 && $sta < $totalnum) { list($dirname, $ftpconfig) = explode('|', $dirlist[$sta-1]); list($servurl, $servuser, $servpwd) = explode(',', $ftpconfig); $config=array( 'hostname' => $servurl, 'username' => $servuser, 'password' => $servpwd,'debug' => 'TRUE'); if($ftp->connect($config)) { //var_dump(is_dir($dirname));exit; if(is_dir($dirname)) { //如果是文件目录 $remotedir = str_replace(DEDEROOT, '', $dirname).'/'; $localdir = '..'.$remotedir.'/'; $ftp->rmkdir($remotedir); if( $ftp->mirror($localdir, $remotedir)) { $sta++; ShowMsg("成功同步文件夹$remotedir,进入下一个任务","makeremote_all.php?dopost=make&step=2&sta={$sta}&totalnum=$totalnum"); exit; } } else { $remotefile = str_replace(DEDEROOT, '', $dirname); $localfile = '..'.$remotefile; //创建远程文件夹 $remotedir = preg_replace('/[^\/]*\.(\w){0,}/', '', $remotefile); //如果是文件则需要智能处理 $remotebox = array(); $ftp->rmkdir($remotedir); foreach($dirlist as $key => $val) { list($filename,$fileconfig) = explode('|', $val); if(preg_replace('/[^\/]*\.(\w){0,}/', '', str_replace(DEDEROOT, '', $filename)) == $remotedir) { //如果这些文件都在同一目录,则统计这些记录的id项目 $remotebox[] = $key; } } //print_r($remotebox); //if(count($remotebox) > 1 && count($remotebox) < 20) if(count($remotebox) > 1) { //如果大于1,则说明有多条记录在同一文件夹内 $localdir = '..'.$remotedir; if( $ftp->mirror($localdir, $remotedir)) { $sta = end($remotebox) + 1; ShowMsg("成功同步文件夹$remotedir,进入下一个任务","makeremote_all.php?dopost=make&step=2&sta={$sta}&totalnum=$totalnum"); exit; } } else { if( $ftp->upload($localfile, $remotefile) ) { $sta++; ShowMsg("成功同步文件$remotefile,进入下一个任务","makeremote_all.php?dopost=make&step=2&sta={$sta}&totalnum=$totalnum"); exit; } } } } } else { //否则成功更新完毕 foreach($remotefile as $key => $val) { if(in_array($val['filedir'],array_values($upremote))) { $remotefile[$key]['state'] = 1; } } updateConfig($remotefile); @unlink(DEDEDATA.'/cache/filelist.inc.php'); echo '全部同步完毕!';exit; } } else { exit('Error:None remote cache file exist!'); } exit; } } include DedeInclude('templets/makeremote_all.htm');