备忘日志【一】

来源:互联网 发布:唐湘龙 知乎 编辑:程序博客网 时间:2024/06/06 06:50

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

<?php
echo '<a href="ftp://user:'rawurlencode('foo @+%/'
),
     
'@ftp.example.com/x.txt">'
;
?>

或者,如果你想通过 URL 的 PATH_INFO 构成部分去传递信息:

例子 2. rawurlencode() 示例 2

<?php
echo '<a href="http://example.com/department_list_script/'
,
    
rawurlencode('sales and marketing/Miami'), '">'
;
?>

urlencode -- 编码 URL 字符串

描述

string urlencode ( string str )

返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不同。此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页:

例子 1. urlencode() 示例

<?php
echo '<a href="mycgi?foo='urlencode($userinput), '">'
;
?>

注意:小心与 HTML 实体相匹配的变量。像 &amp、&copy 和 &pound 都将被浏览器解析,并使用实际实体替代所期待的变量名。这是明显的混乱,W3C 已经告诫人们好几年了。参考地址:http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2 PHP 通过 arg_separator .ini 指令,支持将参数分割符变成 W3C 所建议的分号。不幸的是大多数用户代理并不发送分号分隔符格式的表单数据。较为简单的解决办法是使用 &amp; 代替 & 作为分隔符。你不需要为此修改 PHP 的 arg_separator。让它仍为 &,而仅使用 htmlentities(urlencode($data)) 对你的 URL 进行编码。

例子 2. urlencode() 与 htmlentities() 示例

<?php
echo '<a href="mycgi?foo='htmlentities(urlencode($userinput)), '">'
;
?>

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
2header("content-Type: text/html; charset=Utf-8");
3echo 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 代码:

  1. 让 PHP 运行指定文件。

    php my_script.phpphp -f my_script.php

    以上两种方法(使用或不使用 -f 参数)都能够运行给定的 my_script.php 文件。可以选择任何文件来运行,指定的 PHP 脚本并非必须要以 .php 为扩展名,它们可以有任意的文件名和扩展名。

  2. 在命令行直接运行 PHP 代码。

    php -r 'print_r(get_defined_constants());'

    在使用这种方法时,请注意外壳变量的替代及引号的使用。

    Note:

    请仔细阅读以上范例,在运行代码时没有开始和结束的标记符!加上 -r 参数后,这些标记符是不需要的,加上它们会导致语法错误。

  3. 通过标准输入(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 whileusleep(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

原创粉丝点击