1、[2012-03-14] discuz可逆的加解密函数,安全,高效,md5,sha1等不可逆。
/**
* 对字符串进行加密和解密
* @param <string> $string
* @param <string> $operation DECODE 解密 | ENCODE 加密
* @param <string> $key 当为空的时候,取全局密钥
* @param <int> $expiry 有效期,单位秒
* @return <string>
*/
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
$ckey_length = 4;
$key = md5($key != '' ? $key : getglobal('authkey'));
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if($operation == 'DECODE') {
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
} else {
return $keyc.str_replace('=', '', base64_encode($result));
}
}
2、[2012-03-14] PHP中的glob()函数
array glob ( string $pattern [, int $flags ] )
eg:
<?php
foreach (glob("*.txt") as $filename) {
echo "$filename size " . filesize($filename) . "\n";
}
?>
输出:
funclist.txt size 44686
funcsummary.txt size 267625
quickref.txt size 137820
//glob()函数应用,删除目录下所有文件
function rmrf($dir) {
foreach (glob($dir) as $file) {
if (is_dir($file)) {
rmrf("$file/*");
rmdir($file);
} else {
unlink($file);
}
}
}
3、[2012-03-14] 向远程服务器发送数据,有哪些函数?
fsocketopen(), curl(), file_get_contents()
4、[2012-03-14] rawurlencode与urlencode函数
其PHP 手册描述为:
rawurlencode -- 按照 RFC 1738 对 URL 进行编码
描述
string rawurlencode ( string str )返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 RFC 1738 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。例如,如果你想在 FTP 的 URL 中包含密码:
例子 1. rawurlencode() 示例 1
|
或者,如果你想通过 URL 的 PATH_INFO 构成部分去传递信息:
例子 2. rawurlencode() 示例 2
|
urlencode -- 编码 URL 字符串
描述
string urlencode ( string str )返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不同。此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页:
例子 1. urlencode() 示例
|
注意:小心与 HTML 实体相匹配的变量。像 &、© 和 £ 都将被浏览器解析,并使用实际实体替代所期待的变量名。这是明显的混乱,W3C 已经告诫人们好几年了。参考地址:http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2 PHP 通过 arg_separator .ini 指令,支持将参数分割符变成 W3C 所建议的分号。不幸的是大多数用户代理并不发送分号分隔符格式的表单数据。较为简单的解决办法是使用 & 代替 & 作为分隔符。你不需要为此修改 PHP 的 arg_separator。让它仍为 &,而仅使用 htmlentities(urlencode($data)) 对你的 URL 进行编码。
例子 2. urlencode() 与 htmlentities() 示例
|
urlencode和rawurlencode的区别
上面的图中有测试结果,urlencode把空格转成+号,而rawurlencode把空格转成%20
不仅仅是这些,有些时候文件的名字中有空格,如 http://www.test.com/123 abc.jpg
这样的网址是能访问的,只要123 abc.jpg在网站根目录存在。
不过中间有空格有时候容易导致网址缺少掉空格后面的部分,特别是网址比较长的时候,复制的人以为是两段话。或者双击选中,肯定不会包括空格后面的部分了。
这是我们就需要对空格进行转码,用urlencode可以吗? 答案是不可以!
urlencode把空格转成+号,而+号作为文件名来访问资源时,是不会自动转成空格的,就导致访问不到资源。
这是就要用到 rawurlencode ,%20 放在访问资源的网址中时,是能被识别成空格的。这就是它们之间的区别。
5、[2012-03-15] 为什么session_start()前不能用输出?
http数据包分头和内容
session_start 是要在响应的http头里面增加session相关数据的
但是如果你在session_start之前有输出
PHP就已经结束了对http头部分的处理, 开始输出http内容部分
这个时候你再加头的信息已经没有意义了
6、 [2012-03-15] iconv与mb_convert_encoding函数
在使用这个函数进行字符串编码转换时,需要注意,如果将utf-8转换为gb2312时,可能会出现字符串被截断的情况发生。此时可以使用以下方法解决:
1 | $str =iconv( 'utf-8' , "gb2312//TRANSLIT" , file_get_contents ( $filepath )); |
即在第二个参数出添加红色字部分,表示:如果在目标编码中找不到与源编码相匹配的字符,会选择相似的字符进行转换。此处也可以使用://IGNORE 这个参数,表示忽略不能转换的字符。
ignore的意思是忽略转换时的错误,如果没有ignore参数,所有该字符后面的字符串都无法被保存。
mb_convert_encoding这个函数是用来转换编码的。原来一直对程序编码这一概念不理解,不过现在好像有点开窍了。不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。
做一个GBK To UTF-8:
1 | <?php |
2 | header( "content-Type: text/html; charset=Utf-8" ); |
3 | echo mb_convert_encoding( "妳係我的友仔" , "UTF-8" , "GBK" ); |
4 | ?> |
string iconv ( string in_charset, string out_charset, string str )注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。
一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数。
1 | $content = iconv( "GBK" , "UTF-8″, $content ); |
2 | $content = mb_convert_encoding( $content , "UTF-8″, " GBK"); |
7、[2012-03-16] linux下查看内存使用
我们通过free命令查看机器空闲内存时,会发现free的值很小。这主要是因为,在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。
所以 空闲内存=free+buffers+cached=total-used(buffers/cache磁盘缓存的大小)
8、[2012-03-16] PHP 的命令行模式
CLI SAPI 模块有以下三种不同的方法来获取要运行的 PHP 代码:
-
让 PHP 运行指定文件。
php my_script.php php -f my_script.php
以上两种方法(使用或不使用 -f 参数)都能够运行给定的 my_script.php 文件。可以选择任何文件来运行,指定的 PHP 脚本并非必须要以 .php 为扩展名,它们可以有任意的文件名和扩展名。
-
在命令行直接运行 PHP 代码。
php -r 'print_r(get_defined_constants());'
在使用这种方法时,请注意外壳变量的替代及引号的使用。
Note:
请仔细阅读以上范例,在运行代码时没有开始和结束的标记符!加上 -r 参数后,这些标记符是不需要的,加上它们会导致语法错误。
-
通过标准输入(stdin)提供需要运行的 PHP 代码。
以上用法提供了非常强大的功能,使得可以如下范例所示,动态地生成 PHP 代码并通过命令行运行这些代码:
$ some_application | some_filter | php | sort -u >final_output.txt
除此之外,还有另一个方法将 PHP 用于外壳脚本。可以在写一个脚本,并在第一行以 #!/usr/bin/php 开头,在其后加上以 PHP 开始和结尾标记符包含的正常的 PHP 代码,然后为该文件设置正确的运行属性(例如:chmod +x test)。该方法可以使得该文件能够像外壳脚本或 PERL 脚本一样被直接执行。
#!/usr/bin/php
<?php
var_dump($argv);
?>
9、[2012-03-16] microtime()函数与应用
echo microtime(); =>0.31535300 1331913226;
应用:microtime() 对脚本的运行计时
/**
* Simple function to replicate PHP 5 behaviour
*/
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
// Sleep for a while
usleep(100);
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "Did nothing in $time seconds\n";
10、[2012-03-17] is_dir is_file file_exists 三者区别
php中用来判断文件是否存在的两个函数
is_file 只判断文件是否存在
<?php
var_dump(is_file('a_file.txt')) . "\n"; //bool(true)
var_dump(is_file('/usr/bin/')) . "\n"; //bool(false)
var_dump(file_exists('/usr/bin/')) . "\n"; //bool(true)
file_exists 判断文件是否存在或者是目录是否存在
is_dir 判断目录是否存在.
is_file更快 而 file_exists较为安全,PV在100W以下的网站可以不用考虑,直接 is_file