存档

文章标签 ‘PHP’

【PHP】在header命令前的输出有可能会导致header命令失效

2011年1月29日 无风的飘逸 没有评论

如题:在header命令前的输出有可能会导致header命令失效

之前写的一个程序出错了,经过检查发现,原因是我在header命令前有输出一段测试代码,

在部分空间因为启用了php_output_buffering 所以不会出现这样的错误

但是搬到新空间之后,由于新空间没有这项设置,所以错误发生了

Share
分类: PHP 标签: , , ,

收集:php-mcrypt加密模块的用法

2010年12月7日 无风的飘逸 1 条评论

PHP程序员们在编写代码程序时,除了要保证代码的高性能之外,还有一点是非常重要的,那就是程序的安全性保障。PHP除了自带的几种加密函数外,还有功能更全面的PHP加密扩展库McryptMhash

其中,Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密,也可以密文还原。PHP加密扩展库Mcrypt的算法和加密模式

Mcrypt库支持20多种加密算法和8种加密模式,具体可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来显示,结果如下:

Mcrypt 支持的算法有:cast-128 gost rijndael-128 twofish arcfour cast-256 loki97 rijndael-192 saferplus wake blowfish-compat des rijndael-256 serpent xtea blowfish enigma rc2 tripledes

Mcrypt支持的加密模式有:cbc cfb ctr ecb ncfb nofb ofb stream

这些算法和模式在应用中要以常量来表示,写的时候加上前缀MCRYPT_和MCRYPT_来表示,如下面Mcrypt应用的例子:

DES算法表示为MCRYPT_DES;
ECB模式表示为MCRYPT_MODE_ECB;

PHP加密扩展库Mcrypt应用

先看一个例子,了解Mcrypt的工作流程,再来看看部分流程使用的函数:

  1. <?php
  2. $str = "我的名字是?一般人我不告诉他!";
  3. //加密内容
  4. $key = "key:111";
  5. //密钥
  6. $cipher = MCRYPT_DES;
  7. //密码类型
  8. $modes = MCRYPT_MODE_ECB;
  9. //密码模式
  10. $iv = mcrypt_create_iv(mcrypt_get_iv_size ($cipher,$modes),MCRYPT_RAND);//初始化向量
  11. echo "加密明文:".$str."<p>";
  12. $str_encrypt = mcrypt_encrypt($cipher, $key,$str,$modes,$iv);
  13. //加密函数
  14. echo "加密密文:".$str_encrypt." <p>";
  15. $str_decrypt = mcrypt_decrypt($cipher, $key,$str_encrypt,$modes,$iv);
  16. //解密函数
  17. echo "还原:".$str_decrypt;
  18. ?>

运行结果:

加密明文:我的名字是?一般人我不告诉他!
加密密文: 锍盌?]鸴?q攦軄L 笑 郺葄"簻 黙
还原:我的名字是?一般人我不告诉他!

<1> 由例子中可看到,使用PHP加密扩展库Mcrypt对数据加密和解密之前,首先创建了一个初始化向量,简称为iv。由 $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$modes),MCRYPT_RAND);可见创建初始化 向 量需要两个参数:size指定了iv的大小;source为iv的源,其中值MCRYPT_RAND为系统随机数。

<2>函数mcrypt_get_iv_size($cipher,$modes)返回初始化向量大小,参数cipher和mode分别指算法和加 密模式。

<3> 加密函数$str_encrypt = mcrypt_encrypt($cipher,$key,$str,$modes,$iv); 该函数的5个参数分 别如下:cipher——加密算法、key——密钥、data(str)——需要加密的数据、mode——算法模式、 iv——初始化向量

<4>解密函数 mcrypt_decrypt($cipher,$key,$str_encrypt,$modes,$iv); 该函数和加密函数的参数几乎 一样,唯一不同的是data,也就是说data为需要解密的数据$str_encrypt,而不是原始数据$str。

注:加密和解密函数中的参数cipher、key和mode必须一一对应,否则数据不能被还原。

安装
此安装主要针对Linux系统

首先要下载三个软件,分别是

libmcrypt-2.5.8.tar.gz

下载地址:http://sourceforge.net/project/showfiles.php?group_id=87941&package_id=91774&release_id=487459

mhash-0.9.9.tar.gz

下载地址:http://sourceforge.net/project/showfiles.php?group_id=4286&package_id=4300&release_id=645636

mcrypt-2.6.8.tar.gz

下载地址:http://sourceforge.net/project/showfiles.php?group_id=87941&package_id=91948&release_id=642101

【几篇文章和在一起的,下面特别重视libmcrypt,但是我发现安装mcrypt时候需要解决对libmcrypt还有mhash的依赖,这些好解决,不行yum一下就可以了】

# tar -xvf libmcrypt-X.X.X.tar
# cd libmcrypt-X.X.X
# ./configure

现在你应该已经把libmcrypt作为一个共享组件了(但不是一个PHP的共享组件)。运行命令:

# ldconfig

它将使得共享对象可以在C/C++开发中被使用。下面把mcrypt动态组件编译到PHP中。首先,你需要PHP-devel 包中包含的 'phpize‘ 命令。

当你当前运行的PHP中已经有了 PHP-devel 后,输入:

# cd ext/mcrypt
# phpize
# aclocal
# ./configure
# make clean
# make
# make install

现在php的安装目录下面应该有了mcrypt.so 的文件,在 /etc/php.ini 添加:

extension=mcrypt.so

然后重启一下apache,这样我们就已经将mcrypt功能安装成功了。

特别注意:

1、phpize需在解压后的源码包下执行,执行后生成configure脚本

2、运行./configure时,如果提示

configure: error: Cannot find php-config. Please use --with-php-config=PATH
请使用:

./configure --with-php-config=/php-install-path/bin/php-config #而不是使用php.ini

Share
分类: PHP 标签: ,

linux通过重新编译php来安装php-soap

2010年2月4日 无风的飘逸 3 条评论
首先安装完php后最好保留当时安装的文件,比如我的路径/export1/soft
cd php-5.1.6/ext/soap
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --enable-soap
make
make install
编译后的soap.so文件保存在了/usr/local/php/lib/php/extensions/no-debug-non-zts-20050922目录下
修改php.ini文件
  手工修改:查找/usr/local/webserver/php/etc/php.ini中的extension_dir = "./"
  修改为extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20050922/"
  并在此行后增加如下,然后保存:
  extension = "soap.so"
重新启动apache,ok 我们就已经能看到扩展的soap模块了。
如果还要扩展别的模块可以一次类推,这里还有点要说明,如果做了zend,php.ini文件是在/usr/local/php/etc下的,但是我们这边重新编译后,它回放到/usr/local/php/lib下。所以这里要注意一下。
Share
分类: Linux 技术 标签: , ,

排序算法

2009年7月19日 无风的飘逸 1 条评论

在计算机科学与数学中,一个排序算法是一种能将一串资料依照特定排序方式的一种算法。最常用到的排序方式是数值顺序以及字典顺序。有效的排序算法在一些算法(例如搜寻算法与合并算法)中是重要的,如此这些算法才能得到正确解答。排序算法也用在处理文字资料以及产生人类可读的输出结果。基本上,排序算法的输出必须遵守下列两个原则:

  1. 输出结果为递增序列 (递增是针对所需的排序顺序而言)
  2. 输出结果是原输入的一种排列、或是重组

虽然排序算法是一个简单的问题,但是从计算机科学发展以来,已经有大量的研究在此问题上。举例而言,气泡排序在1956年就已经被研究。虽然大部分人认为这是一个已经被解决的问题,有用的新算法仍在不断的被发明。

Share
分类: 学习 标签: ,

冒泡排序

2009年7月19日 无风的飘逸 没有评论

冒泡排序的基本思路
1、排序方法
     将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。因为类似冒泡的一个动作,所以取名为冒泡排序
(1)初始
     R[1..n]为无序区。

(2)第一趟扫描
     从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);对于每对气泡(R[j+1],R[j]),若R[j+1].key<R[j].key,则交换R[j+1]和R[j]的内容。
     第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[1]上。

(3)第二趟扫描
     扫描R[2..n]。扫描完毕时,"次轻"的气泡飘浮到R[2]的位置上……
     最后,经过n-1 趟扫描可得到有序区R[1..n]
  注意:
     第i趟扫描时,R[1..i-1]和R[i..n]分别为当前的有序区和无序区。扫描仍是从无序区底部向上直至该区顶部。扫描完毕时,该区中最轻气泡飘浮到顶部位置R[i]上,结果是R[1..i]变为新的有序区。

2、冒泡排序过程示例
     对关键字序列为49 38 65 97 76 13 27 49的文件进行冒泡排序的过程【参见动画演示】

3、排序算法
(1)分析
     因为每一趟排序都使有序区增加了一个气泡,在经过n-1趟排序之后,有序区中就有n-1个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行n-1趟排序。
     若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为此,在下面给出的算法中,引入一个布尔量exchange,在每趟排序开始前,先将其置为FALSE。若排序过程中发生了交换,则将其置为TRUE。各趟排序结束时检查exchange,若未曾发生过交换则终止算法,不再进行下一趟排序。

(2)具体算法
http://www.zouqingshui.net/?p=884

Share
分类: 学习 标签: ,

【见证】PHP冒泡排序算法,完美解释 By Svein Joe

2009年7月18日 无风的飘逸 2 条评论

<?php
/**
* 本示例文件可直接运行,如需要看结果请将其放在你的网站根目录下,并访问 http://你的网站/BubbleSort.php
* 这是一个很常见的排序算法,它的名字叫冒泡排序,这是一种最简单的排序算法。
* 本算法可对数字进行排序,也可以对字符串进行排序
* 看懂它的好处:你可以很牢固地掌握循环的用法。
* 以“//”开头的行为注释行(不包括“//”之前的部分),以“/*”开头,并以“*/”结尾的若干行也是注释,注释语句是不会被执行的。
*
* @param 传入的参数为一个待排序的数组 $str
* @return 返回参数为排序完成后的数组 $str
*/
function BubbleSort($str)
//定义一个名为BubbleSort的函数,它有一个参数叫$str,这个参数必须是一个数组,这个数组里包含需要排序的一系列字符。
{
for ($i=0;$i<count($str);$i++) //count($str)的功能为统计数组中的元素数量,并返回这个数量值
//第一层循环,外层循环,由于冒泡排序的原理为,每次都找最小(或每次都找最大,本例是演示每次都找最小的情况)的那个字符,找出一个最小(“大”)的字符算一次循环
{
for ($j=count($str)-2;$j>=$i;$j--)
//内层循环,本次循环控制找最小(“大”)数的操作,由于每次要找出最大的数,必须拿一个数和每一个数对比,所以也是一个内层的循环操作
{
if($str[$j+1]<$str[$j])
//比较,是$j+1位置的字符大,还是$j位置的字符比较大,如果$j位置的字符比较大,那么交换$str[$j+1]和$str[$j]以保证排列在前面的字符更小
{
$tmp = $str[$j+1]; //交换两个位置的东西,需要三个空位才能完成,就像交换一杯可乐和一杯牛奶需要另一个空杯子一样,$tmp可以说就是空杯子
$str[$j+1]=$str[$j];//类似,有一杯牛奶,一杯可乐,我们想用牛奶杯装可乐,可乐杯装牛奶的话,就得进行这样的操作……
$str[$j]=$tmp;//整个交换的过程可以描述为:先将牛奶倒入空杯,再将可乐倒入牛奶杯,然后再将原来空杯里的牛奶倒入可乐杯
}

}//内层循环每执行一次,就会多找出一个“最小”的字符(除了前面循环中已经找过了的)

}//数组里有N个字符的话,循环就重复N-1次,这样才能完成排序
return $str; //将排序后的结果返回,返回后跳出函数体,$str变量在内存中消失,而BubbleSort($str)的值就是$str所返回的值
}//函数体定义完成标志我们称之为 end of function BubbleSort($str)

$str = array(3,6,1,5,9,0,4,6,11);//组出一个存放随机序列的若干数字的数组
print_r(BubbleSort($str)); //调用函数体
?>

Share
分类: PHP, 学习 标签: ,