LDAP是什么
LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用,不过根据组织者的需要,它可以做得更加强大。
 
 
 
 
  LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。要特别注意的是,LDAP通常作为一个hierarchal数据库使用,而不是一个关系数据库。因此,它的结构用树来表示比用表格好。正因为这样,就不能用SQL语句了。

  简单说来,LDAP是一个得到关于人或者资源的集中、静态数据的快速方式。

LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,其实是一话号码簿,类似于我们所使用诸如NIS(Network Information Service)、DNS (Domain Name Service)等网络目录,也类似于你在花园中所看到的树木。
LDAP是一种特殊的数据库。但是LDAP和一般的数据库不同,明白这一点是很重要的。 LDAP对查询进行了优化,与写性能相比LDAP的读性能要优秀很多。
1.1 LDAP的存储规则
区分名(DN,Distinguished Name)
和自然界中的树不同,文件系统/LDAP/电话号码簿目录的每一片枝叶都至少有一个独一无二的属性,这一属性可以帮助我们来区别这些枝叶。
在文件系统中, 这些独一无二的属性就是带有完整路径的文件名。比如/etc/passwd,该文件名在该路径下是独一无二的。当然我们可以有/usr/passwd, /opt/passwd,但是根据它们的完整路径,它们仍然是唯一的。
在LDAP中,一个条目的区分名称叫做“dn”或者叫做区分名。在一个目录中这个名称总是唯一的。比如,我的dn是"uid=aghaffar, ou=People, o=developer.ch"。不可能有相同的dn,但是我们可以有诸如"uid=aghaffar, ou=Administrators, o=developer.ch"的dn。这同上面文件系统中/etc/passwd 和 /usr/passwd的例子很类似。
我们有独一无二的属性,在"ou=Administrators, o=developer.ch" 中uid和在"ou=People, o=developer.ch"中的uid。这并不矛盾。
CN=Common Name 为用户名或服务器名,最长可以到80个字符,可以为中文;
OU=Organization Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文;
O=Organization 为组织名,可以3—64个字符长
C=Country为国家名,可选,为2个字符长

LDAP目录以一系列“属性对”的形式来存储记录项,每一个记录项包括属性类型和属性值(这与关系型数据库用行和列来存取数据有根本的不同)。
mail = testmail@mccc.net
othermailbox = testmailother@mccc.com
givenname = givenname
sn = test sn
属性可添加,以下一个属性必须赋值:
objectclass=person (值为:person 或 server 或 organization 或 其他自定义的值)

2 Php如何操作LDAP
2.1 Php如何与LDAP连接和关闭
$ds=ldap_connect("ServerName")
ServerName是LDAP的服务器名,

例:
$ds=ldap_connect(“10.31.172.30:1000”)
返回值是:true 或 false

关闭连接
ldap_close($ds);

2.2 在php中如何搜索用户信息

$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
$justthese = array("cn","userpassword",”location”);
//搜索函数中的一个参数,要求返回哪些信息,
//以上传回cn,userpassword,location,这些都要求小写
$sr=ldap_search($ds,"o=jite", "cn=dom*",$justthese);
//第一个参数开启LDAP的代号
//第二个参数最基本的 dn 条件值 , 例:”o=jite,c=cn”
//第三个参数 filter 为布林条件,它的语法可以在 Netscape 站上找一份 dirsdkpg.pdf 档案.
// ’o’为组织名,’cn’ 为用户名,用户名可用通配符 ’*’
echo "domadmin姓氏有".ldap_count_entries($ds,$sr)." 个

";
//ldap_count_entries($ds,$sr)传回记录总数

$info = ldap_get_entries($ds, $sr);
//LDAP的全部传回资料
echo "资料传回 ".$info["count"]."笔:

";
for ($i=0; $i<$info["count"]; $i++) {
echo "dn为:". $info[$i]["dn"] ."
";
echo "cn为:". $info[$i]["cn"][0] ."
"; //显示用户名
echo "email为:". $info[$i]["mail"][0] ."

"; //显示mail
echo "email为:". $info[$i][“userpassword"][0] ."

"; //显示加密后的密码
}
2.3 添加用户
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
$r=ldap_bind($ds,"cn=domadmin,o=jite","password");
//系住一个管理员,有写的权限
// cn=domadmin,o=jite顺序不能变
$info["cn"]="aaa"; //必填
$info["userpassword"]="aaa";
$info["location"]="shanghai";
$info["objectclass"] = "person"; //必填person为个人,还有server…
ldap_add($ds, "cn=".$info["cn"].",o=jite", $info);
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.4 删除用户
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
ldap_bind($ds,"cn=domadmin,o=jite","password");
//绑定管理员,有删除的权限
$dn="cn=dingxf,o=jite";
ldap_delete($ds, $dn);
//删除用户
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.5 修改用户资料
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
ldap_bind($ds,"cn=domadmin,o=jite","password");
//绑定管理员,有修改的权限
$dn="cn=dingxf,o=jite";
//用户dn
$info["userpassword"]="aaa"; //要修改的信息,放在数组变量中
$info["location"]="shanghaisdaf";

ldap_modify($ds, $dn , $info);
//修改函数
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.6 用户登录验证
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
if (ldap_bind($ds,"cn=dingxf,o=jite","dingxf")){
echo "验证通过";
}else{
echo "验证不通过";
}
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接




注:此方法比较简单,实用,它也有不足之处,如果不通过,ldap_bind()提示它自带的提示语:”Warning: LDAP: Unable to bind to server: Inappropriate authentication in /home/htdocs/jldl.net/ldap/test.php3 on line 16”进入讨论组讨论。

三年的大学生活,一切都随着毕业而结束,包括爱情。即将劳燕纷飞的情侣们在做最后的温存,而我,只能一个人静静的注视着这不属于我的一幕幕。因为,大学四年,我没有故事,准确地说,我没有真正谈过恋爱。

有人说过,大学里没有谈过恋爱的人是失败的,我没办法否认。
但我此时却感到心海翻腾似有千言万语待倾诉。

是的,我一直没有女朋友。说实话,不是我不想,而是我不能。许多个夜晚,特别是周末,当我孤独的端坐于自习室,而旁边是情侣们在卿卿我我,那一刻,那种滋味真的很难受。爱情是严肃而需要双方负责的,但恋爱却已经成了许多人炫耀的游戏。教室,操场,食堂,随处都会有这种激情的演绎。

没有女朋友的日子,我很孤独。看着周围的朋友们都接二连三的“遭遇”恋爱,我有种落伍的感觉。听着他们与女朋友说着甜言蜜语,我的心好酸好酸。我想,被爱的感觉真的很让人沉醉,有人爱真的很幸福。生命中有一个人为你默默守候,为你牵肠挂肚。在春风得意时,有人与你共饮庆功酒;在潦倒失意时,有人给你安慰和鼓励;在可以休闲的日子里,有人陪你游山玩水;在紧张繁忙的学习工作之余,有人静听你心灵深处的倾诉......拥有女朋友的感觉真好!而我,只能跟自己说话,跟自己交流,更多的时候,我是用文字来宣泄自己的情感。

我没有女朋友,但却为自己设计了一个女朋友。也许有一天,我会碰到她,那时才开启我爱情的心扉。我没有爱情,却对它有许多不深不浅的感悟。

几乎所有的人都拥有亲情和友情,却未必人人都拥有爱情。有的人始终徘徊在恋爱的十字路口,迷路似的屡试屡败,屡败屡试,仿佛在玩一种不间断的游戏。有的人只拥有一段丰满却没有骨骼的爱情,倒塌之后就再也无法垒起,独留下刻骨铭心的回忆和触之即痛的伤痕。爱情像一辆公汽,不断的有人上下。即使有一些固定的乘客,他们也在不时的调换座位。而除了公汽,毕竟还有许多人在步行或者骑一辆单薄的自行车。真正的爱情是那独自行驶的的士,它可以是专用的,从始点到终点都不会停下来让别人乘座。但是,并不是所有的人都坐得起。

我想找个女朋友,而且曾经那么的渴望,应该说我是比较自我陶醉的哪一种,我曾经天真地想,凭着我高大英俊的外表,还怕没人喜欢? 找个女朋友,或许我也有足够的资本。我也有三分帅气五分才气十二分热情,我有能力让她快乐如意,我也可以给她全心的爱和保护。我愿成为她的依靠,坚实的依靠。但是,我在感情上的懦弱让我至今孑然一身。即使我喜欢一个人,但还是天真地认为,喜欢一个人不一定要拥有,而不去向她表白。准确地说,喜欢我的女孩子也不是没有,但我所属的射手座注定了我追求完美的性格,而这往往并不是一件好事。我失去了很多,而很多是失去了才懂得要珍惜。正如一位女孩所说,我太过理想化,毕竟,卜拉图式的爱情在现实中没有生长的土壤。

这是我的悲哀。

我真的好想有一个女朋友。
1.厕所
厕所用多少次都不要钱,卫生纸也不要钱。所以多喝水,不仅润喉,还可以用免费的厕所(不过在包厢中有的才好),所以多用。

2.服务生
记住!服务生也是不要钱的!所以没事就按服务铃!反正他生气的话就告他,扣钱的也是他,所以多按。

3.杂志
杂志一间包厢有的放一本,有的放两本,可是一本用买的少说上百块, 所以顺走。

4.遥控器中的电池
基本上连电池不能放过,所以顺走。

5.逃生用器具
KTV中可能有一种防烟雾的袋子,一包好像4.5 百元价值不低,所以顺走。

6.麦克风
我不是说要顺走,而是换,就是你可以拿一比较烂的或是坏的换,因为KTV中的麦克风都不错啊!还有柜中有麦克风套,一包三个很好用,所以顺走。.

7.市内电话
打市内电话是不要钱的,所以尽管打,最好连电话都顺走。

8.点歌本
这个比较夸张,不过还是可行的。

9.抱枕
虽然有点脏,不过可以拿回家给小狗当床铺,顺走!不过记得要拿大包去装!

10.还有垃圾袋,里面一大堆垃圾,当然要顺走。

KTV省钱想法的补充意见:

1、点一杯咖啡,其实把咖啡喝完后,那套咖啡杯也要顺走,记得要双倍的奶油和砂糖,如果口感重的可以要3份,糖和奶油一定要顺走。

2、如果点的是可乐,要记得一个空罐大概也能值几毛钱,所以喝完了也要把罐子顺走(优先拿铝罐)

3、去KTV一定要带个空可乐罐到洗手间,把洗手液打满后,顺走。

4、KTV一定有消防设备,一般的消防水龙带都是几十块钱1米的,所以要顺走。

5、至于有的KTV有蜡烛、灭蚊剂、芳香剂,统统顺走。

6、点水果的时候一定要记得把牙签顺走。

7、如果是电脑点歌的KTV一定要把鼠标也顺走。

8、一般来说KTV的沙发也是真皮的,所以走的时候,可以把沙发的背面撕下一块,回去做个坐垫也不错啊,坚决顺走。

9、结帐的时候一定要开发票。能报销的话最好了,趁小姐不注意的话,整本的空发票最好也顺走。

10、如果小姐合你胃口,不要手软,严重顺走。
在这个世界上,只有不敢想、不敢做的事,却没有干不成的事!

请看,她,一个贫苦不堪的勤杂工,却因一次人前的难堪,一次刻骨铭心的受窘,竟然成为举世瞩目、无比富有的女中豪杰!

最初,她在一家大公司里,是工作在最底层的员工,每天的工作就是端茶倒水,清扫卫生,根本没有人注意她。一次,因为没带工作证,她被公司的门卫拦在门外,不准进入。她告诉门卫,自己确确实实是公司的员工,此次是为公司买办公用品去了。然而她好话说了一大堆,门卫仍然对她不屑一顾,不准她入内。这期间,她眼睁睁地看着那些年龄相仿、身着职业装的白领们先后进入了公司的大门,根本没有出示工作证。于是她问门卫:“这些人没有出示工作证,怎么也都进去了?”门卫用一种鄙视的目光上上下下打量了她一番,冷冷地一摆手,那意思就是说:“走远点,别烦我!”。好感到了莫大的羞辱,自尊心仿佛被门卫狠狠的踩在脚下,跺个稀巴烂!她看看自己寒酸的衣着,和手中推着脏兮兮的平板车,再看看那些衣着华丽、气质不凡的白领们,她的心被深深的刺痛了,骤然品尝到被人歧视的酸楚,她的心发跳、脸发烫,浑身颤抖。这时,就在这时,一个誓言,在她的心头轰然炸响:我一定要创造奇迹,成为万人瞩目的富姐,成为举世闻名的强人!让这种阳辱永远的埋藏地下!

从此以后,她开始利用一切机会来充实自己。每一天,她第一个来公司,最后一个离开。她分秒必争,将别人随随便便丢掉的时间都花在了学习和工作上。很快,她就脱颖而出了。在同一批骋用者中,她第一个做了业务代表。接着她又依靠超人的努力,成为这家跨国公司中国区总经理!她学历并不高,只有自考专科文凭,在中国的经理中被尊为“打工皇后”,后来,她又任微软公司中国公司的总经理。她,就是商界女杰吴士宏!

试想,如果当初,吴士宏没有改变命运的决心,没有为为富人的野心,或许她一辈子都是贫穷而卑微的勤杂工!

是野心,是无坚不摧的野心,铸就了辉煌!

这里所谓的野心,不是一种无根据的狂妄,而是一种人生在世的伟大理想,一定要实现的宏伟目标。

有了它,你才能克服一切自卑、自弃、激发出你的全部潜能!

有了它,你才能坚持不懈,不断学习和改进,以最快的速度完善自己!

有了它,你才会不畏艰难险阻,敢于创造出别人不敢、也不能创造出的奇迹。

有了它,你就会开拓出金光灿烂的财富之路。

不论你现在家境有多穷,地位有多低,都不要否自己,都不要失去凌云之志。出身贫寒的李嘉诚,当初比现在的你还穷,你又有什么理由继穷,不成为富翁呢?
我们年轻的时候,总是把创作冲动误以为是创作才华。
  我们年轻的时候,总是把对孤独的恐惧误以为是对婚姻的向往。
  
  于是,我们遇到一个人,我们以为找到爱情,我们结婚,然后,我们发现婚姻里的种种,继续过下去,或者爆发或者沉默着走出来。
  
  正如徐朗在回家的电梯中可以清楚知道未来整个晚上的所有细节,包括做饭时的所有细节,吃饭时的所有内容,所以他厌倦,他渴望激情,却没有足够的理由甚至勇气,以至于被妻子逼问给个理由离婚时,召集地说,那好,我们不离婚了。爱情呢,转移了,在一碗碗炸酱面,一部部电视剧中转移了。
  
  于是,他遇见了一个天使,一个收到中国移动首席金牌赞助的天使,拥有了10次和不同女人的相遇的机会,代表几乎所有寻找爱情的人心中的向往,可以和自己喜欢的所有类型的人相遇,交往,然后找到自己的幸福。只是,徐朗和他遇见的女人,一次次的在寂寞中寻找,在孤独中寻找安全感,渴望相伴,渴望温暖。
  
  走在北京的街头,擦肩而过都的时漂亮的女子,每一个笑容的后面,都有自己的故事,好比小宋佳想给自己的孩子找一个爸爸,却在收到徐朗细心体贴的宝贝小衣服,小鞋子之后,决定自己一个人生活;好比范冰冰尽管喜欢,却坚持自己的原则,在爱情面前选择退缩;好比宁静抓不住虚无缥缈的爱情,于是近乎于挑剔的去看房子,在所有的房地产商精心布置的表面下找出一个个漏洞;好比瞿颖把一只忠诚的狗当成全部的感情寄托;好比伊能静左考验右考验,把钥匙交给哪个不是随便的男人后,却迷失在自己的故事里,迷失在对安全感和旧情的感觉中。
  
  于是,正如我们所期盼的那样,徐朗大彻大悟般的回到自己的前妻哪里,仿佛看透爱情的表白,我最爱的还是你,话说到一半,终于不再穿紫色毛衣,换上了喜庆红色的妻子已经不再等待,一样的炸酱面,却是新人丈夫夸耀的资本。徐朗百转千回的吃完这碗代表熟悉的安全感的面条,明白了自己渴望的,依旧是摆脱孤独的安全感。
  
  看到他坐在公路旁边的护栏上,在冬日的阳光里微笑,心中却是对爱情的抗拒和不信任,我看到那么多在婚姻和爱情中转移的部分,有多少人,幸运的找到那份爱情,有多少人,坚持的终于那份承诺,有多少人,在孤独中苦苦的渴盼相伴,却发现自己在拥有之后失去那自由。
  
  最后,沈星的出现,焰火的绚烂,是为了大团圆的结局,为了我们心中对爱情不变的希望。
  
  很久没有走进电影院,去年最后的一个月,走进亚细亚,没有那么多的考虑,只是觉得要结婚了,应该这么做,于是,就和她结束734个日子的相恋,许下一个承诺,忽然发现自己失去了原来一个人自由的生活模式,两个人的日子,我不能还是一样的随心所以,于是,对于未来的日子,不知道如何坚守我们的爱情,心里还是充满对于孤单的害怕,充满对于自由的渴望。
  
  我一个人去超市,一个人逛街,一个人看电影,企图在一次次的短暂出走中找回我的自由,我变得给自己加上一层层的责任,变得越来越像父亲,变得,变得现在眼中含着泪光。
  
  我们依旧坚持,因为在我们心中有最深刻的对爱情、对家庭的渴望,不论是怎样的男人,家庭一定是他心中最柔软的一环,亲爱的,不管时间的流逝,我们都一样彼此相爱,好吗?
mount -t vfat /dev/sda /mnt/u

先到硬件浏器看是哪个。。。。然后再挂载。。
挂载ISO镜像:
mount -t iso9660 -o loop /home/xiangdong2/CentOS-5.2-i386-bin-DVD.iso /mnt/iso

卸载:
umount /mnt/iso/


FreeBsd:

mdconfig -a -t vnode -f  /data0/Centos/CentOS-5.2-x86_64-bin-DVD.iso -u 1 mount_cd9660 /dev/md1 /mnt/iso

先插入我们的外接USB的DVD,后看下:
ls -lart /dev
就会看到多一个:dvd->sr0,于是用mount命令如下:

     本文将演示如何使用php连接一个ldap服务器。具体的例子是连接到一个公共的ldap服务器并且进行搜索。这个例子模拟的是netscape communicator 4.*,通过自己的地址本连接到ldap资源。
ldap介绍

  可能不少人已经听说过ldap,但是却不了解它具体是什么东东和如何工作。在这里我将不会很详细地介绍ldap,只是对该协议做一个简介。

  ldap是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用,不过根据组织者的需要,它可以做得更加强大。

  ldap最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。要特别注意的是,ldap通常作为一个hierarchal数据库使用,而不是一个关系数据库。因此,它的结构用树来表示比用表格好。正因为这样,就不能用 sql语句了。

  简单说来,ldap是一个得到关于人或者资源的集中、静态数据的快速方式。

要求

   phpv.4(以前的版本也可以,不过没有经过测试),编译支持ladp,即使用编译时带--with-ldap公共的ldap目录。在例子中提供了两个。

例子概览

1.设置公共ldap服务器的信息
2.创建一个ldap查询
3.连接到ldap服务器
4.如果连接成功,处理查询
5.格式化输出
6.关闭连接
7.设计搜索界面的html表格
8.显示结果

设置公共ldap服务器的信息

  我们要做的第一件事情是定义所有欲搜索的ldap服务器的信息

"ldap_name" = 新的ldap项目的名字
"ldap_server" = 新的ldap项目的ip地址或者主机名
"ldap_root_dn" = 新的ldap项目的根的辨识名

<?php

$ldap_name[0] = "netscape net center";
$ldap_server[0] = "memberdir.netscape.com";
$ldap_root_dn[0] = "ou=member_directory,o=netcenter.com";

$ldap_name[1] = "bigfoot";
$ldap_server[1] = "ldap.bigfoot.com";
$ldap_root_dn[1] = "";



//如果没有选择服务器的话将它设置为0
if(!$server_id)
$server_id=0;

?>

建立ldap查询

  前面已经提到,ldap查询与sql查询是不一样的。因此,语句要受到一定的限制,以下是一个基本的例子。

//create query $ldap_query = "cn=$common";

  在我们的例子中,“cn”是我们要进行搜索的属性,而$common是由搜索的form中得到的字符串变量。ldap的查询语句语句可使用通配符‘*’。例如‘$stanley’将可以找出‘dan stanley’。

连接到ldap服务器

  以下的函数连接到一个ldap资源,并且将连接的识别号赋给一个变量,就好象连接到一个通常的数据库一样,例如mysql。

<?php

//连接到ldap
$connect_id = ldap_connect($ldap_server[$server_id]);

?>

  在我们的例子中,“$connect_id”是连接的识别号,$ldap_server是可能的ldap服务器数组,而$server_id是由搜索表格得到的ldap服务器变量。

如果连接成功,处理查询

   如果连接成功的话,我们将得到一个有效的ldap连接识别号,这样我们就可以处理查询。

<?php

if($connect_id)
{
//认证
$bind_id = ldap_bind($connect_id);

//执行搜索
$search_id = ldap_search($connect_id, $ldap_root_dn[$server_id], $ldap_query);

//将结果集合分配给一个数组
$result_array = ldap_get_entries($connect_id, $search_id);
}
else
{
//显示连接错误
echo "could not connect to ldap server: $ldap_server[$server_id]";
}

?>

  一旦我们与ldap服务器建立好连接,我们就必须进行认证。php在连接大多数的数据库时,都是通过发送用户名和密码来进行的。不过,在ldap中,认证是未知的,直到进行一个bind操作。在我们的例子中,“$bind_id”是绑定连接的标识符。我们是通过匿名绑定到公共的ldap服务器的。因此,在执行ldap_bind()时,只使用连接识别号就可以了,无需其它的参数。

  在经过认证后(这里是匿名的),我们就可以使用ldap_search()函数来执行查询,产生的$search_id是我们搜索的连接识别符。

  然后,我们使用ldap_get_entries()函数将结果集赋给$result_array变量。这样我们能够以逻辑的方式排列信息,以便显示。
格式化输出

  在执行完ldap搜索后,返回的数据是以查找的顺序排列的。不过我们在排序时没有sql这样方便,使用order by语句就可以了。通常多数公共的ldap目录都没有标准的大小规范。排序是基于字符的ascii值,我们必须将字符全部格式化为小写,以便按字母的顺序输出。

  要特别注意的是,返回的ldap结果集是一个多维的数组。因此,我们脚本中的$result_array的结构如下:

$result_array[0]["cn"] [0] = "dannie stanley"
["dn"] [0] = "uid=dannie,dc=spinweb.net"
["givenname"][0] = "dannie"
["sn"] [0] = "stanley"
["mail"] [0] = "danspam@spinweb.net"
$result_array[1]["cn"] [0] = "michael reynolds"
["dn"] [0] = "uid=michael,dc=spinweb.net"
["givenname"][0] = "michael"
["sn"] [0] = "reynolds"
["mail"] [0] = "michaelspam@spinweb.net"

  数据以这种格式存放的原因是每个属性都可能有超过一个值(象树的结构)。例如,如果我的名字是‘dannie’,我还可以在ldap中增加一些属性,例如:

$result_array[0]["cn"] [0] = "dannie stanley"
["dn"] [0] = "uid=dannie,dc=spinweb.net"
["givenname"][0] = "dannie"
["givenname"][0] = "dan"
["sn"] [0] = "stanley"
["mail"] [0] = "danspam@spinweb.net"

  在我们的搜索中,我们只关心每个属性的首个值,因此除了dn只有一个值外,其它我们只使用每个属性中序号为0的值。以下就是属性和它们含义的简单列表:

"cn" = common name
"dn" = distinguished name
"givenname" = first name
"sn" = last name
"mail" = email地址

<?php

//如果搜索成功,将结果排序
if($result_array)
{
for($i=0; $i {
$format_array[$i][0] = strtolower($result_array[$i]["cn"][0]);
$format_array[$i][1] = $result_array[$i]["dn"];
$format_array[$i][2] = strtolower($result_array[$i]["givenname"][0]);
$format_array[$i][3] = strtolower($result_array[$i]["sn"][0]);
$format_array[$i][4] = strtolower($result_array[$i]["mail"][0]);
}

//排序数组
sort($format_array, "sort_string");

for($i=0; $i {
$cn = $format_array[$i][0];
$dn = $format_array[$i][1];
$fname = ucwords($format_array[$i][2]);
$lname = ucwords($format_array[$i][3]);
$email = $format_array[$i][4];

if($dn && $fname && $lname && $email)
{
$result_list .= "$fname $lname";
$result_list .= " <$email>
";
}
elseif($dn && $cn && $email)
{
$result_list .= "<a href='/"ldap://$ldap_server[$server_id]/$dn/"'>$cn</a>";
$result_list .= " <a href='/"mailto:$email/"'>$email</a>
";
}
}
}
else
{
echo "result set empty for query: $ldap_query";
}

?>
  在我们的例子中,$format_array是我们建立的新数组,里面包括有查询的结果,并且被格式化用作输出。首先循环$result_array中的每个元素,并且将它分配给一个两维的数组用作排序。同时我们使用strtolower()函数将所有的值变为小写。

  接着,我们使用php自带的一个称为sort()的函数进行排序。首个参数是要排序的数组,另一个是要执行的排序类型,该类型是由php的文档定义的。由于我们根据字符串排序,我们使用“sort_string”。

  第三,我们循环已经格式化好的数组,并且将它分配给一个名字为$result_list的输出字符,该字符包含了html描述。要特别注意的是,在超链接中,我使用的是ldap的url格式。这个格式的例子类似:href="ldap://ldap.domain.net/uid=dannie,dc= domain.net"。

关闭连接

  现在我们所有的数据已经包含在$result_list中了,我们可以安全地关闭ldap的连接。

<?php

//关闭连接
ldap_close($connect_id);

定制搜索界面的html表格

  最后,我们要定制搜索用的html表格,它是用来给用户执行搜索的。

//定制表格
echo " <center><form action='"$php_self"' method='"get"'>";
echo "search in:<select name='"server_id"'>"; //循环以建立select选项 for($i=0; $i<count($ldap_name); <br $i++)> echo "<option selected value='"$i"'>".$ldap_name[$i]."</option>"; echo "</select>
";
echo "search for:<input name='"common"' type='"text"'>";
echo "<input name='"lookup"' type='"submit"' value='"go"'>
";
echo "(you can use * for wildcard searches, ex. * stanley will find all stanleys)
";
echo "</form></center>";

?>

  代码中的$php_self是一个全局的常量,代表的是脚本页面自身,其中的循环是用来通过我们的$ldap_name变量创建select选项。

显示结果

  现在所有的工作已经完成了,我们将打印出结果集。如果没有符合的结果,将会显示"no results"的信息。

<<?>php

//显示结果
if($result_list)
{
echo " <center><table border='"1"' cellpadding='"10"' cellspacing='"0"'
bgcolor="#ffffea" width="450"> <tbody><tr><td>$result_list</td></tr>
</tbody></table></center>";
}
else
echo "no results";

?>

源代码

  以下是完整的源代码,只要将它剪切并粘贴到一个html文档,就可以尝试一下了。

<?php

$ldap_name[0] = "netscape net center";
$ldap_server[0] = "memberdir.netscape.com";
$ldap_root_dn[0] = "ou=member_directory,o=netcenter.com";

$ldap_name[1] = "bigfoot";
$ldap_server[1] = "ldap.bigfoot.com";
$ldap_root_dn[1] = "";

//如果没有选择服务器的话将它设置为0
if(!$server_id)
$server_id=0;

//建立查询
$ldap_query = "cn=$common";

//连接到ldap
$connect_id = ldap_connect($ldap_server[$server_id]);

if($connect_id)
{
//认证
$bind_id = ldap_bind($connect_id);

//执行搜索
$search_id = ldap_search($connect_id, $ldap_root_dn[$server_id], $ldap_query);

//将结果集合分配给一个数组
$result_array = ldap_get_entries($connect_id, $search_id);
}
else
{
//显示连接错误
echo "could not connect to ldap server: $ldap_server[$server_id]";
}

//如果搜索成功,将结果排序
if($result_array)
{
for($i=0; $i {
$format_array[$i][0] = strtolower($result_array[$i]["cn"][0]);
$format_array[$i][1] = $result_array[$i]["dn"];
$format_array[$i][2] = strtolower($result_array[$i]["givenname"][0]);
$format_array[$i][3] = strtolower($result_array[$i]["sn"][0]);
$format_array[$i][4] = strtolower($result_array[$i]["mail"][0]);
}

//排序数组
sort($format_array, "sort_string");

for($i=0; $i {
$cn = $format_array[$i][0];
$dn = $format_array[$i][1];
$fname = ucwords($format_array[$i][2]);
$lname = ucwords($format_array[$i][3]);
$email = $format_array[$i][4];

if($dn && $fname && $lname && $email)
{
$result_list .= "<a href='/"ldap://$ldap_server[$server_id]/$dn/"'>$fname $lname</a>";
$result_list .= " <$email>
";
}
elseif($dn && $cn && $email)
{
$result_list .= "<a href='/"ldap://$ldap_server[$server_id]/$dn/"'>$cn</a>";
$result_list .= " <<a href='/"mailto:$email/"'>$email</a>
";
}
}
}
else
{
echo "result set empty for query: $ldap_query";
}

//关闭连接
ldap_close($connect_id);

//定制表格
echo " <center><form action='"$php_self"' method='"get"'>";
echo "search in:<select name='"server_id"'>"; //循环以建立select选项 for($i=0; $i echo "<option selected value='"$i"'>".$ldap_name[$i]."</option>"; echo "</select>
";
echo "search for:<input name='"common"' type='"text"'>";
echo "<input name='"lookup"' type='"submit"' value='"go"'>
";
echo "(you can use * for wildcard searches, ex. * stanley will find all stanleys)
";
echo "</form></center>";

//显示结果
if($result_list)
{
echo " <center><table border='"1"' cellpadding='"10"' cellspacing='"0"'
bgcolor="#ffffea" width="450"> <tbody><tr><td>$result_list</td></tr>
</tbody></table></center>";
}
else
echo "no results";
}

?>
对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕。别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap。可是Linux就不同了,它有.gz、.tar.gz、tgz、bz2、.Z、.tar等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了。本文就来对这些常见的压缩文件进行一番小结,希望你下次遇到这些文件时不至于被搞晕:)

  在具体总结各类压缩文件之前呢,首先要 弄清两个概念:打包和压缩。打包是指将一大堆文件或目录什么的变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要区分这两个概念呢?其实这源于Linux中的很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你就得先借助另它的工具将这一大堆文件先打成一个包,然后再就原来的压缩程序进行压缩。

  Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲tar命令的基本用法:

  tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:

  # tar -cf all.tar *.jpg
  这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。

  # tar -rf all.tar *.gif
  这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
# tar -uf all.tar logo.gif
  这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

  # tar -tf all.tar
  这条命令是列出all.tar包中所有文件,-t是列出文件的意思

  # tar -xf all.tar
  这条命令是解出all.tar包中所有文件,-t是解开的意思

  以上就是tar的最基本的用法。为了方便用户在打包解包的同时可以压缩或解压文件,tar提供了一种特殊的功能。这就是tar可以在打包或解包的同时调用其它的压缩程序,比如调用gzip、bzip2等。

  1) tar调用gzip

  gzip是GNU组织开发的一个压缩程序,.gz结尾的文件就是gzip压缩的结果。与gzip相对的解压程序是gunzip。tar中使用-z这个参数来调用gzip。下面来举例说明一下:

  # tar -czf all.tar.gz *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,包名为all.tar.gz

  # tar -xzf all.tar.gz
  这条命令是将上面产生的包解开。

  2) tar调用bzip2

  bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。与bzip2相对的解压程序是bunzip2。tar中使用-j这个参数来调用gzip。下面来举例说明一下:

  # tar -cjf all.tar.bz2 *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用bzip2压缩,生成一个bzip2压缩过的包,包名为all.tar.bz2

  # tar -xjf all.tar.bz2
  这条命令是将上面产生的包解开。
3)tar调用compress

  compress也是一个压缩程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z结尾的文件就是bzip2压缩的结果。与compress相对的解压程序是uncompress。tar中使用-Z这个参数来调用gzip。下面来举例说明一下:

  # tar -cZf all.tar.Z *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用compress压缩,生成一个uncompress压缩过的包,包名为all.tar.Z

  # tar -xZf all.tar.Z
  这条命令是将上面产生的包解开

  有了上面的知识,你应该可以解开多种压缩文件了,下面对于tar系列的压缩文件作一个小结:

  1)对于.tar结尾的文件

  tar -xf all.tar

  2)对于.gz结尾的文件

  gzip -d all.gz
  gunzip all.gz

  3)对于.tgz或.tar.gz结尾的文件

  tar -xzf all.tar.gz
  tar -xzf all.tgz

  4)对于.bz2结尾的文件

  bzip2 -d all.bz2
  bunzip2 all.bz2

  5)对于tar.bz2结尾的文件

  tar -xjf all.tar.bz2

  6)对于.Z结尾的文件

  uncompress all.Z

  7)对于.tar.Z结尾的文件

  tar -xZf all.tar.z

  另外对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们:

  1)对于.zip

  linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

  # zip all.zip *.jpg
  这条命令是将所有.jpg的文件压缩成一个zip包
# unzip all.zip
  这条命令是将all.zip中的所有文件解压出来

  2)对于.rar

  要在linux下处理.rar文件,需要安装RAR for Linux,可以从网上下载,但要记住,RAR for Linux
不是免费的;可从http://www.rarsoft.com/download.htm下载RAR for Linux 3.2.0,然后安装:

  # tar -xzpvf rarlinux-3.2.0.tar.gz
  # cd rar
  # make

mkdir -p /usr/local/bin
mkdir -p /usr/local/lib
cp rar unrar /usr/local/bin
cp rarfiles.lst /etc
cp default.sfx /usr/local/lib


  这样就安装好了,安装后就有了rar和unrar这两个程序,rar是压缩程序,unrar是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

  # rar a all *.jpg
  这条命令是将所有.jpg的文件压缩成一个rar包,名为all.rar,该程序会将.rar 扩展名将自动附加到包名后。

  # unrar e all.rar
  这条命令是将all.rar中的所有文件解压出来

  到此为至,我们已经介绍过linux下的tar、gzip、gunzip、bzip2、bunzip2、compress、 uncompress、zip、unzip、rar、unrar等程式,你应该已经能够使用它们对.tar、.gz、.tar.gz、.tgz、. bz2、.tar.bz2、.Z、.tar.Z、.zip、.rar这10种压缩文件进行解压了,以后应该不需要为下载了一个软件而不知道如何在 Linux下解开而烦恼了。而且以上方法对于Unix也基本有效。

  本文介绍了linux下的压缩程式tar、gzip、gunzip、bzip2、bunzip2、compress、uncompress、 zip、unzip、rar、unrar等程式,以及如何使用它们对.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、.Z、. tar.Z、.zip、.rar这10种压缩文件进行操作。

PHP5中的cookie和session详解

1. PHP的COOKIE

cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。

1.1 设置cookie:
   可以用 setcookie() 或 setrawcookie() 函数来设置 cookie。也可以通过向客户端直接发送http头来设置.
1.1.1 使用setcookie()函数设置cookie:
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
    name:   cookie变量名
    value:   cookie变量的值
    expire:  有效期结束的时间,
    path:    有效目录,
    domain: 有效域名,顶级域唯一
    secure:  如果值为1,则cookie只能在https连接上有效,如果为默认值0,则http和https都可以.
例子:
$value = 'something from somewhere';

setcookie("TestCookie", $value); /* 简单cookie设置 */
setcookie("TestCookie", $value, time()+3600); /* 有效期1个小时 */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录 /~rasmus,有效域名example.com及其所有子域名 */
?>

设置多个cookie变量: setcookie('var[a]','value');用数组来表示变量,但他的下标不用引号.这样就可以用$_COOKIE[‘var’][‘a’]来读取该COOKIE变量.

1.1.2. 使用header()设置cookie;
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
后面的参数和上面列出setcookie函数的参数一样.
比如:

$value = 'something from somewhere';
header("Set-Cookie:name=$value");


1.2 Cookie的读取:

直接用php内置超级全局变量 $_COOKIE就可以读取浏览器端的cookie.
上面例子中设置了cookie"TestCookie",现在我们来读取:

print $_COOKIE['TestCookie'];

COOKIE是不是被输出了?!


1.3 删除cookie
只需把有效时间设为小于当前时间, 和把值设置为空.例如:
setcookie("name","",time()-1);
用header()类似.

1.4 常见问题解决:

1) 用setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格.也可能你的文档使从其他字符集转换过来,文档后面可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符).解决的办法就是使你的文档不出现这种情况.还有通过使用ob_start()函数有也能处理一点.
2) $_COOKIE受magic_quotes_gpc影响,可能自动转义
3) 使用的时候,有必要测试用户是否支持cookie



1.5 cookie工作机理:


有些学习者比较冲动,没心思把原理研究,所以我把它放后面.
a) 服务器通过随着响应发送一个http的Set-Cookie头,在客户机中设置一个cookie(多个cookie要多个头).
b) 客户端自动向服务器端发送一个http的cookie头,服务器接收读取.


HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=something from somewhere; path=/
Expires: Thu, 19 Nov 2007 18:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/html


这一行实现了cookie功能,收到这行后
Set-Cookie: TestCookie=something from somewhere; path=/
浏览器将在客户端的磁盘上创建一个cookie文件,并在里面写入:

TestCookie=something from somewhere;
/

这一行就是我们用setcookie('TestCookie','something from somewhere','/');的结果.也就是用header('Set-Cookie: TestCookie=something from somewhere; path=/');的结果.




--------------------------------------------------------------------------------



2. PHP的Session

session使用过期时间设为0的cookie,并且将一个称为session ID的唯一标识符(一长串字符串),在服务器端同步生成一些session文件(可以自己定义session的保存类型),与用户机关联起来.web应用程序存贮与这些session相关的数据,并且让数据随着用户在页面之间传递.

访问网站的来客会被分配一个唯一的标识符,即所谓的会话 ID。它要么存放在客户端的 cookie,要么经由 URL 传递。

会话支持允许用户注册任意数目的变量并保留给各个请求使用。当来客访问网站时,PHP 会自动(如果 session.auto_start 被设为 1)或在用户请求时(由 session_start() 明确调用或 session_register() 暗中调用)检查请求中是否发送了特定的会话 ID。如果是,则之前保存的环境就被重建。

2.1 sessionID的传送

2.1.1 通过cookie传送sessin ID

    使用session_start()调用session,服务器端在生成session文件的同时,生成session ID哈希值和默认值为PHPSESSID的session name,并向客户端发送变量为(默认的是)PHPSESSID(session name),值为一个128位的哈希值.服务器端将通过该cookie与客户端进行交互.
  session变量的值经php内部系列化后保存在服务器机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID的coolie进行对应交互.
    即服务器自动发送了http头:header('Set-Cookie: session_name()=session_id(); path=/');
即setcookie(session_name(),session_id());
   当从该页跳转到的新页面并调用session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到,则新建一个数据集.

2.1.2 通过URL传送session ID
只有在用户禁止使用cookie的时候才用这种方法,因为浏览器cookie已经通用,为安全起见,可不用该方法.
xxx,也可以通过POST来传递session值.

2.2 session基本用法实例

// page1.php
session_start();
echo 'Welcome to page #1';
/* 创建session变量并给session变量赋值 */
$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();

// 如果客户端使用cookie,可直接传递session到page2.php
echo '
page 2';

// 如果客户端禁用cookie
echo '
page 2';
/*
默认php5.2.1下,SID只有在cookie被写入的同时才会有值,如果该session
对应的cookie已经存在,那么SID将为(未定义)空
*/
?>

// page2.php
session_start();
print $_SESSION['animal']; // 打印出单个session
var_dump($_SESSION); // 打印出page1.php传过来的session值
?>




2.3 使用session函数控制页面缓存.
   很多情况下,我们要确定我们的网页是否在客户端缓存,或要设置缓存的有效时间,比如我们的网页上有些敏感内容并且要登录才能查看,如果缓存到本地了,可以直接打开本地的缓存就可以不登录而浏览到网页了.

   使用session_cache_limiter('private');可以控制页面客户端缓存,必须在session_start()之前调用.
更多参数见http://blog.chinaunix.net/u/27731/showart.php?id=258087的客户端缓存控制.

    控制客户端缓存时间用 session_cache_expire(int);单位(s).也要在session_start()前调用.

   这只是使用session的情况下控制缓存的方法,我们还可以在header()中控制控制页面的缓存.

2.4 删除session

要三步实现.
session_destroy();                                      // 第一步: 删除服务器端session文件,这使用
setcookie(session_name(),'',time()-3600);  // 第二步: 删除实际的session:
$_SESSION = array();                                  // 第三步: 删除$_SESSION全局变量数组
?>

2.5 session在PHP大型web应用中的使用

对于访问量大的站点,用默认的session存贮方式并不适合,目前最优的方法是用数据库存取session.这时,函数bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )就是提供给我们解决这个问题的方案.
该函数使用的6个函数如下:


1.   bool open() 用来打开会话存储机制,

2.   bool close() 关闭会话存储操作.


3.  mixde read() 从存储中装在session数据时使用这个函数


4.   bool write() 将给定session ID的所有数据写到存储中


5.   bool destroy() 破坏与指定的会话ID相关联的数据


6.   bool gc()  对存储系统中的数据进行垃圾收集


例子见php手册session_set_save_handler() 函数.
如果用类来处理,用
session_set_save_handler(
   array('className','open'),
   array('className','close'),
   array('className','read'),
   array('className','write'),
   array('className','destroy'),
   array('className','gc'),
)
调用className类中的6个静态方法.className可以换对象就不用调用静态方法,但是用静态成员不用生成对象,性能更好.

2.6 常用session函数:

bool   session_start(void); 初始化session
bool   session_destroy(void): 删除服务器端session关联文件。
string session_id() 当前session的id
string session_name() 当前存取的session名称,也就是客户端保存session ID的cookie名称.默认PHPSESSID。
array  session_get_cookie_params() 与这个session相关联的session的细节.
string session_cache_limiter() 控制使用session的页面的客户端缓存
ini    session_cache_expire() 控制客户端缓存时间
bool   session_destroy()     删除服务器端保存session信息的文件
void   session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节
bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )定义处理session的函数,(不是使用默认的方式)
bool session_regenerate_id([bool delete_old_session]) 分配新的session id


2.7 session安全问题
攻击者通过投入很大的精力尝试获得现有用户的有效会话ID,有了会话id,他们就有可能能够在系统中拥有与此用户相同的能力.
因此,我们主要解决的思路是效验session ID的有效性.


if(!isset($_SESSION['user_agent'])){
   $_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}

/* 如果用户session ID是伪造 */
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
   session_regenerate_id();
}
?>


2.8 Session通过cookie传递和通过SID传递的不同:
在php5.2.1的session的默认配置的情况下,当生成session的同时,服务器端将在发送header set-cookie同时生成预定义超级全局变量SID(也就是说,写入cookie和抛出SID是等价的.),当$_COOKIE['PHPSESSID']存在以后,将不再写入cookie,也不再生成超级全局变量SID,此时,SID将是空的.



2.9 session使用实例

/**
* 效验session的合法性
*
*/
function sessionVerify() {
   if(!isset($_SESSION['user_agent'])){
       $_SESSION['user_agent'] = MD5($_SERVER['REMOTE_ADDR']
       .$_SERVER['HTTP_USER_AGENT']);
   }
   /* 如果用户session ID是伪造,则重新分配session ID */
   elseif ($_SESSION['user_agent'] != MD5($_SERVER['REMOTE_ADDR']
   . $_SERVER['HTTP_USER_AGENT'])) {
       session_regenerate_id();
   }
}

/**
* 销毁session
* 三步完美实现,不可漏
*
*/
function sessionDestroy() {
   session_destroy();
   setcookie(session_name(),'',time()-3600);
   $_SESSION = array();
}
?>




注明:


   session 出现头信息已经发出的原因与cookie一样.
   在php5中,所有php session 的注册表配置选项都是编程时可配置的,一般情况下,我们是不用修改其配置的.要了解php的session注册表配置选项,请参考手册的Session 会话处理函数处.

您现在试听的是梁静茹的歌曲《可惜不是你》 如果喜欢就带您的朋友一起来听:)
http://video.baidu.com/v?ct=301989888&rn=20&pn=0&db=0&s=0&word=%B0%AE%CE%D2%BE%CD%B1%F0%C9%CB%BA%A6%CE%D2&z=0
php的substr函数截取字符串最后一位:




具体的使用可以看PHP的Manual中的function.substr.html。[/p]
yum是什么

   * yum = Yellow dog Updater, Modified
   * 主要功能是更方便的添加/删除/更新RPM包.
   * 它能自动解决包的倚赖性问题.
   * 它能便于管理大量系统的更新问题

[编辑]
yum特点

   * 可以同时配置多个资源库(Repository)
   * 简洁的配置文件(/etc/yum.conf
   * 自动解决增加或删除rpm包时遇到的倚赖性问题
   * 使用方便
   * 保持与RPM数据库的一致性

[编辑]
yum安装

   * CentOS自带(yum-*.noarch.rpm)

#rpm -ivh yum-*.noarch.rpm

   * 在第一次启用yum之前首先需要导入系统的RPM-GPG-KEY:

#rpm --import /usr/share/doc/centos-release-3(4)/RPM-GPG-KEY-CentOS-3(4)

[编辑]
yum指令

   * 注:当第一次使用yum或yum资源库有更新时,yum会自动下载所有所需的headers放置于/var/cache/yum目录下,所需时间可能较长.

[编辑]
rpm包的更新

   * 检查可更新的rpm包

#yum check-update

   * 更新所有的rpm包

#yum update

   * 更新指定的rpm包,如更新kernel和kernel source

#yum update kernel kernel-source

   * 大规模的版本升级,与yum update不同的是,连旧的淘汰的包也升级

#yum upgrade


[编辑]
rpm包的安装和删除

   * 安装rpm包,如xmms-mp3

#yum install xmms-mp3

   * 删除rpm包,包括与该包有倚赖性的包

#yum remove licq

   * 注:同时会提示删除licq-gnome,licq-qt,licq-text

[编辑]
yum暂存(/var/cache/yum/)的相关参数

   * 清除暂存中rpm包文件

#yum clean packages

   * 清除暂存中rpm头文件

#yum clearn headers

   * 清除暂存中旧的rpm头文件

#yum clean oldheaders

   * 清除暂存中旧的rpm头文件和包文件

#yum clearn 或#yum clearn all

   * 注:相当于yum clean packages + yum clean oldheaders


[编辑]
包列表

   * 列出资源库中所有可以安装或更新的rpm包

#yum list

   * 列出资源库中特定的可以安装或更新以及已经安装的rpm包

#yum list mozilla
#yum list mozilla*

   * 注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包

   * 列出资源库中所有可以更新的rpm包

#yum list updates

   * 列出已经安装的所有的rpm包

#yum list installed

   * 列出已经安装的但是不包含在资源库中的rpm包

#yum list extras

   * 注:通过其它网站下载安装的rpm包

[编辑]
rpm包信息显示(info参数同list)

   * 列出资源库中所有可以安装或更新的rpm包的信息

#yum info

   * 列出资源库中特定的可以安装或更新以及已经安装的rpm包的信息

#yum info mozilla
#yum info mozilla*

   * 注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包的信息

   * 列出资源库中所有可以更新的rpm包的信息

#yum info updates

   * 列出已经安装的所有的rpm包的信息

#yum info installed

   * 列出已经安装的但是不包含在资源库中的rpm包的信息

#yum info extras

   * 注:通过其它网站下载安装的rpm包的信息

[编辑]
搜索rpm包

   * 搜索匹配特定字符的rpm包

#yum search mozilla

   * 注:在rpm包名,包描述等中搜索

   * 搜索有包含特定文件名的rpm包

#yum provides realplay

[编辑]
增加资源库

   * 例如:增加rpm.livna.org作为资源库

   * 安装Livna.org rpms GPG key

#rpm --import http://rpm.livna.org/RPM-LIVNA-GPG-KEY

   * 检查GPG Key

# rpm -qa gpg-pubkey*

   * 显示Key信息

#rpm -qi gpg-pubkey-a109b1ec-3f6e28d5

   * (注:如果要删除Key,使用#rpm -e gpg-pubkey-a109b1ec-3f6e28d5)

http://fedora.linuxsir.org/main/?q=node/132

[quote]关于Fedora Core 5.0 通过Yum在线升级说明

作者:北南南北
来自:LinuxSir.Org
摘要:Yum 是Fedora 常用的在线升级工具,也是软件包管理工具之一;在以前我们有介绍软件包管理工具中有介绍过Yum的用法。现在把Fedora Core 5.0的一些Yum 源整理出来,供初学者参考;


目录

     1、Yum 的简单使用;
     2、Yum的图形前端yumex;
     3、Fedora Core 5.0 在线升级Yum源整理篇;
           3.1 Freshrpms.net 上的Yum 源;
           3.2 Atrpms.net 上的Yum 源;
           3.3 rpm.livna.org 上的Yum源;
           3.4 Dries.ulyssis.org 上的Yum 源;


++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++


1、Yum 的简单使用;

请参考《Fedora/Redhat 在线安装更新软件包,yum 篇 》


2、Yum的图形前端yumex;

您可以在线安装它,当然您要先用su切换到root身份执行;

[root@localhost beinan]# yum install yumex

然后运行yumex就可以点鼠标完成升级工作了。不过您得先设置好Yum的源;


3、Fedora Core 5.0 在线升级Yum源整理篇;


3.1 Freshrpms.net 上的Yum 源;

Freshrpms.net 是比较好的一个Yum 和apt源;我们在这里只说Yum的源吧;您可能在线安装;


[root@localhost beinan]# rpm -ivh http://ftp.freshrpms.net/pub/fre ... 1.1-1.fc.noarch.rpm

接着我们导入Freshrpms.net 的签名;

[root@localhost beinan]# rpm --import http://freshrpms.net/RPM-GPG-KEY-freshrpms




3.2 Atrpms.net 上的Yum 源;

首先,我们要改一下/etc/yum.repos.d目录中的 fedora-extras.repo 文件,加入下面一段;

[atrpms]
name=Fedora Core 5 - i386 - ATrpms
baseurl=http://dl.atrpms.net/fc5-i386/atrpms/stable

然后导入 Atrpms.net 的软件包签名;

[root@localhost beinan]# rpm --import http://ATrpms.net/RPM-GPG-KEY.atrpms

3.3 rpm.livna.org 上的Yum源;

[root@localhost beinan]# rpm -ivh http://rpm.livna.org/livna-release-5.rpm


3.4 Dries.ulyssis.org 上的Yum 源;

应该把下面的一段加在fedora-extras.repo文件中;
[dries]
name=Extra Fedora rpms dries - $releasever - $basearch
baseurl=http://ftp.belnet.be/packages/dries.ulyssis.org/fedora/fc5/$basearch/dries/RPMS/

如果您想下载安装 Dries.ulyssis.org上的RPM包,请直接访问;

http://ftp.belnet.be/packages/dries.ulyssis.org/fedora/fc5
By 北南南北 at 2006/03/26 - 21:44 | Fedora | Apt Yum Rpm | 基础入门 | 参与评论 | 24503 阅读
我一般不导入签名

把验证签名禁用了就可以了
By Anonymous at 周一, 2006/11/06 - 17:11 | 回复
怎么禁用啊?

怎么禁用啊?
By Anonymous at 周六, 2006/12/16 - 20:16 | 回复
写的很好啊,不过dries的签名文件忘记说了吧 ?

点击在新窗口中浏览此图片

台阶边的佛甲草。它是柔弱的,多汁的茎叶经不起践踏。但它可以是灿烂的,
     蜂蝶穿梭其间,不会错过生命的美丽。它也经常长在屋瓦上,显得颇有高度。
    写完这封信,我要感谢香榧老师。你见过我曾经的焦虑。正是与你的交流,
     让我借别人的眼,看清了一点自己,慢慢摆脱了焦虑。

                 不妨让自己再软弱一些

                                       ------答XX信



陈老师:

   我想每个人的生命过程中都会有低谷和困境的时候,每个人都有黑暗的一面,我现在最痛苦的是总是不由自主地走入黑暗之中,无法掌控自己。您是一个那么有力量的人,您是如何做到的呢?能分享一点给我指点迷津吗?谢谢。



XX君:


谢谢来信,谢谢你给我一个思考的机会。对陌生人提出这样的问题,是信任。这样的问题,也是我曾经面对、还将不断面对的问题。
请不要称我“老师”,直呼其名即可;或者叫“同学”,更妥贴。


我并不强大,并不那么有力量。
若干年以前,我曾经“强大”过。我以为自己聪明,以为自己有才,总觉得生活在欺负我,龙困浅滩,虎落平阳。我以苛刻的标准要求自己,必须这样,必须那样,力求完美。当愿望和目标无法迅速达成的时候,焦躁不安,怨天尤人;也痛恨自己,为何不能做得更好。
是的,每个人的生命过程中,都会有低谷和困境。“强大”的人更容易遭遇,因为他习惯让自己行走于巅峰,而把常人眼中的坦途,都视作沟壑。


“强大”的我如何面对低谷和困境?
我没有和家人和密友分担。在他们眼中的我,是一个事业成功的人。我在乎他们,在乎他们眼中的我,说到底是在乎自己。我靠高强度的体锻让自己咬牙度过难关。一天长跑六公里,接着游泳2000-3000米。


如果老板问:“你还有什么理由留在这家公司?”你会如何回答?而提问的老板,是几年前想尽办法,用甜言蜜语,各种许诺,把你从千里之外挖来的人,你又作何感想?为了这个千里之行,你几乎放弃了曾经拥有的一切,让旁人艳羡的一切,你又如何自处?在这样的时刻,你会不会后悔,会不会怨恨,会不会放弃?
都来不及。我选择的是“坚持”。


我对老板回答说:因为我的性格。我愿意在鲜花和掌声中谢幕,不愿在演出中途黯然退场。我想到的是一个同事,刚刚被排挤出公司,又突遇车祸,死于非命。


我坚持下来了。虽然我不想让亲人分担压力,但他们当然也分担了压力:不得不接受一个封闭、忧郁、暴躁、自私的我,一个不懂得去关心别人的我。
坚持下来就说明我强大吗?真的不是这样。


多年以后,我明白了:人不需要强大。不妨让自己更软弱一些。人更需要的是能心安理得,能接受自我。


何为有力和无力?何为强,何为弱?那个曾令山河变色、挥手之间左右万千臣民生死的“伟大领袖”,也有这样的时候:他在孤寂的夜里流泪,拉着卫士的手,求卫士多陪伴自己一刻。


所谓强,所谓弱,只是社会、他人、我们给自已设定的标准,是我们内心欲望的投射。当我们不了解自我的时候,就只能在这样的框框中苟活。


我们了解自己吗?我们有没有倾听自己内心的声音,触摸到自己真实的面容?为何要掌控自己,按照什么样的标准来掌控?


身处大自然的时候,觉得人类真是渺小。随处可见的一棵树,见识的风雨都多过我们;普普通通的一块石,就诞生于人类出现之前。骄妄的人们,误以为能把大自然随意改变,却不明白世界能让我们掌控的部分,其实很小很少。我们何不只做自己力所能及的事?为何不过能让自己心安理得的生活?


有个现代舞团,叫云门舞集,是台湾的文化传奇。创始人林怀民坚持理想的过程,并不总是风和日丽,其间云门一度解散。忆及往事,他云淡风轻:“年轻时我只知执着。后来我更明白自在。”


有坚持的勇气,有放弃的胸襟,有区分什么该坚持、什么该放弃、何时该坚持、何时该放弃、如何去坚持、如何去放弃的智慧,这样的智慧,只能从我们自身的内心获取。


我可以和你分享问题,但给不到你答案,也指点不了你的迷津。他人的经验,甚至你自己的经验,都不能成为依赖。你只能面对问题本身,了解它,了解自我,没有别的捷径。


取舍之间,当你更明白“舍”的时候,反而获取更多;
强弱之间,当你真正明白自己软弱的时候,反而更显“强大”。
生活经常给我们这样的悖论。


我自己做得还远远不够。我是一个软弱的人,一个平凡的人,甚至是一个愚蠢的人。因而时时警醒自己,做小事,把小事做好。我可以飞,但我必须落地栖枝。我不一定做大树,我可以做小草。尽量不违背自己的内心,真实地生活。
当我了解自己内心更多,未来的日子,也许我可以更自由。我相信:能“舍得”一切的时候,就是我最自在的时候。


不甘示弱是造成很多问题的根源。我们不妨让自己更软弱一些,或者说,让心更柔软一些,也许世界就会更好一些。我们也不妨让命运保留那么一点山重水复疑无路的不确定性,才有观赏柳暗花明又一村的闲情。


打这些字的时候,关了灯。让十六的月亮从窗边照进来,洒在书桌和沙发上。原来,可以不需要灯,即使是晚上。
祝假期心情愉快。


                                       chenxujun于南岭
欲望的爱换来绝望苦恋,所以,绝望的女人都有一个共性:都是情欲和执着惹的祸,那算不算是爱?



     能相爱的,不一定能在一起,也不一定应该在一起。有时正因为不能在一起,对爱人少了苛求,反而爱得更从容,更容易感受幸福和珍惜,这是你不愿意也要接受的爱的真相。



     爱一个人,是体现自己有没有能力抓紧幸福的机遇,因为人与人之间聚散有时却无期。人生多变,我们无法掌握一切,我们有条件学习抓紧的是情缘,心态和爱的质素,这些都是自我修养的范围,其它的,请留给上天,别累坏身心,妄想太多。



     爱得过累便要停下来。死守的爱最快消逝,瞒骗的爱不君子也嫌丑陋,占有的爱最暴力可耻,害怕失去的爱,不可能产生安全感。来来去去,还是爱得不够清廉自在,烦恼自寻。



     爱不是信命得来的侥幸,要付出和成长。



     量力而为,问心无愧,你将爱得心安理得没遗憾。
Debian How to 编译安装Apache
wget http://mirror.vmmatrix.net/apache/httpd/apache_1.3.34.tar.gztar apache_1.3.34.tar.gzcd apache_1.3.34
修改src/include/httpd.h 增大最大线程数

#define HARD_SERVER_LIMIT 1024

改成

#define HARD_SERVER_LIMIT 2560

保存退出编译apache

./configure \--prefix=/usr/local/share/vmail/apache \--enable-module=so \--enable-module=rewrite \--enable-shared=max \--htdocsdir=/usr/local/share/vmail/www \--server-uid=vmail \--server-gid=vmail &&make &&make install
启动服务

/usr/local/share/vmail/apache/bin/apachectl start
浏览:http://server-ip/

日志:/usr/local/share/vmail/apache/logs/error_log
CentOS 4.4 编译安装 apache 2.2.4(mod_ssl)+php 5.2.1 with Suhosin-Patch+mysql 5.0.33+Zend Optimizer v3.2.2+eaccelerator-0.9.5+phpmyadmin 2.10笔记 v1.2

v1.2 2007年2月12日 apache 更新为2.2.4版本,增加mod_ssl和openssl支持,增加apr和apr-util的编译, php更新为5.2.1,增加集成Suhosin补丁,mysql 更新为5.0.33, Zend Optimizer 更新为3.2.2,增加phpmyadmin.修改一些文字错误。

v1.0 2007年1月11日

先声明,我绝对是个Linux的菜鸟,以下的这些文字个人的安装笔记,是参考了网上许多高手的成功经验组合而成的,说实话我自己的东西不多 :)我想把这些经验写下来,既可以对其他跟我一样摸索的兄弟一个经验,也可以防止以后自己都忘记了,嘿嘿。

所以如果某个大虾看到我借用了你的资源,请你不要生气。也欢迎大家进行指点。

1.下载centos 4.4
我是下载的DVD版本,大家也可以下载服务器CD安装版本,其实都差不多。大家可以到这儿下载,速度很快的。
http://ftp.iasi.roedu.net/mirrors/centos.org/4.4/isos/i386/

下载后当然就刻录成光盘。我建议你刻录DVD啦,如果是菜鸟,也可以在图形界面进行学习,不会这么抓不住头脑。

2.1 安装CentOS4.4
作为服务器,不安装不需要的组件,所以在选择组件的时候,除了选择FTP SERVER外取消所有组件的选择。也不要选web服务器。因为我们后面要手动编译安装。

系统约定RPM包和源码包存放位置

RPM包和源码包存放位置 /usr/local/src
源码包编译安装位置(prefix) /usr/local/xxx
脚本以及维护程序存放位置 /usr/local/sbin
MySQL 数据库位置 /var/lib/mysql
Apache 网站根目录 /home/www
Apache 虚拟主机日志根目录 /data/logs/www
yum RPM包信息文件 /etc/yum.list

2.2 更新系统,此处我们使用up2date,先修改up2date镜像。

vi /etc/sysconfig/rhn/sources
我把源修改成这样了:

yum centos4-Base http://mirror.be10.com/centos/4/os/$ARCH/
yum centos4-Updates http://mirror.be10.com/centos/4/updates/$ARCH/
yum centos4-extras http://mirror.be10.com/centos/4/extras/$ARCH/
yum centos4-contrib http://mirror.be10.com/centos/4/contrib/$ARCH/
yum centos4-addons http://mirror.be10.com/centos/4/addons/$ARCH/
yum centos4-centosplus http://mirror.be10.com/centos/4/centosplus/$ARCH/
然后执行:

# up2date -l //列出更新
# up2date -uf //更新包括版本的所有程序。如果不包括内核,则用up2date -u
3、系统环境部署及调整

(1). 检查系统是否正常

# more /var/log/messages //检查有无系统内核级错误信息
# demesg //检查硬件设备是否有错误信息
# ifconfig //检查网卡设置是否正确
# ping www.163.com // 检查网络是否正常
(2). 关闭不需要的服务

# export LANG='en_US' //设置语言
# setup //选择启动的服务
进入system service 选项。
以space 键选定所需服务。
以下仅列出需要启动的服务,未列出的服务一律关闭:

crond
irqbalance 仅当服务器CPU为S.M.P架构或支持双核心、HT技术时,才需开启,否则关闭。
microcode_ctl
network
vsftpd
sshd
syslog

(3)、修改/etc/yum.repos.d/CentOS-Base.repo,将镜象站点地址改为在中国的镜象站点地址。不然我们通过yum安装软件速度会极慢。修改如下:

# CentOS-Base.repo
#
# This file uses a new mirrorlist system developed by Lance Davis for CentOS.
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.vmmatrix.net/CentOS/$releasever/os/$basearch/
http://mirror.be10.com/centos/$releasever/os/$basearch/
http://centos.hostlink.com.hk/$releasever/os/$basearch/
http://ftp.hostrino.com/pub/centos/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#released updates
[update]
name=CentOS-$releasever - Updates
baseurl=http://mirror.vmmatrix.net/CentOS/$releasever/os/$basearch/
http://mirror.be10.com/centos/$releasever/os/$basearch/
http://centos.hostlink.com.hk/$releasever/os/$basearch/
http://ftp.hostrino.com/pub/centos/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#packages used/produced in the build but not released
[addons]
name=CentOS-$releasever - Addons
baseurl=http://mirror.vmmatrix.net/CentOS/$releasever/os/$basearch/
http://mirror.be10.com/centos/$releasever/os/$basearch/
http://centos.hostlink.com.hk/$releasever/os/$basearch/
http://ftp.hostrino.com/pub/centos/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirror.vmmatrix.net/CentOS/$releasever/os/$basearch/
http://mirror.be10.com/centos/$releasever/os/$basearch/
http://centos.hostlink.com.hk/$releasever/os/$basearch/
http://ftp.hostrino.com/pub/centos/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
保存。

然后导入key升级相应yum数据

# rpm --import /usr/share/doc/centos-release-4/RPM-GPG-KEY-centos4
# yum list tee /etc/yum.list //读取yum list 数据,将其输出到 /etc/yum.list。
(4)、定时校正服务器时间

# yum install ntp
# crontab -e
0 23 * * * root /usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1
以上命令设置好后存盘。您的机器将在每天的23:00根据中国国家授时中心的NTP服务器时间自动校准时间。

(5). 对TCP/IP网络参数进行调整,加强抗SYN Flood能力

# echo 'net.ipv4.tcp_syncookies = 1' >> /etc/sysctl.conf //将net.ipv4.tcp_syncookies = 1写入sysctl.conf 文件
# sysctl -p //查看
(6)、FTP服务器的配置

vi /etc/vsftpd/vsftpd.conf
把anonymous_enable=YES注释掉不允许匿名登录。
把chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
前的注释去掉。
把ftpd_banner=*前的注释去掉。后面改成你的欢迎信息(这样设置可以避免显示ftp服务器的版本信息)
然后保存,service vsftpd start就可以了。

这时应当添加用户,因为root默认不能通过FTP方式登录。

# adduser username
# passwd userpassword
这样对于我们上传一些文件到系统中很方便。

4. 重新启动系统

# init 6
5. 使用 yum 程序安装所需开发包(以下为标准的 RPM 包名称)

# yum install gcc gcc-c++ gcc-g77 flex bison autoconf automake bzip2-devel zlib-devel ncurses-devel libjpeg-devel libpng-devel libtiff-devel freetype-devel pam-devel
# 这里我们将编译GD所必须的一些小软件比如libpng,libtiff,freetype,libjpeg等先用RPM的方式一并安装好,避免手动编译浪费时间,同时也能避免很多错误,这几个小软件的编译很麻烦。这几个小软件编译错误了,GD当然安装不了,php5的编译当然也没戏了。所以我们抓大放小,对这些小牛鬼蛇神采取快速简洁的方式进行安装。并且对服务器的性能也不能产生什么影响。

6. 源码编译安装所需包 (Source)
(1) GD2

# cd /usr/local/src
# wget http://www.boutell.com/gd/http/gd-2.0.33.tar.gz
# tar xzvf gd-2.0.33.tar.gz
# cd gd-2.0.33
# ./configure --prefix=/usr/local/gd2 --mandir=/usr/share/man //./configure 配置。
# make //make 是用来编译的,它从 Makefile 中读取指令,然后编译。
# make install //make install 是用来安装的,它也从 Makefile 中读取指令,安装到指定的位置。
(2) Apache 日志截断程序

# cd /usr/local/src
# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
# tar xzvf cronolog-1.6.2.tar.gz
# cd cronolog-1.6.2
# ./configure --prefix=/usr/local/cronolog
# make
# make install
(3) libxml 库程序

# cd /usr/local/src
# wget http://ftp.gnome.org/pub/gnome/sources/libxml2/2.6/libxml2-2.6.26.tar.gz
# tar zxvf libxml2-2.6.26.tar.gz
# cd libxml2-2.6.26
# ./configure --prefix=/usr/local/libxml2
# make
# make install
7、编译mysql 5.0.33

cd /usr/local/src
# wget http://mysql.oss.eznetsols.org/Downloads/MySQL-5.0/mysql-5.0.33.tar.gz
# tar xzvf mysql-5.0.33.tar.gz
# cd mysql-5.0.33
修改mysql 客户端最大连接数, 默认的只有100,远远达不到我们的要求。

# vi sql/mysqld.cc
搜索找到下面一行:

{"max_connections", OPT_MAX_CONNECTIONS,
"The number of simultaneous clients allowed.", (gptr*) &max_connections,
(gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,
0},
将其中的100改为1500, 当然小点也可以,根据你的需要来,不建议改的太大。

{"max_connections", OPT_MAX_CONNECTIONS,
"The number of simultaneous clients allowed.", (gptr*) &max_connections,
(gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 1500, 1, 16384, 0, 1,
0},
保存。

# CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/mysql --localstatedir=/var/lib/mysql --with-comment=Source --with-server-suffix=-Community-Server --with-mysqld-user=mysql --without-debug --with-big-tables --with-charset=latin1 --with-collation=latin1_swedish_ci --with-extra-charsets=all --with-pthread --enable-static --enable-thread-safe-client --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --without-innodb --without-ndb-debug --without-isam
配置成功会提示:

MySQL has a Web site at http://www.mysql.com/ which carries details on the
latest release, upcoming features, and other information to make your
work or play with MySQL more productive. There you can also find
information about mailing lists for MySQL discussion.

Remember to check the platform specific part of the reference manual for
hints about installing MySQL on your platform. Also have a look at the
files in the Docs directory.

Thank you for choosing MySQL!

// 注意 ,CHOST=”i686-pc-linux-gnu” CFLAGS=”-O3 -msse2 -mmmx -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer” CXXFLAGS=”-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer” 这个环境参数只针对intel P4 芯片,如果你的CPU是AMD的,注意不能使用。请查看相应的编译优化参数。否则程序会无法编译,即使编译成功也无法运行,嘿嘿。

# make
编译的时间可能会比较长,毕竟优化的比较厉害。

# make install
编译安装完成后执行后续操作:

# useradd mysql //添加 mysql 用户
# cd /usr/local/mysql
# bin/mysql_install_db --user=mysql
# chown -R root:mysql . //设置权限,注意后面有一个 "."
# chown -R mysql /var/lib/mysql //设置 mysql 目录权限
# chgrp -R mysql . //注意后面有一个 "."
# cp share/mysql/my-medium.cnf /etc/my.cnf
# cp share/mysql/mysql.server /etc/rc.d/init.d/mysqld //开机自动启动 mysql。
# chmod 755 /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# /etc/rc.d/init.d/mysqld start //启动 MySQL
# bin/mysqladmin -u root password "password_for_root"
# service mysqld stop //关闭 MySQL
8. 编译安装 Apache

# cd /usr/local/src
# wget http://www.ip97.com/apache.org/httpd/httpd-2.2.4.tar.gz
# tar zxvf httpd-2.2.4.tar.gz
# cd httpd-2.2.4
依次安装apr和apr-util

# cd srclib/apr
# ./configure --prefix=/usr/local/apr --enable-threads --enable-other-child USE=ipv6
# make && make install

# cd ../apr-util
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ --with-mysql=/usr/local/mysql
# make && make install

cd /usr/local/src/httpd-2.2.4
# CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/apache2 --enable-mods-shared=all --enable-deflate=shared --with-mysql=/usr/local/mysql --enable-cache --enable-file-cache --enable-mem-cache --enable-disk-cache --enable-static-support --enable-static-htpasswd --enable-static-htdigest --enable-static-rotatelogs --enable-static-logresolve --enable-static-htdbm --enable-static-ab --enable-static-checkgid --disable-cgid --disable-cgi --with-mpm=worker --with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/ --enable-ssl --with-ssl=/usr/include/openssl

# make
# make install
# echo '/usr/local/apache2/bin/apachectl start ' >> /etc/rc.local //将 apachectl 的调用加入到你的系统启动文件中。
注解:
./configure //配置源代码树
–prefix=/usr/local/apache2 //体系无关文件的顶级安装目录PREFIX ,也就Apache的安装目录。
–enable-module=so //打开 so 模块,so 模块是用来提 DSO 支持的 apache 核心模块
–enable-mods-shared=all //编译全部的模板,对于不需要我们可以在httpd.conf去掉。
–enable-cache //支持缓存
–enable-file-cache //支持文件缓存
–enable-mem-cache //支持记忆缓存
–enable-disk-cache //支持磁盘缓存
–enable-static-support //支持静态连接(默认为动态连接)
–enable-static-htpasswd //使用静态连接编译 htpasswd - 管理用于基本认证的用户文件
–enable-static-htdigest //使用静态连接编译 htdigest - 管理用于摘要认证的用户文件
–enable-static-rotatelogs //使用静态连接编译 rotatelogs - 滚动 Apache 日志的管道日志程序
–enable-static-logresolve //使用静态连接编译 logresolve - 解析 Apache 日志中的IP地址为主机名
–enable-static-htdbm //使用静态连接编译 htdbm - 操作 DBM 密码数据库
–enable-static-ab //使用静态连接编译 ab - Apache HTTP 服务器性能测试工具
–enable-static-checkgid //使用静态连接编译 checkgid
–disable-cgid //禁止用一个外部 CGI 守护进程执行CGI脚本
–disable-cgi //禁止编译 CGI 版本的 PHP
–with-mpm=worker // 让apache以worker方式运行
–enable-ssl // 编译 ssl模块。

将apache设置成开机自启动:

在/etc/rc.d/rc.local文件中加入一行

/usr/local/apache2/bin/apachectl start
这样每次重新启动系统以后,apache也会随系统一起启动.

或者

# cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd
然后 vi /etc/rc.d/init.d/httpd 添加(#!/bin/sh下面)
# chkconfig: 2345 10 90
# description: Activates/Deactivates Apache Web Server
最后,运行chkconfig把Apache添加到系统的启动服务组里面:
# chkconfig --add httpd
# chkconfig httpd on
9、编译php 5.2.1并打上Suhosin Patch。
Suhosin 是php增强型安全补丁,可以编译到静态内核中,也可以编译成php动态扩展。我个人强烈你建议安装成静态内核。Suhosin已经进入freebsd和 gentoo的ports。下面的以下先说静态安装步骤。当然你也可以在安装php后将它编译成php的动态扩展。

# cd /usr/local/src
# wget http://cn.php.net/get/php-5.2.1.tar.gz/from/this/mirror
wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.2.1-0.9.6.2.patch.gz
# tar zxvf php-5.2.1.tar.gz
# gunzip suhosin-patch-5.2.1-0.9.6.2.patch.gz
# cd php-5.2.1
patch -p 1 -i ../suhosin-patch-5.2.1-0.9.6.2.patch

#./buildconf --force

# CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-zlib-dir --with-bz2 --with-tiff-dir --with-libxml-dir=/usr/local/libxml2 --with-gd=/usr/local/gd2 --with-freetype-dir --with-jpeg-dir --with-png-dir --with-ttf --enable-mbstring --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-config-file-path=/etc --with-iconv --disable-ipv6 --enable-static --enable-maintainer-zts --enable-memory-limit --enable-zend-multibyte --enable-inline-optimization --enable-zend-multibyte --enable-sockets --enable-soap --enable-suhosin --with-openssl

# make

# make install

# cp php.ini-recommended /etc/php.ini
在这里也顺便说一下将suhosin安装成为php的动态扩展的方法。毕竟网上根本不见它的中文安装教程。

虽然我个人不推荐这种方式。

wget http://www.hardened-php.net/suhosin/_media/suhosin-0.9.16.tgz
tar zxvf suhosin-0.9.16.tgz
cd suhosin-0.9.16
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install
会提示编译的模块存在的目录,记住它。

Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/
然后在php.ini中增加一行下列语句。

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/suhosin.so
10 、整合apache 与php

# vi /usr/local/apache2/conf/httpd.conf
在最后一行加上:

AddType application/x-httpd-php .php
查找:(设置 WEB 默认文件)

DirectoryIndex index.html
替换为:

DirectoryIndex index.php index.html index.htm //在 WEB 目录不到默认文件,httpd 就会执行 /var/www/error/noindex.html
找到这一段:

# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride none
更改为

AllowOverride all
允许apache rewrite

# 监听443端口,支持https连接
取消注释 httpd.conf 中的

Include conf/extra/httpd-ssl.conf
保存httpd.conf,退出。

# /usr/local/apache2/bin/apachectl restart //重启 Apache
11. 查看确认 L.A.M.P 环境信息

vi /usr/local/apache2/htdocs/phpinfo.php
增加下面一行,并保存。

# chmod 755 /usr/local/apache2/htdocs/phpinfo.php
用浏览器打开 http://127.0.0.1/phpinfo.php

# echo ' ' > /usr/local/apache2/htdocs/testdb.php
# chmod 755 /usr/local/apache2/htdocs/testdb.php
# service mysqld start
用浏览器打开 http://127.0.0.1/testdb.php
检查 phpinfo 中的各项信息是否正确。

12、设置SSL并创建自己的CA

# cd /usr/share/ssl/misc
# ./CA -newca
屏幕上出现如下的提示:CA certificate filename (or enter to create)

这是要求输入要创建的CA的证书文件名, 可以直接回车或输入证书文件名。

Making CA certificate …
Generating a 1024 bit RSA private key
………++++++
…………………………..++++++
writing new private key to ‘./demoCA/private/./cakey.pem’
Enter PEM pass phrase:

Verifying password - Enter PEM pass phrase:-

此时要求输入和验证CA的私钥口令、国家代码(中国是CN)、省份、城市或地区、组织或企业名称、部门名称、CA的名称或服务器的主机名称、管理员电子邮件地址。

至此,在当前目录下生成了demoCA的目录,CA的证书就在该目录下,文件名为cacert.pem

生成服务器的证书请求

# ./CA -newreq
屏幕上出现如下的提示:

Generating a 1024 bit RSA private key
……………………………………………..++++++
…..++++++
writing new private key to ‘newreq.pem’
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:

此时要求输入和验证服务器的私钥口令、国家代码(中国是CN)、省份、城市或地区、组织或企业名称、部门名称、CA的名称或服务器的主机名称、管理员电子邮件地址。

Please enter the following ‘extra’ attributes

to be sent with your certificaterequest

A challenge password []:

An optional company name []:

.Request (and private key) is in newreq.pem

这是要求输入服务器的相关信息。

此时,在当前目录下生成了一个名为newreq.pem的文件,包含了要生成服务器数字证书的请求。

签署证书

# ./CA -sign
屏幕上出现如下的提示:

Using configuration from /usr/share/ssl/openssl.cnf

Enter PEM pass phrase:

此时一样需要输入CA的私钥口令、国家代码(中国是CN)、省份、城市或地区、组织或企业名称、部门名称、CA的名称或服务器的主机名称、管理员电子邮件地址。

Certificate is to be certified until Nov 19 13:46:19 2002 GMT (365 days)

Sign the certificate? [y/n]:y

这时显示证书请求文件中的各项信息,并询问是否要签署证书,回答y,进行签署。

1 out of 1 certificate requests certified, commit? [y/n]y

回答y,会显示已经签署的证书的信息,并在当前目录下生成服务器的证书文件newcert.pem。

# mkdir /usr/local/apache2/conf/ssl.crt/
# mkdir /usr/local/apache2/conf/ssl.key/
# cp newcert.pem /usr/local/apache2/conf/ssl.crt/server.pem
# cp newreq.pem /usr/local/apache2/conf/ssl.key/server.pem
更改服务器的证书文件的相关配置

# vi /usr/local/apache2/conf/extra/httpd-ssl.conf
查找并修改

# Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that a kill -HUP will prompt again. Keep
# in mind that if you have both an RSA and a DSA certificate you
# can configure both in parallel (to also allow the use of DSA
# ciphers, etc.)
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.pem
#SSLCertificateFile /usr/local/apache2/conf/server-dsa.crt

# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.pem
#SSLCertificateKeyFile /usr/local/apache2/conf/server-dsa.key
示例文件

在SSL的根目录中生成一个index.html,它是如下所示:

<html>

这是SSL示例!

</html>
测试

假如Web服务器的DNS名称是www.cnprint.org.

在浏览器的URL地址栏里输入 http://www.cnprint.org/,浏览器便会显示APACHE安装时确省的Test Page.

在浏览器的URL地址栏里输入 https://www.cnprint.org/,注意:是 https 而不是http !

浏览器会提示站点已经采用了SSL进行数据的加密传输.由于我们的CA证书不是浏览器缺省的信任的根证书,所以,浏览器会说无法确认服务器的证书可信。暂时不管,一直NEXT,最后,浏览器会显示:这是SSL示例!

可以把CA的证书放在非SSL的站点上,让浏览器下载并安装CA证书,并将其设置成可信任的根证书,便可解决上面的问题.8 解除HTTPD起动时的口令输入。

由于安全的原因,Web服务器的私钥是口令加密了的,每次重新起动HTTPD或Linux时,都会要求输入Web服务器的私钥的口令。

如果要解除HTTPD起动时的口令输入,可以这样:

# cd /usr/local/apache2/conf/ssl.key/
# cp server.pem server.pem.org
# openssl rsa -in server.pem.org -out server.pem
# chmod 400 server.pem
另外在网上看到一个方法,我没有试。有兴趣的可以试下。

创建SSL密码自动应答文件,否则每次Apache启动的时候,都会要求你输入SSL的密码.
创建 /usr/local/apache2/conf/ssl.key/sendsslpwd ,内容如下.

#!/bin/bash
SSLpasswd="YOUR PASSPHRASE"
echo $SSLpasswd
chmod 755 /usr/local/apache2/conf/ssl.key/sendsslpwd
此时,Web服务器的私钥已经没有口令加密,一定要确保server.pem文件除root外,任何用户均无权读取它。

13、安装 Zend Optimizer

# cd /usr/local/src
# wget http://downloads.zend.com/optimizer/3.2.2/ZendOptimizer-3.2.2-linux-glibc21-i386.tar.gz
# tar xzvf ZendOptimizer-3.2.2-linux-glibc21-i386.tar.gz
# ./ZendOptimizer-3.2.2-linux-glibc21-i386/install.sh
按照它的提示一步步进行就行了。

14、安装eaccelerator
eaccelerator是php的加速软件,使用后php的执行效率会有较大幅度的提升。目前eaccelerator 0.9.5已经和ZendOptimizer-3.2.2能够很好兼容啦。不过我个人觉得,ZendOptimizer-3.2.2没有加速的功能,只是起到了运行zend加密文件的作用而已。闲话不多说了,大家有兴趣的,可以去google下。

# cd /usr/local/src
# wget http://bart.eaccelerator.net/source/0.9.5/eaccelerator-0.9.5.tar.bz2
# tar -jxvf eaccelerator-0.9.5.tar.bz2
# cd eaccelerator-0.9.5

export PHP_PREFIX="/usr/local/php"
$PHP_PREFIX/bin/phpize //指定一下php的目录

# ./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config // 设置

# make & make install
编译安装后我们会看到屏幕提示的eaccelerator.so所在的目录,比如我得到的是/usr/local/php/lib/php/extensions/no-debug-zts-20060613/eaccelerator.so,记住这个路径,待会要用到。

修改php.ini(安装完zend之后,php.ini存放于/usr/local/Zend/etc)
在文件最后,zend之前,注意,这部分内容务必放在zend之前,不然可能会出现不可预期的服务器问题。添加下列信息:

[eaccelerator]
extension="/usr/local/php/lib/php/extensions/no-debug-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
解释:
zend_extension 是安装完程序自动指示给我们的
eaccelerator.shm_size=”32″ 缓存大小单位MB
eaccelerator.cache_dir=”/tmp/eaccelerator” 缓存路径

# mkdir /tmp/eaccelerator // 建立目录
# chmod 0777 /tmp/eaccelerator // 修改目录属性
最后重新启动apachectl

抄一个eaccelerator.so配置备案:【2013-06-05】



重启apache,phpinfo显示:

This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies
with eAccelerator v0.9.5, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
with Zend Extension Manager v1.0.11, Copyright (c) 2003-2006, by Zend Technologies
with Zend Optimizer v3.2.2, Copyright (c) 1998-2006, by Zend Technologies

也会有eAccelerator的具体信息。

15、安装phpmyadmin,管理mysql数据库

# cd /usr/local/apache2/htdocs/
# wget http://jaist.dl.sourceforge.net/sourceforge/phpmyadmin/phpMyAdmin-2.10.0-beta1-all-languages.tar.bz2

# tar jxvf phpMyAdmin-2.10.0-beta1-all-languages.tar.bz2
# mv phpMyAdmin-2.10.0-beta1-all-languages phpmyadmin

# cd phpmyadmin/libraries
修改配置文件

# vi config.default.php
找到这几行进行修改:

$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (valid choices: config, http, HTTP, signon or cookie)
$cfg['Servers'][$i]['user'] = 'root'; // MySQL user
$cfg['Servers'][$i]['password'] = 'PASSWORD'; // MySQL password (only needed
经过这几个步骤,我们一个比较安全的LAMP服务器就环境基本建立成功啦。感觉上也不是很难,是吧?
当然对于打造基于动态IP的网站,以上的信息还不够,还有建立ADSL拨号,NAT,动态域名更新,防火墙,安装论坛程序等一系列的工作,我会慢慢地写出自己的心得与大家分享。毕竟这对我来说,也是个学习的过程。
分页: 308/339 第一页 上页 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 下页 最后页 [ 显示模式: 摘要 | 列表 ]