PHP脚本自动化任务,ftp上传

这个PHP脚本用来上传一篇文章,我的这个网站,每一篇文章是一个目录,里面有一个config.xml存储文章的信息,content.php存储文章正文,可能还有一些图片之类的文件,每次写新文章都十分繁琐,通常是拷贝一篇已经存在的文件夹,然后修改其中的数据,做好之后,将文件夹上传到ftp目录,FileZilla是个好工具.厌倦了这些琐碎的操作之后,写了两个脚本,第一个脚本,自动创建目录,并拷贝必须的文件,修改config.xml文件,执行之后,我只需要编辑文章正文,编辑完成之后,第二个命令,将这个目录上传,成功发布一篇文章.省了不少事情.

第一个脚本:newpost.php

<?php


   
function copy_dir($_s_dir,$_d_dir) {
       
if(!is_dir($_s_dir)) {
         
return FALSE;
       }
       
$_od = getcwd(); // Devemos guardar o diret髍io atual...
       //chdir($_s_dir);
       
$_d = @opendir("$_s_dir");
       
$_ret TRUE;
       
while (($_l=readdir($_d))!==FALSE) {
         
if(substr($_l,0,1)=="." AND strlen($_l)<=2) {
             
continue;
         }
         
if(is_dir($_l)) { 
             mkdir(
"$_d_dir/$_l");
             
if(!copy_dir("$_s_dir/$_l","$_d_dir/$_l")) {
               
$_ret FALSE;
             }
         }
         
else {
//             echo "$_s_dir/$_l";
//             echo "$_d_dir/$_l";
             
if(!copy("$_s_dir/$_l","$_d_dir/$_l")) {
               
$_ret FALSE;
             }
         }
       }
       closedir(
$_d);
       
//chdir($_od);
       
return $_ret;
   }
$dirname $argv[1];

mkdir(
$dirname);
$sourcedir 'd:/bin/blogpost';
copy_dir(
$sourcedir,$dirname);

//现在对config.xml做一些修改
$year = date("Y");
$month = date("n");
$day = date("j");

$configxml = file_get_contents("$dirname./config.xml");

$configxml = preg_replace('/<title>.*<\/title>/',"<title></title>",$configxml);

$configxml = str_replace('</title>',iconv("gb18030","UTF-8",$argv[2]).'</title>',$configxml); 
$configxml = preg_replace('/<year>.*<\/year>/',"<year>$year</year>",$configxml);
$configxml = preg_replace('/<month>.*<\/month>/',"<month>$month</month>",$configxml);
$configxml = preg_replace('/<day>.*<\/day>/',"<day>$day</day>",$configxml);
//echo $configxml;

$f = fopen("$dirname./config.xml","w");

fwrite(
$f,$configxml);
fclose(
$f);

//echo "天气很好"."\n";
//echo iconv("ISO-8859-1","UTF-8",$argv[2]);
?>

脚本接受两个参数,第一个参数,要创建的目录名,第二个参数标题,命令执行完成之后,各种配置已经写好,只差编辑content.php,这是正文.这里要注意的是,将命令行上面传递过来的字符串写入utf8文件的时候,如果包含中文,必须用iconv进行转换,而且源字符串编码是gb18030.

第二个脚本,ftp上传

<?php
$connection 
= ftp_connect('14.80.8.280');
$login = ftp_login($connection,"username","password");
//echo $connection;

if ((!$connection) || (!$login)) {
   
echo 'Connection Failed!!!<BR>\n';
   
return false;

else
{
   
echo "connection success\n";
}
///meichengupload/wwwroot/Blog/
if($argv[1] == '')
  
$uploadpath = getcwd();
else
  
$uploadpath = realpath($argv[1]);

//$s = 'F:\personel doc\Learing\butterflydesign\Blog\web_development\jsphello';
/*$s = $uploadpath;
$s = str_replace('\\','/',$s);
$s = strstr($s,"/butterflydesign");
$s = "/meichengupload".$s;
$s = str_replace("butterflydesign","wwwroot",$s);
*/

/*echo "Making directory",$s."\n";
if(ftp_mkdir($connection,$s))
{
  echo "successfully created $s\n";
}
else
{
  echo "mkdir $s fails\n";
}*/

ftpupload($connection,$uploadpath);

//ok ,now upload the directory
ftp_close($connection);

function ftpupload($connection,$path)
{
    
$s $path;
    
$s = str_replace('\\','/',$s);
    
$s = strstr($s,"/butterflydesign");
    
$s "/meichengupload".$s;
    
$s = str_replace("butterflydesign","wwwroot",$s);
  
if(is_dir($path))
  {
    
echo "Processing directory";
    
//创建目录

    
    //现在$s应该是ftp上的dir的路径
    
if(ftp_mkdir($connection,$s))
    {
echo "successfully created $s\n";}
    
else
    
{echo "mkdir $s fails\n";}
    
    
//下面上传该目录下的所有文件,可以暂时先实现上传文件,必要的时候
    //实现,递归的上传
    
$d = dir($path);
    
while(($entry $d->read()) !== FALSE)
    {
      
if (($entry!=".")&&($entry!=".."))
      {
        
if(is_dir("$path/$entry"))
        {
          ftpupload(
$connection,"$path/$entry");
        }
        
else
        
{
          
if(ftp_put($connection,"$s/$entry","$path/$entry",FTP_BINARY))
          {
echo "upload file $s/$entry sucess\n";}
          
else
          
{echo "upload file $s/$entry fail\n";}
        }
      }

    }        
  }
  
else
  
{
    ftp_put(
$connection,$s,$path,FTP_BINARY);
  }
}
?>

$path参数可以是一个目录名,也可以是一个文件名,表示上传一个目录或者上传一个文件,目录的话会递归遍历子目录,如果没有命令行上没有参数,则上传当前目录.