PHP 做的文件备份

2012-05-18 / php, 备份 / 没有评论

请看代码:

<?php
/**
 * 经过前两次的硬盘突然损坏, 我受到了极大的打击.
 * 每次坏了之后, 不单是要买块硬盘, 还要承受数据丢失的痛苦, 前面辛辛苦苦写的代码, 收集的材料, 以及我的各种环境配置, 密码文件都丢了, 很是痛苦.
 * 当然了, 还有我的片也没了, 不过这不是重点.
 *
 * 上面的那些理由让我决定写这么一个小文件来定期做备份, 把日常写的代码, password文件, 通信的密钥, 电子书等都定期备份下,
 * 目前只有小文件的备份, 不过平时也都是小文件, 电影神马的丢就丢吧, 也无所谓
 * 这样以后即使硬盘坏了也就不会在如这般痛苦了.
 *
 * 上面都是废话, 本文件仅支持windows平台, 需要和windows的计划任务一起执行.当然稍微修改下在linux应该也没问题.
 * 使用之前请先做好相关配置.
 *
 * # 2012/04/24 发现一个问题, 拷贝到U盘的时候很慢, U盘的IO不行啊, 准备改成先拷贝到本地磁盘, 然后压缩成ZIP然后在拷贝到U盘, 准备实施下看看效果
 *   不过需要使用pclzip这个开源的类
 * # 算了, 打包还不如直接考过去快呢
 */

define('DS', DIRECTORY_SEPARATOR);
error_reporting(E_ERROR);
set_time_limit(0);

$time = time();
$num = 0;

list($year, $month, $day, $hour, $minute, $seconde) =
	explode('-', gmdate("Y-m-d-H-i-s", time()));

$files = array(
	'E:/veryImportant/',
	'D:/Program Files/Vim/_vimrc',
	'D:/cron/',
	'E:\AppServ\www\test\\',
	'E:\AppServ\www\stat\\',
);
$backupdir = 'I:/backup/';

if(!is_dir($backupdir.$year.$month.$day)) {
	mkdir($backupdir.$year.$month.$day);
}
$backupdir	= $backupdir.$year.$month.$day.DS;
$backupdir	= dir_format($backupdir);
$files		= dir_format($files);

foreach($files as $need_to_back_dir) {

	if(is_dir($need_to_back_dir)) {
		$directory = array_filter(explode(DS, $need_to_back_dir));
		$size = count($directory);
		$todir = $directory[$size-1];
		copy_from_array(filewalk($need_to_back_dir), $need_to_back_dir, $backupdir.$todir.DS);
	} else {
		copy_from_array(array(str_replace(dirname($need_to_back_dir).DS, '', $need_to_back_dir)), dirname($need_to_back_dir).DS, $backupdir);
	}
}

echo "####################\r\ncopy file finished\r\n";
echo time() - $time." second(s).";
echo "\r\n{$num} file(s) copied.";
echo "\r\n####################";

/**
 * 替换目录地址中的斜杠, 反斜杠为系统的目录分隔符
 * #需要静态变量 DS
 * #2012-04-24 10:35 刚刚YY的QQ上线了, 心里好乱啊, 只能眼睁睁的看着, 什么也做不了
 * #我连发个消息给她的勇气都没有.
 */
function dir_format($dir) {
	if(is_array($dir)) {
		foreach($dir as $key => $value) {
			$dir[$key] = dir_format($value);
		}
	} else {
		$dir = str_replace('/', DS, $dir);
		$dir = str_replace('\\', DS, $dir);
	}
	return $dir;
}

/**
 * 按照数组复制文件
 * #如果目标文件存在, 会被覆盖
 * #需要静态变脸 DS directory_separator
 * @param files 从下面的filewalk的返回值得到的
 * @param basedir 复制文件的起始目录
 * @param todir	复制到的辣个文件目录
 * @return	如果basedir不存或者文件不是数组则返回false
 * 		如果执行成功然后true
 */
function copy_from_array($files, $basedir, $todir) {
	global $num;
	if(!is_array($files) || !is_dir($basedir)) {
		return false;
	}
	if(!is_dir($todir)) {
		mkdir($todir) || exit('make directory error.');
	}
	foreach($files as $key => $value) {
		if(is_array($value)) {
			if(!is_dir($todir.$key)) {
				mkdir($todir.$key);
			}
			if(!copy_from_array($value, $basedir.$key.DS, $todir.$key.DS)) return false;
		} else {
			copy($basedir.$value, $todir.$value);
			$num++;
			echo "copy {$basedir}{$value} -> {$todir}{$value}\r\n";
		}
	}
	return true;
}
/**
 * 函数:遍历文件夹
 * # 静态变量DS为文件目录分隔符
 * # 递归函数,请自重
 * @dir	要遍历的文件目录
 * @return 返回值
 * 	false	-	目录读取错误
 * 	array	-	文件列表(如果value为数组, 则key为目录名, value为目录下文件;否则value为文件名)
 */
function filewalk($dir) {
	if(is_dir($dir)) {
		if($handle = opendir($dir)) {
			while(false !== ($file = readdir($handle))) {
				if($file == '.' || $file == '..') continue;
				if(is_dir($dir.DS.$file)) {
					$filelist[$file] = filewalk($dir.DS.$file);
				} else {
					$filelist[] = $file;
				}
			}
			return $filelist;
		} else {
			return false;
		}
	} elseif(file_exists($dir)) {
		return array($dir);
	} else {
		return false;
	}
}
?>

然后是对应的bat, 做好之后把BAT加到系统的计划任务里就可以了.BAT里就一个命令

php php E:\www\test\cron.php

很easy吧

Read More

个人常用工具整理

2012-03-09 / 未分类 / 没有评论

autoHotKey

graphVIZ

dia

search and replace

xmind

deskpins

snagit

prezi
 

Read More

一组能让我爽出内伤的 Vim motion [转]

2011-12-09 / vim / 没有评论

转自:http://nootn.com/blog/Tool/37/
今天有人在群里说VIM的motionn特性,后去搜索了下,顿时让我爽得想哭啊,这就不是我一直所寻找的嘛!

对于天天写HTML的我来说命令vit、vat、vi”真的太有用了,尤其vi”编辑属性就别太爽,以前一直是移动到属性区域按i后再疯狂按删除键。

用vim这么长时间,现看到下边几句,对vim的认识提高一个台阶。呵呵~~

以下是选择区域内的内容:

ci[ 删除一对 [] 中的所有字符并进入插入模式
ci( 删除一对 () 中的所有字符并进入插入模式
ci< 删除一对 <> 中的所有字符并进入插入模式
ci{ 删除一对 {} 中的所有字符并进入插入模式
cit 删除一对 HTML/XML 的标签内部的所有字符并进入插入模式
ci” ci’ ci` 删除一对引号字符 (” 或 ‘ 或 `) 中所有字符并进入插入模式

注:如果想一起删除区域边界可把ciX中的i换成a;如果只是想选择这些区域可将ciX中的c改为v

———–
补充:ciw 删除当前单词并进入插入模式

Read More

Windows 下 alt+数字输入字符

2011-12-06 / 未分类 / 没有评论

今天无意中见到论坛上有人发个帖子说用alt+小键盘的数字能输入特殊字符的方法.

教大家一个打囍字的方法(只能用在论坛):
按住ALT,用小键盘输入数字“821206”,然后松开ALT就行了,不信,你试试

觉得挺好奇的, 后来找了下资料发现 Windows 按ALT之后输入字符的Unicode码就能打出相应的字符.

如果想要找某个子的Unicode编码的话, 可以Win+R输入charmap然后回车, 然后就能看到映射字符表了.如下图:

图中的红框内就是Unicode编码的十六进制数字, 转换成十进制然后在ALT状态下就能输入了.

比如上面的是0x819F, 转换成10进制就是33183;
然后在记事本中按住 ALT 用小键盘(一定要用小键盘哦)输入33183, 然后松开 ALT, “仧” 就打出来了.
挺好玩的哈.

Tags: ,
Read More

php反转包含中文的字符串

2011-11-11 / php / 没有评论

字符串翻转在日常开发中很少用到, 不过偶尔用到的时候就会觉得用中文真是个悲剧, 如果是英文的话,直接 strrev()就好了, 但是中文就会乱码.

以下是本人收集的几个反转包含中文字符串的函数:

/**
 * 翻转字符串 支持中文 使用preg_match
 * @param string $string 要翻转的字符串
 * return 翻转后的字符串
 */
function str_revers($string) {
	preg_match_all('/./us', $string, $array);
	return implode('', array_reverse($array[0]));
}
/**
 * 使用mb函数翻转字符串 支持中文 仅支持utf8 gbk需修改
 * @param string $string 要翻转的字符串
 * return 翻转后的字符串
 */
function str_revers1($string) {
	$string_length = mb_strlen($string, 'UTF-8');
	$r = '';
	for($i = $string_length - 1; $i >= 0; $i--) {
		$r .= mb_substr($string, $i, 1, 'UTF-8');
	}
	return $r;
}
/**
 * 翻转字符串 支持utf8
 */
function str_revers2($string) {
	$len = strlen($string);
	for($i = 0; $i < $len; $i++) {
		$char = $string{0};
		if(ord($char) > 127) {
			$i++;
			if($i < $len) {
				$arr[] = substr($string, 0, 3);
				$string = substr($string, 3);
			}
		} else {
			$arr[] = $char;
			$string = substr($string, 1);
		}
	}
	return implode('', array_reverse($arr));
}
Tags: , , ,
Read More

欢迎使用 WordPress 3.2.1 for SAE

2011-10-28 / 未分类 / 1 条评论

欢迎使用 WordPress for SAE。如果您看到这篇文章,表示您的Blog已经在SAE安装成功。您可以编辑或者删除它,然后开始您的博客!

WordPress for SAE 技术支持博客:http://wp4sae.sinaapp.com。请关注此博客,以及时获取最新信息。
如果您在使用WordPress for SAE的过程中,有任何疑问、意见或建议,请到技术支持博客提出,我们将会尽快为您解答。

WordPress 3.2.1 for SAE 具有以下特性:

  1. 数据库主从分离,提升性能,节省云豆消耗
  2. 轻量的Memcache缓存模块,加快网页显示速度的同时减少资源消耗,为您节省云豆。
  3. 已内置urlrewrite规则,用户设置固定链接时只需要在控制板中设置一下即可,无需再修改appconfig(.htaccess)配置
  4. 附件直接上传到Storage,支持图片附件的缩略图生成。
  5. 相较于旧版WordPress for SAE,自本版本起完善邮件发送功能。仅需在WP-Mail-SMTP插件中正确设置SMTP服务器,即可使用邮件发送功能。
  6. 删除主题、插件在线安装功能。由于SAE不支持本地代码目录写入,该功能暂时无法支持。

WordPress 3.2.1 for SAE 已经为您集成了以下插件,您可以到根据您的需求在控制板中启用您所需要的插件:

  1. Add To Any: 分享插件,可以在您的文章结尾添加分享按钮,一键分享到新浪微博、twitter、facebook等网站,但对国内网站支持较少
  2. JiaThis:同样是分享插件,功能不如Add To Any强大,但是对国内网站如新浪微博、腾讯微博、人人等支持比较全。
  3. Akismet:WordPress内置插件,用于防拉圾评论,使用说明见: http://wp4sae.sinaapp.com/2011/05/akismet-introduce/
  4. Google Analytics for WordPress:为网站添加Google Analytics统计代码。
  5. Google XML Sitemaps:生成网站sitemap,并自动提交到Google, Bing和Ask.com
  6. Lightbox 2:无刷新显示原始图片
  7. SI CAPTCHA Anti-Spam:为评论、登录等添加验证码
  8. WordPress Importer:数据导入插件,方便BLOG迁移
  9. WP-CodeBox:代码高亮插件,给程序员们用的
  10. WP-Mail-SMTP:邮件SMTP服务器设置,设置过邮件SMTP之后,网站的发邮件功能才能正常使用(注册用户等操作时网站需要发送邮件)。为保证邮件发送成功率,推荐大家使用新浪邮箱发送邮件。
  11. Social Medias Connect:提供wordpress与其它社交媒体网站的连接登陆及文章同步、评论同步转发功能。支持Twitter、新浪微博、腾讯微博、搜狐微博、网易微博、豆瓣、饭否、Follow5。
Read More