一个简单的文件缓存模型

在众多nosql产品横行的时代,文件缓存有什么用呢,大量文件读写效率问题,文件锁的问题,都是很讨厌的,但是还是有地方可以用到,小型的系统,或者没有提供nosql的空间,文件缓存还是非常有用的,具体代码如下,注释丰富。 继续阅读“一个简单的文件缓存模型”

用php读取验证码图片里的字符

听说过可以用程序读取验证码里的字符,一直不知道实现方法,这两天找到一个php写的类,可以读取比较规整的验证码图片里的数字,分享一下,后面有附件下载。

先讲一下原理,gd库里有个函数imagecolorat(resource,x,y),可以获取指定像素的RGB值,关键点就在这里,如果验证码图片做的比较简单,有固定RGB的背景,比如白色,字体大小和位置又相对固定,就可以分析出来。

一张图片从像素的角度看,实际上就是一个二维数组,每个像素点都有RGB值,过滤掉背景点(置0),留下字符所占位的像素点(置1),这样就可以得到一个只有0|1两个值的二维数组,如果打印这个二维数组,就会发现1组成的形状正好是图片里的字符,接下来要做的就是,按照字符所在位置和宽高,从上往下,从左到右,读取每个字符的特征码,如果只有数字的话,特征码就只有0-9,加上字母的话,也就是30来个特征码,不算多,拿图片里读取出来的特征码和已存在的特征码进行比对,就能得到具体的字符了。 继续阅读“用php读取验证码图片里的字符”

Spreadsheet Excel Reader小应用

Spreadsheet Excel Reader,php版的读excel文件类,很不错的东西,导入excel数据需要用到。

稍微讲一下用法。

先实例化

$data = new Spreadsheet_Excel_Reader();

载入excel文件,注意文件名,保证php读的时候关闭此excel

$data->read(‘dict.xls’);

读取详细信息:

echo ‘总页数=’.count($data->sheets);
echo ‘总行数=’.$data->sheets[0][‘numRows’];// 第一页总行数
echo ‘列数=’.count($data->sheets[0][‘cells’][1]);// 第一页第一行列数。注:表格里的行列都是从1开始计数
echo ‘第一个单元格内容=’.$data->sheets[0][‘cells’][1][1];// 左上角第一个单元格内容

类和test详见附件:

reader

strlen mb_strlen iconv_strlen区别

strlen应该不用多讲了,返回字符串长度,多字节字符在不同编码下会有不同的结果,比如中文在utf8编码下可能返回3,而在ascII编码下可能返回2。

mb_strlen和iconv_strlen看起来好像没什么区别,都是返回对应编码字符的长度,都有第二个默认参数charset,实际还是有区别的。

首先,mb_strlen需要mbstring支持,没开启这个扩展肯定是不能用的。而iconv_strlen不依赖mbstring。

其次,iconv_strlen在指定第二个参数charset的情况下,要求被计算的字符串也必须是相同的编码,否则返回false,在不指定charset情况下,使用默认字符集,其计算结果依赖于当前字符集,比如ascII编码下,返回值和strlen同。

结论是,在开启mbstring扩展的前提下,计算多字节字符串长度,优先使用mb_strlen,并指定第二个参数charset。

非要使用iconv_strlen,要确保第一个参数字符集和第二个参数保持一致。

二次加密,数据校验PHP

用于二次加密,数据校验,也许md5已经足够了,不过在用户密码字段里,还是会经常看到这样的md5串: e10adc3949ba59abbe56e057f20f883e,经常开测试账号的人你懂的。

<?php
$txt = “123456”;// 原文
echo “txt={$txt}\r\n”;
$key = “keyword”;// 密钥,最好用ord后127以内的字符,且不要有字符重复
$encrpt = md5($txt);// md5后的密文
echo “md5={$encrpt}\r\n”;

$j = 0;
$lk = strlen($key);
$lt = strlen($encrpt);

for($i = 0;$i < $lt;$i++){
$j %= $lk;
$sum = ord($encrpt[$i]) + ord($key[$j]);// 逐位拼接密钥
$encrpt[$i] = dechex($sum % 16);// 对16求余后生成新的16进制数,并替换对应位置字符
$j++;
}
echo “encrpt={$encrpt}”;
?>

swfupload上传文件范例

swfupload,上传文件都喜欢用这个,可以做到无刷新提交文件,也能做出准确的上传进度条,用户体验上是比file控件要好多了,但是实质上,还是通过http上传,后面还是要通过动态脚本,比如php进行处理,经常遇到的大文件超时的问题,还是会有的。

swfupload

附件是一个完整的例子,采自网上,做了些修改,主要修改地方如下:

index.php的js里定义了一个objname的全局变量,这个变量在下面的js以及../swfupload/swfupload.js里都有用到,这个swfupload.js里有定义提交到php端file控件名,也就是php接收FIELS数组的key,原先是写死的,这个可能不方便。其他基本没什么变动。