2008年12月8日星期一

让 IE < 7 支持 position:fixed 的通用方法

每个 Web Developer / Designer 都知道 CSS 的 position:fixed 的妙用。利用这个属性,我们可以轻松的将一个元素“固定”在页面的某个位置。这在我们做一些特殊的效果,例如页边角的小角旗,或是固定页面底下的脚注都是非常有用的。但是万恶的 IE 却对这个属性支持有问题,尽管 IE7/8 已经能够正确处理这个属性,但 IE6 的份额还是很高,所以当我们用这个属性时,还得想办法解决这个问题。

今天在一位德国朋友的博客上,看到了一个不错的通用解决方案。这里我简单介绍,或者说翻译一下作者的方法:

在 Firefox/Opera 等良好支持 W3C 标准的浏览器中,如果我们希望将某个元素固定在页面底部,我们可以给它指派这样的 CSS:

position: fixed;
bottom: 0;

对于 IE7 来说,它虽然可以正确的将这个元素 fix 在底部,但它却错误的处理了水平方向的位置。对于这个问题,我们可以利用一个原有的 hack 来解决:

left: 50%;
margin-left: -390px;

这里 margin-left 的值应该修改为您页面主要区域宽度的一半。这样 IE7 下基本也就完美了。剩下需要解决的就是 IE6, IE5.5 的问题了,他们不懂得 position: fixed 属性,所以我们需要单独解决一下:

首先我们为这些浏览器单独创建一个样式表,我们可以利用条件注释语句,让 IE<7 的浏览器单独载入这个“多于”的样式表:





然后我们在这个 CSS 文件中,对这个需要固定在页面底部的元素添加 CSS 属性:

postion: absolute;
bottom: auto;
top: expression( eval(document.compatMode && document.compatMode==’CSS1Compat’) ? documentElement.scrollTop + (documentElement.clientHeight - this.clientHeight) - 1 : document.body.scrollTop + (document.body.clientHeight - this.clientHeight) - 1);

这里事实上就是利用了 IE 中特有的 CSS 运算符 expression。在 expression 中我们可以利用 Javascript 计算出需要的 top 值,这样就达到了与 position: fixed 同样的效果。

这种方法原理上来说和以前的 Javascript 方案是相同的,但这种方法显然通用性更好一点。当然,如果您不介意用 Javascript 的话,实现同样的效果会更直观更简单一点。

document.compatMode属性

document.compatMode用来判断当前浏览器采用的渲染方式。

官方解释:

BackCompat:标准兼容模式关闭。
CSS1Compat:标准兼容模式开启。

当document.compatMode等于BackCompat时,浏览器客户区宽度是document.body.clientWidth;
当document.compatMode等于CSS1Compat时,浏览器客户区宽度是document.documentElement.clientWidth。

浏览器客户区高度、滚动条高度、滚动条的Left、滚动条的Top等等都是上面的情况。

一个准确获取网页客户区的宽高、滚动条宽高、滚动条Left和Top的代码:

if (document.compatMode == \"BackCompat\") {
cWidth = document.body.clientWidth;
cHeight = document.body.clientHeight;
sWidth = document.body.scrollWidth;
sHeight = document.body.scrollHeight;
sLeft = document.body.scrollLeft;
sTop = document.body.scrollTop;
}
else { //document.compatMode == \"CSS1Compat\"
cWidth = document.documentElement.clientWidth;
cHeight = document.documentElement.clientHeight;
sWidth = document.documentElement.scrollWidth;
sHeight = document.documentElement.scrollHeight;
sLeft = document.documentElement.scrollLeft == 0 ? document.body.scrollLeft : document.documentElement.scrollLeft;
sTop = document.documentElement.scrollTop == 0 ? document.body.scrollTop : document.documentElement.scrollTop;
}

(以上代码兼容目前流行的全部浏览器,包括:IE、Firefox、Safari、Opera、Chrome)

2008年12月1日星期一

解决 MYSQL CPU 占用 100% 的经验总结

朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下。此主机有10个左右的 database, 分别给十个网站调用。据朋友测试,导致 mysqld-nt.exe cpu 占用奇高的是网站A,一旦在 IIS 中将此网站停止服务,CPU 占用就降下来了。一启用,则马上上升。

  今天早上仔细检查了一下。目前此网站的七日平均日 IP 为2000,PageView 为 3万左右。网站A 用的 database 目前有39个表,记录数 60.1万条,占空间 45MB。按这个数据,MySQL 不可能占用这么高的资源。

  于是在服务器上运行命令,将 mysql 当前的环境变量输出到文件 output.txt:

d:\\web\\mysql> mysqld.exe --help >output.txt
  发现 tmp_table_size 的值是默认的 32M,于是修改 My.ini, 将 tmp_table_size 赋值到 200M:
d:\\web\\mysql> notepad c:\\windows\\my.ini
[mysqld]
tmp_table_size=200M

  然后重启 MySQL 服务。CPU 占用有轻微下降,以前的CPU 占用波形图是 100% 一根直线,现在则在 97%~100%之间起伏。这表明调整 tmp_table_size 参数对 MYSQL 性能提升有改善作用。但问题还没有完全解决。

  于是进入 mysql 的 shell 命令行,调用 show processlist, 查看当前 mysql 使用频繁的 sql 语句:

mysql> show processlist;

  反复调用此命令(每秒刷两次),发现网站 A 的两个 SQL 语句经常在 process list 中出现,其语法如下:
SELECT t1.pid, t2.userid, t3.count, t1.date
FROM _mydata AS t1
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
LEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pid
ORDER BY t1.pid
LIMIT 0,15

  调用 show columns 检查这三个表的结构 :
mysql> show columns from _myuser;
mysql> show columns from _mydata;
mysql> show columns from _mydata_body;

  终于发现了问题所在:_mydata 表,只根据 pid 建立了一个 primary key,但并没有为 userid 建立索引。而在这个 SQL 语句的第一个 LEFT JOIN ON 子句中:
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
  _mydata 的 userid 被参与了条件比较运算。于是我为给 _mydata 表根据字段 userid 建立了一个索引:
mysql> ALTER TABLE `_mydata` ADD INDEX ( `userid` )
  建立此索引之后,CPU 马上降到了 80% 左右。看到找到了问题所在,于是检查另一个反复出现在 show processlist 中的 sql 语句:
SELECT COUNT(*)
FROM _mydata AS t1, _mydata_key AS t2
WHERE t1.pid=t2.pid and t2.keywords = \'孔雀\'

  经检查 _mydata_key 表的结构,发现它只为 pid 建了了 primary key, 没有为 keywords 建立 index。_mydata_key 目前有 33 万条记录,在没有索引的情况下对33万条记录进行文本检索匹配,不耗费大量的 cpu 时间才怪。看来就是针对这个表的检索出问题了。于是同样为 _mydata_key 表根据字段 keywords 加上索引:
mysql> ALTER TABLE `_mydata_key` ADD INDEX ( `keywords` )
  建立此索引之后,CPU立刻降了下来,在 50%~70%之间震荡。

  再次调用 show prosslist,网站A 的sql 调用就很少出现在结果列表中了。但发现此主机运行了几个 Discuz 的论坛程序, Discuz 论坛的好几个表也存在着这个问题。于是顺手一并解决,cpu占用再次降下来了。

 解决 MYSQL CPU 占用 100% 的经验总结

 增加 tmp_table_size 值。mysql 的配置文件中,tmp_table_size 的默认大小是 32M。如果一张临时表超出该大小,MySQL产生一个 The table tbl_name is full 形式的错误,如果你做很多高级 GROUP BY 查询,增加 tmp_table_size 值。 这是 mysql 官方关于此选项的解释:

tmp_table_size

This variable determines the maximum size for a temporary table in memory. If the table becomes too large, a MYISAM table is created on disk. Try to avoid temporary tables by optimizing the queries where possible, but where this is not possible, try to ensure temporary tables are always stored in memory. Watching the processlist for queries with temporary tables that take too long to resolve can give you an early warning that tmp_table_size needs to be upped. Be aware that memory is also allocated per-thread. An example where upping this worked for more was a server where I upped this from 32MB (the default) to 64MB with immediate effect. The quicker resolution of queries resulted in less threads being active at any one time, with all-round benefits for the server, and available memory.


对 WHERE, JOIN, MAX(), MIN(), ORDER BY 等子句中的条件判断中用到的字段,应该根据其建立索引 INDEX。索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000行,这比顺序读取至少快100倍。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。

根据 mysql 的开发文档:

索引 index 用于:

快速找出匹配一个WHERE子句的行
当执行联结(JOIN)时,从其他表检索行。
对特定的索引列找出MAX()或MIN()值
如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随DESC,键以倒序被读取。
在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。

假定你发出下列SELECT语句:

mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
如果一个多列索引存在于col1和col2上,适当的行可以直接被取出。如果分开的单行列索引存在于col1和col2上,优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行。

  开发人员做 SQL 数据表设计的时候,一定要通盘考虑清楚。

posted on 2008-12-01 22:17 cy163 阅读(4) 评论(0) 编辑 收藏 网摘 所属分类: MySQL

高并发高流量的网站设计

对于一个高并发高流量的网站来说,任何一个环节的瓶颈都会造成网站性能的下降,影响用户体验,进而造成巨大的经济损失。在全互联网层面,应该使用分布式设计,缩短网站与用户的网络距离,减少主干网上的流量,以及防止在网络意外情况下网站无法访问的问题。在局域网层面,应该使用服务器集群,一方面可以支撑更大的访问量,另一方面也作为冗余备份,防止服务器故障导致的网站无法访问。在单服务器层面,应该配置操作系统,文件系统及应用层软件,均衡各种资源的消耗,消除系统性能瓶颈,充分发挥服务器的潜能。在应用层,可以通过各种缓存来提升程序的效率,减少服务器资源消耗(图6)。另外,还需要合理设计应用层程序,为以后的需求变更,扩容做好准备。

  在每一个层次,都需要考虑容错的问题,严格消除单点故障,做到无论应用层程序错误,服务器软件错误,服务器硬件错误,还是网络错误,都不影响网站服务。

  7.2展望

  当前Linux环境下有著名的LAMP(Linux+Apache+MySQL+PHP/PERL/PYTHON)网站建设方案,但只是针对一般的中小网站而言。对于高并发高流量的大型商业网站,还没有一个完整的,性价比高的解决方案。除去服务器,硬盘,带宽等硬件投资外,还需要花费大量的预算和时间精力在软件解决方案上。

  随着互联网的持续发展,Web2.0的兴起,在可以预见的未来里,互联网的用户持续增多,提供用户参与的网站不断增加,用户参与的内容日益增长,越来越多的网站的并发量,访问量会达到一个新的高度,这就会促使越来越多的个人,公司以及研究机构来关注高并发高流量的网站架构问题。就像Web1.0成就了无数中小网站,成就了LAMP一样,Web2.0注定也会成就一个新的,高效的,成本较低的解决方案。这个方案应该包括透明的第三方CDN网络加速服务,价格低廉的第四层甚至更高层网络交换设备,优化了网络性能的操作系统,优化了读写性能,分布式,高可靠的文件系统,揉合了内存,硬盘等各个级别缓存的HTTP服务器,更为高效的服务器端脚本解析器,以及封装了大部分细节的应用层设计框架。

2008年11月24日星期一

有效防御PHP木马攻击的技巧

1、防止跳出web目录

  首先修改httpd.conf,如果你只允许你的php脚本程序在web目录里操作,还可以修改httpd.conf文件限制php的操作路径。比如你的web目录是/usr/local/apache/htdocs,那么在httpd.conf里加上这么几行:

  php_admin_value open_basedir /usr/local/apache

  /htdocs

  这样,如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许,如果错误显示打开的话会提示这样的错误:

  Warning: open_basedir restriction in effect. File is in wrong directory in

  /usr/local/apache/htdocs/open.php on line 4

  等等。

  2、防止php木马执行webshell

  打开safe_mode,

  在,php.ini中设置

  disable_functions= passthru,exec,shell_exec,system

  二者选一即可,也可都选

  3、防止php木马读写文件目录

  在php.ini中的

  disable_functions= passthru,exec,shell_exec,system

  后面加上php处理文件的函数

  主要有

  fopen,mkdir,rmdir,chmod,unlink,dir

  fopen,fread,fclose,fwrite,file_exists

  closedir,is_dir,readdir.opendir

  fileperms.copy,unlink,delfile

  即成为

  disable_functions= passthru,exec,shell_exec,system,fopen,mkdir,rmdir,chmod,unlink,dir

  ,fopen,fread,fclose,fwrite,file_exists

  ,closedir,is_dir,readdir.opendir

  ,fileperms.copy,unlink,delfile

  ok,大功告成,php木马拿我们没辙了,遗憾的是这样的话,利用文本数据库的那些东西就都不能用了。

  如果是在windos平台下搭建的apache我们还需要注意一点,apache默认运行是system权限,这很恐怖,这让人感觉很不爽.那我们就给apache降降权限吧。

  net user apache fuckmicrosoft /add

  net localgroup users apache /del

  ok.我们建立了一个不属于任何组的用户apche。

  我们打开计算机管理器,选服务,点apache服务的属性,我们选择log on,选择this account,我们填入上面所建立的账户和密码,重启apache服务,ok,apache运行在低权限下了。

  实际上我们还可以通过设置各个文件夹的权限,来让apache用户只能执行我们想让它能干的事情,给每一个目录建立一个单独能读写的用户。这也是当前很多虚拟主机提供商的流行配置方法哦,不过这种方法用于防止这里就显的有点大材小用了。

2008年11月20日星期四

感慨啊.

今天看到了一个同龄人的博客,很忌妒..那是从来没有的忌妒.也许别人说的人比人气死人,说得没错.一直以来,我认为我自己可以差强人意的过.但是遇到了他,好羡慕啊..难以抑止.

2008年11月19日星期三

一些设计网站

北京灵智 http://www.smart-rise.com 国内优秀的设计欣赏类网站,一家集品牌策划、平面设计、互动设计、产品形象包装设计、印刷制作为一体的专业化广告设计公司。

DEDS深度 http://www.deds.cn 资源专业丰富.版面大气.包括 平面 网页 三维 工业 动漫 摄影 综合 论坛等内容.

亚洲ci网 http://www.asiaci.com/index.php 国内高质量的平面原创论坛

我爱设计网 http://www.52design.com 海量素材. 包括 设计 素材 资源 酷站

蓝色理想 http://www.blueidea.com 程序员之家,这个就不说了.

中国设计之窗 http://www.333cn.com 国内老牌设计网站

北京设计网 http://www.010design.com.cn 北京地区权威设计门户网站

设计联盟 http://www.chinadu.cn 设计资讯门户,改版之后更专业.

视觉同盟 http://www.visionunion.com 中国设计专业网络媒体 包括 平面 工业 多媒体 等....

中国艺术设计联盟 http://www.arting365.com 创意产业门户.内容丰富

中国UI设计网 http://www.chinaui.com 国内优秀UI网站 火

星时代动画网 http://www.hxsd.com.cn 专业CG类站点

视觉中国 http://www.chinavisual.com 国内老牌创意产业门户网站

中国设计竞赛网 http://www.designcom.cn 设计比赛专业门户网站,内容丰富

NWP http://www.newwebpick.com 优秀视觉图形类网站, Newwebpick电子杂志就不用多说了.

中国包装设计欣赏网 http://www.bzsj123.com.cn 包装设计欣赏网

数码艺术 http://www.computerarts.com.cn 数码艺术杂志就是这里.

设计艺术家 http://www.chda.net 湖南设计艺术家网

中国标志设计欣赏网 http://www.logo35.cn 老牌标志设计类网站

设计中国 http://www.chinaddu.com 以前叫中国PHOTOSHOP联盟,内容丰富

中国设计在线 http://www.oado.com 内容包括平面 网页等...

中国设计网 http://www.cndgn.com 内容包括 包装 平面 工业 建筑 创意等...

七色鸟 http://www.colorbird.com 艺术设计信息网站

鲜创意 http://www.xianidea.com 广告 设计 传媒 数字 建筑等....

DDC传媒 http://www.ddc.com.cn 中国数字艺术联盟 内容包括 设计 插画 动漫 资讯 教育认证等...

V6DP http://www.v6dp.com 优秀数字艺术类论坛,高手众多.

艺术中国网 http://www.artcn.cn/ 综合类资讯网站

视觉联盟 http://www.okvi.com 资讯类设计站点

非视觉 http://www.feiv.com 中国视觉欣赏门户

CGren技术交流论坛 http://cgren.net CG交流论坛

中国包装设计网 http://www.chndesign.net 名字就说明了一切.

中国美术家协会 http://www.caan.cn 中国美术家协会唯一官方网站

视觉资讯 http://www.vi21.cn 新鲜视觉新鲜人

国际设计网CCII http://www.ccii.com.cn

设计路上 http://www.sj63.com 酷站资源 包括论坛

中国pop艺术网 http://www.popart.cn/ 故明思意.POP艺术

中国设计视觉 http://www.86dv.com 内容众多,包括平面 包装 广告竞赛等.

图像谷 http://www.pstxg.com 包括 平面 网页 包装 工业等内容

设计酷 http://www.designcool.net 教程类站点.

异域设计 http://www.yy-s.com 内容丰富 涉汲 教程 平面 网页 动画 酷站等...

设计艺术网 http://www.id00.com 工业设计艺术资讯类站点

先锋设计联盟 http://www.designxf.com 教程 网页 编程 模板

网页设计师联盟 http://www.68design.net 名字说明一切

第一秀 http://www.ike.net.cn 网页设计师交流平台

FM http://www.fmplay.com FM品牌设计

虚拟无忌 http://www.86vr.com 中国虚拟现实门户站点 三维.

哈弗设计 http://design.icxo.com 平面设计类站点

妙联互妙 http://www.minethink.com 网站建设 域名 平面 推广 专业设计服务

天极设计在线 http://art.yesky.com/ 天极网下设计频道

网易学院 http://tech.163.com/cg 网易下设计频道

流行 印象 http://www.vogim.com/ 资讯 教程 摄影 论坛等..

AD100快乐分享 http://www.ad110.com/ 平面 广告 协会 教育等...

世界CI网 http://www.wci.cn/ 平面设计站点

黑白红 http://www.heibaihong.com.cn 设计欣赏和学习平台内容包括 资讯 招聘 平面 CG 多媒体等..

设计·中国 http://www.design.cn 包括 教程 论坛 书刊 培训

UI界面设计门户 http://www.uitimes.com/ 名字说明一切

2008年11月18日星期二

CSS的一些小问题

CSS对浏览器器的兼容性具有很高的价值,通常情况下IE和Firefox存在很大的解析差异,这里介绍一下兼容要点。

  常见兼容问题:

  1.DOCTYPE 影响 CSS 处理

  2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行

  3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中

  4.FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width

  5.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式

  6.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了缺点是要控制内容不要换行

  7.cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以

  8.FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。

  9.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法:
div{margin:30px!important;margin:28px;}
  注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样:
div{maring:30px;margin:28px}
  重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important;

  10.IE5 和IE6的BOX解释不一致
  IE5下
div{width:300px;margin:0 10px 0 10px;}
  div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在IE6和其他浏览器上宽度则是以300px+10px(右填充)+10px(左填充)=320px来计算的。这时我们可以做如下修改
div{width:300px!important;width /**/:340px;margin:0 10px 0 10px}
  关于这个/**/是什么我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的话,请告诉我一声,谢了!:)

  11.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义
ul{margin:0;padding:0;}

  就能解决大部分问题

  注意事项:

  1、float的div一定要闭合。

  例如:(其中floatA、floatB的属性已经设置为float:left;)
<#div id=\"floatA\" >
<#div id=\"floatB\" >
<#div id=\"NOTfloatC\" >

  这里的NOTfloatC并不希望继续平移,而是希望往下排。
  这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。
  在
<#div class=\"floatB\">
<#div class=\"NOTfloatC\">

  之间加上
<#div class=\"clear\">

  这个div一定要注意声明位置,一定要放在最恰当的地方,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。
  并且将clear这种样式定义为为如下即可:
.clear{
clear:both;}

  此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;
  当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
  例如某一个wrapper如下定义:
.colwrapper{
overflow:hidden;
zoom:1;
margin:5px auto;}


  2、margin加倍的问题。

  设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。
  解决方案是在这个div里面加上display:inline;
例如:
<#div id=\"imfloat\">


  相应的css为
#IamFloat{
float:left;
margin:5px;/*IE下理解为10px*/
display:inline;/*IE下再理解为5px*/}


  3、关于容器的包涵关系

  很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。一定要用Photoshop或者Firework量取像素级的精度。

  4、关于高度的问题

  如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。(似乎有时候不会自动往下撑开,不知道具体怎么回事)

  5、最狠的手段 - !important;

  如果实在没有办法解决一些细节问题,可以用这个方法.FF对于\"!important\"会自动优先解析,然而IE则会忽略.如下
.tabd1{
background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style. for FF*/
background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style. for IE */}

  值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过

QUERY STRUCTURE FOR SEARCHING GOOGLE | 简单SEO

QUERY STRUCTURE FOR SEARCHING GOOGLE FOR MUSIC AND MOVIES

Music -inurl:htm -inurl:html intitle:”index of” mp3 “Artist Name”
Movies -inurl:htm -inurl:html -inurl:php intitle:”index of” (mpg|mov|avi|wmv) “Movie Name”
Where Artist Name and Movie Name are replaced with the artist or movie you wish to find file directories for.

2008年11月13日星期四

扩展jQuery跨域加载js文件

众所周知ajax中的同源策略,不能够向其他主机发送ajax请求,在jQuery中提供了一个getScript()方法,可以获取远程js文件,并执行,但这一功能也具有同源性.由于前段时间工作需要访问其他服务器上的一个js文件中的数据,对该函数进行了一个扩展,希望能对使用jQuery的朋友有所帮助,代码如下://扩展jQuery加载跨域名js脚本
jQuery.extend(
{
/**
* @brief: 加载跨域名js脚本
* @param: 脚本URL
* @param: 加载完毕回调函数
*/
getScriptEx : function (jsurl, fCallback, fError)
{
var BROWSER_IE = window.navigator.userAgent.indexOf(\"MSIE\") != -1;
var SCRIPT_TIMEOUT = 20000;

if (typeof(fCallback) != \"function\") fCallback = new Function();
if (typeof(fError) != \"function\") fError = new Function();

var oScriptEl, oTimeoutHDL, oHead;
try
{
oScriptEl = document.createElement(\"script\");
oScriptEl.type = \"text/javascript\";
oScriptEl.language = \"javascript\";
oScriptEl.src = jsurl + \"?\" + Math.random();
oScriptEl.onreadystatechange = doCallback;

if (BROWSER_IE)
{
oScriptEl.onload = function()
{
this.readyState = \"complete\";
doCallback();
};
};

oTimeoutHDL = window.setTimeout(doError, SCRIPT_TIMEOUT);
document.getElementsByTagName(\"head\")[0].appendChild(oScriptEl);

}
catch(error)
{}

function doCallback()
{
try
{
if (oScriptEl.readyState == \"complete\" || oScriptEl.readyState == \"loaded\")
{
oScriptEl.onload = oScriptEl.onreadystatechange = new Function();
fCallback();
window.clearTimeout(oTimeoutHDL);
oScriptEl.parentNode.removeChild(oScriptEl);
}
}
catch(error)
{}
};

function doError()
{
try
{
oScriptEl.parentNode.removeChild(oScriptEl);
}
catch(error)
{}
};
}
}

2008年11月11日星期二

frame自适应高度

2008年11月9日星期日

加速工具软件&总结 - 代码仓库 - CSDNBlog

以上我们都是利用优化代码的方法对程序进行提速,接着我们要关注一下PHP加速的另一个领域—缓存工具软件。这类软件都是从优化PHP运行环境来提速的,不需要改变任何代码。我们可以大概地将它们称为“执行码优化/缓存工具”,你可以理解为它们用来实现比较底层的优化/缓存。

以下列出目前比较常用的此类工具,具体哪种效果最好,请用自己的服务器环境测试:

(一)APC Alternative PHP Cache

http://pecl.php.net/package-info.php?package=APC

APC运行于Linux和FreeBSD,你需要自己编译安装。按照其开发人员的说法,在他们的测试环境下可以提高脚本速度50%-400%。并且APC是个开源项目,已经加入了PHP的PECL库,很值得一试。

(二)Turck MMCache
http://turck-mmcache.sourceforge.net/

Turck MMCache似乎是此类软件中目前最受欢迎的一种,它开放源代码,完全免费。它将PHP代码预编译并缓存起来,同时也对PHP运行环境进行一定优化。按照其官方文档的说法,MMCache可以明显地减轻服务器的负载,并提高脚本执行速度1-10倍。

MMCache与另一个知名的加速软件Zend Optimizer兼容,但注重必需先安装MMCache(php.ini中设置)。除了加快PHP程序的速度,MMCache还可以将PHP代码加密。

Turck MMCache同时支持Linux和Win32平台。

(三)PHPA the PHP Accelerator

http://www.php-accelerator

  PHPA又是另一个流行的PHP加速软件。在其官方网站上有分别使用PHPA与APC、Zend Cache的PHP脚本执行测试对比,其表现略优于APC,略逊于Zend Cache。

PHPA支持Linux, FreeBSD, OpenBSD, BSDi和Solaris系统.

(四)Zend Performance Suite

http://www.zend.com/

Zend Performance Suite是老牌的PHP加速/优化软件,依托于PHP领域最知名的Zend公司。目前已经推出4.0版本,它可以为PHP应用提供程序加速,内容缓存,文件压缩,下载服务等,功能十分强大,获得好几个PHP杂志的推荐奖—但是不得不提起,它也很昂贵,目前的价格是1875美元。

以上几种加速软件,希望读者按照服务器环境自行测试并选择其中最适用的,因为我没有办法提供一个普遍适用的测试标准来判定哪种方案是最有效的。综合起来看,我个人认为Turck MMCache是个值得推荐的选择,免费而且功能相当出色。

2008年11月6日星期四

SEO页面具体做法的总结

我觉得作为站长大家都或多或少对SEO有些了解,现在seo文章也很多,但是对具体的SEO的方法介绍的文章却不多,本文主要对页面怎么具体做SEO做些介绍,站长尤其是新站长一定要看一下怎么具体的作页面的SEO,强调一下,这些SEO的做法不可同时用到你的网站,否则一定会被K的,本人能力也有限,主要目的在于交流,有问题大家可以发信给我好了,好了,现在有关SEO的具体做法都给大家一一呈现:

  (1)域名和Url的做法

  a.域名最好能包含你的网站的英文关键字。比如说,你的网站做movie的,就找类似moviewang.com的域名。

  b.Url不要太长。Url跟目录结构是关系比较紧密的,所以目录结构一定要控制在4层以内。

  c.Url要用静态化Url,要不然就用伪静态。就是说最好要用.html或者htm,最次也要用像新世纪文学网http://www.3100book.com那样的showtopic-2-4.aspx这样的Url。

  d.Url最好可以包含该页面的关键字。比如说,一个页面是关于SEO的,如果这个页面的文件名是seo.htm就比较好。还有seo-test.htm比seo_test.htm要好。

  (2)页面整体的做法

  a.页面要用div+css来做。当打开一个页面的时候,div是一层一层的显示,不像table要整个页面都下载下来了才给用户显示,div给用户的感觉比较好,另外,搜索引擎也比较喜欢div这种做法。

  b.页面的结构比较清晰,能让用户很快找到自己想要的东西,用户从网站的任何地方回到首页点击不要超过四次。

  c.整个网站最好用一个css和js。另外,js最好放到页面的最底部。

  d.首页的导出链接最好控制在10个以内。

  (3)关键字的做法

  a.关键字的选取。这是一个比较繁琐的过程,比较简单的做法是可以用WordTracker之类的工具找出比较效能好的关键字,选出2,3个,最好用那些扩展关键字,比如说你想用“交友”作为网站核心内容,你可以用“北京交友”或者“qq交友”之类的关键词,这样的竞争比较小。

  b.关键字的密度。有了关键字,就要优化了,页面的关键字密度在2%-7%比较合适。

  c.具体放关键字的位置。页面顶部,页面左侧,标题还有正文的前200个字是放关键字的重点部位。这些位置是搜索引擎认为比较关键的部位。

  d.关键字的修饰。如何让搜索引擎认为某个词是我们的关键词?我们可以给这个词加

  b,strong,hx标签,还可以给它加上链接。

  (4) 网站内容的做法

  a.首页的做法。页面的第一屏的左边,中间,标题这些地方最好能够包含的你的网站的主关键字,一定要巧妙,不要让人看出来。对了,链接到首页的下一级链接里面最好加入你的网站的次关键字。

  b.列表页的做法。标题里面最好10个里面就有1-2包含你的主关键字,在有1-2个包含你的次关键字。

  c.最终页的优化。标题可以用h1,另外,内容的前200个字里面最好可以很巧妙的包含这篇文章的核心关键字。有可能给关键字加个粗。当然,不要篇篇都这样做,否则,搜索引擎会不高兴的,你的小站也就危险了。

  (5)导航栏的做法

  a.导航不要用flash和javascript来做。导航是搜索引擎比较看重的地方,如果用flash和javascript可以让搜索引擎把导航给忽略了。

  b.导航可以用b或者hx来标明一下它的重要性。

  c.导航要有意识的体现关键字。

  (6)title和description的做法

  a.title和description还有keywords一定要考虑到包含关键字。简单明确就好,要阅读流畅,千万不要堆叠关键字,百度最讨厌这个了。

  b.title的写法很讲究。首页的写法:网站名-简单介绍网站的一句话,下一级的分类的写法:分类名_网站名,最终内容页的写法:文章名_分类名_网站名,具体的可以看新世纪文学网http://www.3100book.com的写法。

  c.title和description还有keywords最好每页都不同,搜索引擎比较喜欢新鲜的东西,用程序实现title和description每页都不同比较好实现,title就取文章名字,description就去文章的前多少个字,keywords比较麻烦,要用分词程序来实现。

  (7)图片的做法

  a.图片一定要加alt标签。搜索引擎从alt才能知道图片展示的是什么东西。

  b.图片周围内容应该加些关键字的链接。这主要是因为搜索引擎认为图片周围比较重要。

  c.图片的一定不要太大,但是要清晰。

  说了这么多,具体讲了一些seo的做法,但是千万千万记住一点,上面的方法仅供参考, 千万不要全部都用,否则一定会被搜索引擎K掉的。大家切记!

2008年10月30日星期四

PHP负载均衡指南

过去当运行一个大的web应用时候意味着运行一个大型的web服务器。因为你的应用吸引了大量的用户,你将不得不在你的服务器里增加更多的内存和处理器。

今天,\'大型服务器\'模式已经过去,取而代之的是大量的小服务器,使用各种各样的负载均衡技术。这是一种更可行的方法,将使硬件成本降至最低。

\'更多小服务器\'的优势超过过去的\'大型服务器\'模式体现在两个方面:

1. 如果服务器宕机,那么负载均衡系统将停止请求到宕机的服务器,转而分发负载到其他正常运行的服务器上。
2. 扩展你的服务器更加容易。你要做的仅仅是加入新的服务器到负载均衡系统。不需要中断你的应用运行。

所以,把握住这个机会:). 当然,代价就是这要求你的应用开发时增加一点复杂度。这就是本文要覆盖的内容。

这时你可能对自己说: \'但是我怎么知道我正在使用负载均衡呢?\'。最诚实的回答是,如果你正在问这个问题,那么答案是你多半没有在使用负载均衡系统并且你的系统不需要考虑这个 问题。大多数情况,当应用成长足够大的规模时,负载均衡就需要明确提出和设置了。然而,我也偶尔看见虚拟主机公司为客户的应用做这个负载均衡,或者像下面 描述的那样要自己来做。

在继续下面的内容之前,我要指出本文主要描述PHP的负载均衡。将来我可能会写有关数据负载均衡的文字,但是现在你必须等待。

注意,我一直提“web应用”而不是website,这是想区分\'web应用\'是那些复杂的站点往往涉及服务器端编程和数据库,而不是website那样只显示简单的静态内容。
1. PHP文件

第一个问题是,如果你有大量的小型服务器,你怎么把你的php文件上传到所有的服务器上?有如下的方法供你参考:

1. 分别上传所有的文件到每一个服务器 , 这种方法带来的问题是:想像一下你有20个服务器,那么上传过程中这将很容易导致错误,并且更新时极有可能导致不同服务器上有不同版本的文件。
2. 使用 \'rsync \' (或类似的软件) . 这样的工具能同步本地目录和多个远程主机目录上的文件。
3. 使用版本控制软件(如subversion ) . 这是我最喜欢的方法。用它可以很好地维护我得代码,当发布我的应用时,可以在每一个服务器上运行svn update命令同步。这种方法也使切换服务器得代码到过去的某一个版本更加容易。
4. 使用一个文件服务器(你可能发现NFS 非常适合做这件事情). 这种方式是使用一个文件服务器来存放你的web应用. 当然,如果你的文件服务器宕机,那么多所有你的站点将不能使用。这时,你就需要花费更多的开支来恢复它。

选择哪种方式依赖于你的需求和你掌握的技能。如果你使用版本控制系统,那么你可能得计划一个方法如果同时执行一个更新命令更新所有服务器上的代码。然而,如果使用文件服务器,你就要实现一些失败恢复机制,防止万一服务器宕机导致请求失败。
2. 文件上传

当只有一台服务器时,文件上传不是一个问题。但是当我们有多台服务器时,那么上传的文件应该怎么存放呢?上传文件的问题和跨服务器php文件存储是类似的。下面是几种可能的方案:

1. 把文件存储到数据库中 。大多数数据允许存储二进制数据。当你请求文件下载时,访问数据把二进制数据和相应的文件名和类型输出给用户。在使用这种方案前应该考虑数据库怎样存储你的文件。该方法的问题在于如果数据库服务器宕机将使文件不可用。
2. 在一个文件服务器上存储上传的文件 . 与前面的介绍一样,你要安装一个文件服务器让所有web服务器共享,把所有上传的文件上传到这里,上传后所有的web服务器就都可以使用它。但是,如果文件服务器宕机,那么可能发生图像文件下载中断。
3. 设计你自己的上传机制传输文件到服务器到每一个服务器 . 这个方法没有单个文件服务器或者数据库方案的缺陷,但是将增加你代码的复杂度。例如,如果上传到多个服务器过程中,服务器宕机,你要怎么处理?

用数据库存储上传文件但是设计一个文件缓存机制是一个不错的方案。当服务器接收一个文件下载请求时,首先检查缓存系统中是否有该文件,如果发现那么从缓存系统下载,否则从数据库读取并把它缓存到文件系统中。
3. 会话(Sessions)

如果你熟悉php的session处理,你将可能知道默认情况下,它存储session数据在服务器的临时文件里。而且,这个文件仅仅在 你请求处理的那个服务器上,但是接下来的请求可能被另外一个服务器处理,这将在另一个服务器上生成新的session。这导致session频繁地不被识 别,如登录用户总是要求重新登录。

我推荐的方案是,要么重新php内建的session处理机制存储session数据到数据库,或者实现你自己的机制保证发送一个用户的请求到同一台服务器。
4. 配置(Configuration)

尽管这个话题不是和php特别相关,我感觉还是有必要提及。当运行集群服务器时,用某种方法保持服务器之间的配置文件同步是一个好主意。如果配置文件不一致,可能导致一些非常奇怪的断断续续的行为导致很难排查这些问题。

我推荐使用版本控制系统单独管理他们。这样你可以为不同的项目安装存储不同的php配置文件,也可以保持所有服务器配置文件同步。
5. 日志(Logging)

像配置问题一样,logging不是仅仅和php相关。但是对于保持服务器健康运行它仍然是非常重要的。没有正确的logging系统,你怎么知道如果PHP代码开始产生错误(在系统正式运行时,你总是关闭display_errors 设置,不是吗?)



有几种方法你可以实现logging:

1. 在每一个服务器上记录日志。 这是最简单的方法。每一个机器仅仅记录一个文件。好处是简单,可能只要很少的配置。但是,随着服务器数量的增多,监控每台服务器上的日志文件将变得非常困难。
2. 记录日志到一个共享 这种方法每一个服务器仍然有这个日志文件,但是他们通过共享机制被存储在一个中央文件服务器上,这将使监控日志变得更简单。该方案的问题在于,如果文件服务器不可用将导致一个简单的日志不能写入问题最终导致整个应用崩溃。
3. 记录日志到logging服务器 你可以使用一个logging软件,如syslog 来把所有的日志写到一个中央服务器。尽管这个方法要求更多的配置,但是他也提供了最健壮的方案。

PHP新手上路(十三)-网络学院-中原硅谷网

PHP的爆炸性流行使得一夜之间出现了很多基于PHP的站点,其中不少站点有在线教程、范例代码、技巧和提示等内容。

国内
http://www.phpuser.com/ - PHP中文用户,也就是这里了
http://www.phpx.com/ - 中国PHP联盟
http://www.phpsite.net/ - PHP专门站
http://www.phpchina.com/ - PHP CHINA
http://www.cpcw.com/netschool/homepage/cgi/ - 电脑报网页陶吧
国外
http://www.php.net/ - PHP官方站点
http://www.devshed.com/ - 极好的教程
http:// px.sklar.com/ - 代码交换
http://phpuser.com/get_started/ http://www.phpbuilder.com/ - 教程、专栏和邮件列表档案
http://phpuser.com/get_started/ http://www.weberdev.com/ - 文章和代码
http://phpuser.com/get_started/ http://www.phpwizard.net/ - 提示与技巧
http:// www.iometrics.com/php/phplist.php3/ - IOMetrics scripts的档案
http://www.e-gineer.com/phpkb/ - PHP知识库


12.2 邮件列表

  你可以在PHP官方站点的\"支持\"栏目内登记获得以下的邮件列表。值得注意的是这些都是高流量流表,一般每天会有100份e-mail。

php3@lists.php.net - 主要的列表
php-dev@lists.php.net - 主要针对开发者
mailto:php-list-subscribe@exp.com.cn - 本站的邮件列表,与论坛相通


12.3 引人注目的工程

  一些基于PHP的工程已经发展得比较完善。其中一些更出色更引人注目的是:

http://phplib.netuse.de/ - PHPLib,一整套PHP函数库
http://www.phorum.org/ - Phorum是一个很完善的BBS系统
http://www.fishcartsql.org/ - FishCartSQL是一个电子商务解决方案
http://www.midgard-project.org/ - Midgard是一个网络应用开发平台

2008年10月29日星期三

详解XSS跨站脚本攻击

一、什么是XSS攻击

  XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。而本文主要讲的是利用XSS得到目标服务器的shell。技术虽然是老技术,但是其思路希望对大家有帮助。

  如何寻找XSS漏洞

  就个人而言,我把XSS攻击分成两类,一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句,如:dvbbs的showerror.asp存在的跨站漏洞。另一类则是来来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个有跨站漏洞的网页,然后构造跨站语句,通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。

  然后利用下面的技术得到一个shell.

  如何利用

  传统的跨站利用方式一般都是攻击者先构造一个跨站网页,然后在另一空间里放一个收集cookie的页面,接着结合其它技术让用户打开跨站页面以盗取用户的cookie,以便进一步的攻击。个人认为这种方式太过于落后,对于弊端大家可能都知道,因为即便你收集到了cookie你也未必能进一步渗透进去,多数的cookie里面的密码都是经过加密的,如果想要cookie欺骗的话,同样也要受到其它的条件的限约。而本文提出的另一种思路,则从一定程度上解决上述的问题。对于个人而言,比较成熟的方法是通过跨站构造一个表单,表单的内容则为利用程序的备份功能或者加管理员等功能得到一个高权限。下面我将详细的介绍这种技术。

  二、来自内部的跨站攻击

  寻找跨站漏洞

  如果有代码的话比较好办,我们主要看代码里对用户输入的地方和变量有没有做长度和对”<”,”>”,”;”,”’”等字符是否做过滤。还有要注意的是对于标签的闭合,像测试QQ群跨站漏洞的时候,你在标题处输入,代码是不会被执行的,因为在源代码里,有其它的标签未闭合,如少了一个,这个时候,你只要闭合一个,代码就会执行,如:你在标题处输入,这样就可以弹出一个test的框。

  如何利用

  我先以BBSXP为例,过程已做成动画,详情可见光盘中的动画。我举BBSXP中其中两个比较好用的跨站漏洞点为例.

  a.先注册一个普通用户,我这里注册的用户是linzi.然后我们在个人签名里写入:

[img]http://127.0.0.1/bbsxp/admin_user.asp?menu=userok&username=linzi&membercode=5&userlife=1&posttopic=3&money=9&postrevert=0&savemoney=0&deltopic=1®time=2005-9-1+1%3A1%3A1&experience=9&country=%D6%D0%B9%FA&&Submit=+%B8%FC+%D0%C2+[/img]

  c.然后发个贴子,可以结合其它技术欺骗管理员浏览发的贴子。

  d.因为是测试,所以我们以管理员身份登陆,然后打开贴子,我们会发现,linzi已经变成了社区区长工,如图一所示

  除此之外我们只要在个人签名里输入

[img]http://127.0.0.1/bbsxp/admin_setup.asp?menu=variableok&clubname=+&homename=+&homeurl=&floor=2&PostTime=3&Timeout=6&OnlineTime=12&Reg10=10&style=1&selectup=FSO&MaxFace=10240&MaxPhoto=30720&MaxFile=102400&UpFileGenre=gif|jpg|asp%20|rar[/img]

  同样发个贴子等,只要管理员打开了,就会加了一个扩展名为asp (有空格)的上传扩展,这个时候,你只要上传一个newmm.asp (有空格)就可以得到一个shell.

  上面的攻击多多少少有点局限性,虽然可以得到shell,但是隐蔽性不太好,因为签名处受到了长度的限制,不能超过255个字符。我们可以结合flash跨站实现更为隐蔽的攻击,对于flash木马的制作,下面见哥们丰初的介绍。

  再利用如下:

  修改一下个人头像的url,输入代码如下: admin_setup.asp?

menu=variableok&clubname=+&homename=+&homeurl=&floor=2&PostTime=3&Timeout=6&OnlineTime=12&Reg10=10&style=1&selectup=FSO&MaxFace=10240&MaxPhoto=30720&MaxFile=102400&UpFileGenre=gif|jpg|php|rar

  再接着欺骗管理员打开你的资料或者浏览你的贴子,当管理员打开后,会在后台自动加个php扩展名的后辍,因为bbsxp在个人头像url里过滤了空格,%,所以我们只能加个不包括空格的其它扩展,当然你也可以加个shtml的扩展,有了它你就可以用来查看源代码,然后进一步攻击。

2008年10月28日星期二

利用jquery操作select下拉列表框 - 为了忘却的纪念 $bestmost->save(

其他有关select的取值或赋值方式:
复制多选框,并且设置指定名称为默认值
$(".SoftType").html($("#stsoft").clone());
for(var i=0; i<$(".SoftType select option").length; i++){
if($(".SoftType select")[0].options(i).text== soft){
$(".SoftType select")[0].selectedIndex = i;
}}
获取select被选中项的文本
var item = $(\"select[@name= stsoft] option[@selected]\").text();
select下拉框的第二个元素为当前选中值
$(\'#stsoft\')[0].selectedIndex = 1;
获取value值
$(\'#stsoft\').val();
设置value=1的项目为当前选中项
$(\"#stsoft\").attr(\"value\",“1”);
$(\'#stsoft\').val(“1”);

2008年10月27日星期一

十大建站开源程序

目前互联网上有无数个开源的建站程序可供大家选择使用,对现在的站长来说真的是容易多了,10年前我作网站的时候,一个小聊天程序也要自己一句一句的写,看看现在的开源程序,层出不穷。太多了也就不知道选哪个好了,很多初学者买域名建网站,可是不知道如何下手,希望这篇文章能给您的网站建设开个好头,这也就是我Anki写这篇文章的目的。

1、PhpBB - 论坛讨论板

phpBB具有友好的用户界面,使用了当今网 络上流行的php语言工作,可以搭配MySQL,MS- SQL,PostgreSQL, 和Access/ODBC等数据库系统使用。适合于大多数的网站用来搭建论坛系统。软件的开发成员来自于开源社区,是一个国际性的开源项目,2000年6 月开始项目以来,各开发成员们坚持开源精神,为软件的稳定可用贡献了各自的力量。

主要功能特点:

* 支持流行的数据库服务器;
* 论坛和发贴数无限制;
* 多国语言接口界面;
* 支持开设公共和私用性论坛;
* 集成了强大的搜索工具;
* 有大量模版来支持用户实现不同的论坛表现风格;
* 支持基于cookie和url等两种安全会话机制;
* 对用户和组有安全分级管理机制;
* 用户发贴数统计,用户等级授勋等实用功能。

访问:官方主页

下载地址: sourceforge下载

2、Discuz! -论坛讨论板

Discuz!,全称 Crossday Discuz! Board,是一个通用的论坛软件系统,用户可以在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能、很强负载能 力和可高度定制的论坛服务。Discuz! 的基础架构采用世界上最流行的 web 编程组合 PHP+MySQL/PgSQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。 Discuz! 无论在稳定性,负载能力,安全保障等方面都居于国内外同类产品领先地位。Discuz!应该说基本上占领了国内的个人站长论坛市场,个人也非常推崇这款论 坛程序。 空间联盟的论坛 就是使用Discuz!程序的一个例子。

适用于以下的应用领域 :

* 对稳定性和负载能力要求较高的门户网站
* 大中型企业的客户在线调查、技术与产品服务
* 企事业单位内部交流与沟通,办公协作与自动化(OA)
* 大中专院校的学生、教工与校友讨论区
* 已经发展到一定规模,具有相当访问量的个人网站
* 商业、交友、科技、影音、下载等等方面的专门网站
* 地方政府、电信公司或爱好者建立的地域性讨论区

访问:官方主页

下载地址: http://www.discuz.net/download/

PHPWind 和 动网论坛 也是不错的论坛程序,这里就不一一介绍。

3、PHPnuke - 整站内容管理系统(CMS)

内容管理系统应该首推PHPnuke。众所周知,国内几个著名个人资讯网,例如cnbeta、联客资讯,都是以PHPnuke作为信息平台的。

phpNuke原本是开源软件,但是从7.8版本开始就收费了。只要懂得LAMP(linux + apche + mySQL + php)的人,就能顺速的通过phpNuke架设自己的网站系统,基本上网站需要的功能都包括了:新闻、下载、链接、论坛……最突出的就是可以自己写 module扩充功能,或者将其他应用嵌入到phpNuke中;通过skin的方式方便的更改网站的风格。 cnBeta 是一个典型的应用实例。

访问: http://phpnuke.org/

下载地址:PHPnuke 8.0简体中文版

4、Mambo - 整站内容管理系统(CMS)

Mambo,中文意思为曼波音乐(源于古巴黑人音乐),是这个星球上功能最强大的开放源码的智能建站系统之一。在2004年4月20日伦敦举行的 Linux用户和开发员大会上,Mambo从众多优秀的开放源码系统中脱颖而出,获得2004年度最佳Linux开放源码系统奖项,和它同场竞技的有 KDE、Firebird SQL以及eGroupware等,这些都是知名度很高,被广泛使用的系统,现在却沦为Mambo的手下败将,可想而知,Mambo的魔力有多大! Windows Live知识库就是Mambo应用的一个例子。
主要功能特点:

* 完全的数据库驱动
* 新闻,产品或服务类别可完全编辑和管理
* 内容可由多个编辑者上传与编辑
* 完全的可定制外观
* 可由浏览器上传图片或其他媒体文件,并可将图片使用于所有栏目中
* 动态的论坛/投票等系统
* 可运行于Linux, FreeBSD, MacOSX server, Solaris 和 AIX

访问: 官方主页

下载地址: MamboV4.6.1 中文版

当然还有很多国内外优秀的CMS开源程序,这里不能一一详述。

5、Gallery - 图库相册程序

Gallery 是一个非常有名的免费开源图库相册软件,基于 PHP 和 MySQL, PostgreSQL 等数据库。功能非常强大,有丰富的扩展可以下载,安装很简单,环境符合后,按照提示一路 continue 就行了。 Gallery 的界面定制不复杂,只有几个模版文件,也有很多免费的皮肤可以下载,因为是一套老程序了,国外有很多人为它服务,免费皮肤很容易找到。
语言方面,已经有了简体、繁体中文的语言文件支持,编码是 UTF-8, 符合国际标准。Gallery 现在的稳定版是 2.0.3, 另外也有 2.1 的每夜构建版可以下载,每夜版也是相当稳定的,这次我安装的就是每夜版。
与 Coppermine 相比, Gallery 的功能更强大一些,扩展更丰富。安装方面 Coppermine 简单一些,只有3步,Gallery 10来步。 模版定制上 Coppermine 比较复杂,虽然文件不多,但各项语法比较费事,不是很直观的 html,需要用到一些 PHP, 相比 Gallery 的模版定制更简单一些。我这里有一个Gallery相册实例: http://msliver.com

Gallery 的系统要求:

* 平台 - UNIX (BSD, Linux, …) or Windows
* 网络服务器 - Apache, Microsoft IIS, Zeus, …
* PHP - PHP 4.1.0 或更高, PHP safe_mode 必须关闭
* 图片处理库 - ImageMagick, NetPBM. Gallery 2 还加上了对 GD 和 GraphicsMagick 的支持。
* 数据库 (Gallery 2) - MySQL 3.x, 4.x or 5.x, PostgreSQL 7.x or 8.x, Oracle 9i or 10g, DB2 8.2 (Gallery 1.x 不使用数据库)

访问:官方主页

下载地址: Gallery 2.0.3 下载 ( SourceForge 下载,3个安装包,里边包含的模块多少不一样,全部的解压后30M左右,典型的16M左右,最小的安装包 7/8M)。

6、 Wordpress -博客日志管理系统

Wordpress是大家都很熟悉的开源博客平台,本站TopDig日志就是用Wordpress搭建的。 WordPress是一种使用PHP语言和MySQL数据库开发的Blog(博客、网志)引擎,用户可以在支持PHP和MySQL数据库的服务器上建立自 己的Blog。 它是一个功能非常强大的博客系统,插件众多,易于扩充功能。安装和使用都非常方便。目前WordPress已经成为主流的Blog搭建平台。 WordPress的原版是英文版的,但是有爱好者开发了中文语言包,使其可以支持中文。 它拥有几百个各式插件和不计其数的模板样式。

Wordpress的功能特性:

* 进行文章发布、分类、归档。
* 支持文章、评论、分类等多种形式的RSS输出。
* 提供链接的添加、归类功能。
* 支持评论的管理,防垃圾功能。
* 支持对风格(CSS)和程序本身(PHP)的直接编辑、修改。
* 在Blog系统外,方便的添加所需页面。
* 通过对各种参数进行设置,使你的Blog更具个性化。
* 生成静态html页面(需要mod_rewrite支持)。
* 通过选择不同主题,方便地改变页面的显示效果。
* 通过添加插件,可提供多种特殊的功能。
* 支持Trackback和pingback。
* 支持针对某些其它blog软件、平台的导入功能。
* 支持多用户。

访问: 官方主页

下载地址:sourceforge下载

7、OpenPNE -社会化交友平台

OpenPNE是优秀的全球开源的Social Networking and group collaboration platform(社交网络和团体协作平台)web应用程序,一个来自日本的开源项目。OpenPNE是sns网络服务的引擎,OpenPNE丰富的 SNS服务功能和易于使用的特性让越来越多的用户喜欢并开始使用他。它是基于大型SNS(social networking service)的网络交际平台。OpenPNE对网站服务器的要求较高,普通的虚拟主机是无法建立OpenPNE社会化平台的。

OpenPNE的安装环境:

* Apache 1.3.*/2.0.* 以上
* PHP 4.3.*/5.0.*
* PHP mbstring 扩展
* PHP GD库 (JPEG/GIF/PNG)
* PHP mcrypt 扩展(推荐)
* ·MySQL 4.0/4.1
* ·邮件服务器
* Postfix 2.1.* (推荐)

访问: 官方主页

下载地址: http://www.openpne.com.cn/corp/DownLoad.shtml (目前官方只提供了繁体中文版下载)

8、Pligg -Digg类社会化信息平台

Pligg是一个Web2.0内容管理系统( CMS )。 与现存的CMS最大不同之处在于它能够让你的访问者们自己决定网站的内容并提供让他们建立一个交流 。Pligg目前还没有走出beta,因此模版和插件也相对较少,大部分程序员们都处于观望状态,目前的版本为beta 9.5。Pligg的模版除了自带的:”Digital Nature”,”Paul01″,”yget”,”Mollio-Beat” 之外真的很难找到其他的可以使用的模版。

来自官方的一段话:“Pligg,最灵活的类似Digg的Web2.0 CMS系统!网页设计师可以使用Pligg做他(她)想做的任何事情。稍微懂一些PHP和Mysql的知识即可安装Pligg。如果需要修改和管理 Pligg,可能有点难度。对于精通Web开发语言的朋友,Pligg是一个定制化非常强的CMS系统。”。

功能特性:

* 安装简单
* 支持多用户
* 用户提交、用户投票、用户决定首页文章
* 支持用户一定程度在线交流
* 可自定制模版和插件

访问: 官方主页

下载地址:sourceforge下载

9、MediaWiki -开源Wiki知识库平台

MediaWiki是全球最著名的wiki程序,运行于PHP+MySQL环境。MediaWiki从2002年2月25日被作为维基百科全书的系 统软件,并有大量其他应用实例。目前MediaWiki的开发得到维基媒体基金会的支持。 MediaWiki是建立wiki网站的首选后台程序,目前国内的天下维客等站点都采用这套系统。 MediaWiki一直保值着持续更新。其原作者为德国的Magnus Manske。

MediaWiki中文支持良好,功能特性完善,学习资料充足,是建立wiki网站的首选wiki程序。MediaWiki能方便的建立网站并让大家参与内容编辑,推荐站长选用。

wiki的重要特征:

* 记录所有的改动版本,能方便的查阅历史更新记录,这使得开放性编辑成为可能
* 自动产生链接,编辑文本中中括号中的内容(如“[[X条目]]”)将自动产生链接
* 允许使用模板,方便对相同内容的重复使用、更新
* 支持分类,并根据分类在不同的文章之间自动产生关联
* 允许每个用户自行选择系统外观
* 中文支持好

访问: 官方主页

下载地址:sourceforge下载

10、Gregarius -RSS聚合程序

Gregarius是一个基于web的RSS/RDF/ATOM聚合程序,它运行于您的web服务器,聚合您想要的任何资源。 这个开源聚合站程序是新兴起的RSS聚合站的开源先锋,虽然目前还没有完全脱离测试版本,但是功能已经相当齐全,并能较好的支持中文。这里有一个 演示站点 供大家参考。

功能特点:

* 完全基于web。
* 简单、有密码保护的管理及设置。
* 运用AJAX技术。
* 支持全文搜索。
* 完全符合web标准。
* 基于开源协议的免费软件。

访问: 官方主页

下载地址:sourceforge下载

2008年10月22日星期三

PHP SOAP扩展

PHP的SOAP扩展可以用来提供和使用Web services。换句话说,PHP开发者可以利用这个PHP扩展来写他们自己的Web services,也可以写一些客户端来使用给定的Web services。

PHP5中的这个SOAP扩展目的是为了实现PHP对Web services的支持。与其它实现PHP对Web services的支持的方法不同,SOAP扩展是用C写的,因此它比其它方法具有速度优势。

SOAP扩展支持以下规范。

* SOAP 1.1
* SOAP 1.2
* WSDL 1.1

SOAP扩展主要用来处理RPC形式的Web services。不过,你也可以使用文本形式的WSDL文件配合WSDL模式的服务端和客户端。

这个扩展使用 GNOME XML库来处理XML。

扩展中的类
这个扩展实现了6个类。其中有三个高级的类,它们的方法很有用,它们是 SoapClient,SoapServer和SoapFault。另外三个类除了构造器外没有其它别的方法,这三个是低级的类,它们是SoapHeader,SoapParam和SoapVar。

SoapClient类

这个类用来使用Web services。SoapClient类可以作为给定Web services的客户端。
它有两种操作形式:

* WSDL 模式
* Non-WSDL 模式

在WSDL模式中,构造器可以使用WSDL文件名作为参数,并从WSDL中提取服务所使用的信息。

non-WSDL模式中使用参数来传递要使用的信息。这个类有许多可以用来使用服务的有用的方法。其中SoapClient::__soapCall()是最重要的。这个方法可以用来调用服务中的某个操作。

SoapServer类

这个类可以用来提供Web services。与SoapClient类似,SoapServer也有两种操作模式:WSDL模式和non-WSDL模式。这两种模式的意义跟 SoapClient的两种模式一样。在WSDL模式中,服务实现了WSDL提供的接口;在non-WSDL模式中,参数被用来管理服务的行为。

在SoapServer类的众多方法中,有三个方法比较重要。它们是SoapServer::setClass(),SoapServer::addFunction()和SoapServer::handle()。

SoapServer::setClass()方法设定用来实现Web Service的类。SoapServer::setClass所设定的类中的所有公共方法将成为Web Services的操作(operation)。

SoapServer::addFunction()方法用来添加一个或多个作为Web Services操作(operation)的函数。

SoapServer:: handle()方法指示Web Service脚本开始处理进入的请求。Web Service脚本是用PHP脚本写的一个或多个SoapServer对象的实例。尽管你可以有不止一个的SoapServer对象,但通常的习惯是一个脚本只拥有一个SoapServer实例。在调用SoapServer::handle()方法之前,Web Service脚本会使用设置在SoapServer对象实例上的任何信息来处理进入的请求和输出的相应。


SoapFault类

这个类从Exception类继承而来,可以用来处理错误。SoapFault实例可以抛出或获取Soap错误的相关信息并按程序员的请求处理。

SoapHeader类

这个类可以用来描述SOAP headers。它只是一个只包含构造器方法的数据容器。

SoapParam类

SoapParam也是一个只包含构造器方法的数据容器。这个方法可以用来描述传递给Web services操作的参数。在non-WSDL模式中这是一个很有用的类,可以用来传递所期望格式的参数信息。

SoapVar类

SoapVar也是一个只包含构造器的低级类,与SoapHeader和SoapParam类相似。这个类可以用来给一个Web services操作传递编码参数。这个类对non-WSDL中传递类型信息是非常有用的。


WSDL VS. non-WSDL模式

Web Services有两种实现模式:契约先行(Contract first)模式和代码先行(Code first)模式。

契约先行模式使用了一个用XML定义的服务接口的WSDL文件。WSDL文件定义了服务必须实现或客户端必须使用的接口。SoapServer和SoapClient的WSDL模式就基于这个概念。

在代码先行模式中,首先要先写出实现服务的代码。然后在大多数情况下,代码会产生一个契约,换种说法,一个WSDL。接着客户端在使用服务的时候就可以使用那个WSDL来获得服务的接口。尽管如此,PHP5的扩展并没有从代码输出一个WSDL的规定,考虑到这种情况,可以在non-WSDL模式下使用 SoapServer和SoapClient。
SOAP扩展与Hello World

这一节介绍如何使用WSDL模式和non-WSDL模式来实现服务和客户端。相对而言,使用WSDL模式来实现服务和客户端会比较容易,假定已经有一个定义了接口的WSDL文件。因此这一节会先介绍如何使用WSDL模式实现一个Web Service。

在这个Hello World例子的服务中有一个被命名为greet的操作。这个操作有一个字符串形式的名字并返回一个字符串形式的greeting。所用到的WSDL如下:

xmlns:impl=\'http://wso2.org/wsf/php/helloService\'
xmlns:intf=\'http://wso2.org/wsf/php/helloService\'
xmlns:wsdl=\'http://schemas.xmlsoap.org/wsdl/\'
xmlns:wsdlsoap=\'http://schemas.xmlsoap.org/wsdl/soap/\'
xmlns:xsd=\'http://www.w3.org/2001/XMLSchema\'
targetNamespace=\'http://wso2.org/wsf/php/helloService\'>

xmlns:impl=\'http://wso2.org/wsf/php/helloService\'
xmlns:intf=\'http://wso2.org/wsf/php/helloService\'
xmlns:wsdl=\'http://schemas.xmlsoap.org/wsdl/\'
xmlns=\"http://www.w3.org/2001/XMLSchema\"
targetNamespace=\'http://wso2.org/wsf/php/helloService\' >















































WSDL模式服务

下面是WSDL模式的服务所使用的SOAP扩展API代码:

function greet($param) {
$retval = \'Hello \'.$param->name;
$result = array(\'greetReturn\' => $retval);
return $result;
}

$server = new SoapServer(\'hello.wsdl\');
$server->addFunction(\'greet\');
$server->handle();
?>

在这个服务的实现过程中,函数实现了WSDL所定义的服务操作greet,greet操作有一个WSDL指定的参数,按照greet操作的语义,这个参数是一个用户的名字。最后handle调用了触发处理请求的服务对象。


WSDL模式客户端

客户端代码如下

try {
$client = new SoapClient(\'hello.wsdl\');
$result = $client->__soapCall(\'greet\', array(array(\'name\' => \'Sam\')));
printf(\"Result = %s\", $result->greetReturn);
} catch (Exception $e) {
printf(\"Message = %s\",$e->__toString());
}
?>

客户端代码中,首先创建一个使用WSDL文件作参数的SoapClient实例。接着__soapCall()调用作为参数传入它的操作,也就是greet和传入操作的参数。
请求和响应

当你将上述的PHP脚本放在你web服务器目录下的文档中,并利用WEB浏览器或在PHP解析器的命令行调用脚本,客户端发送一个SOAP请求到服务端脚本,服务端将向客户端发送一个SOAP响应来响应客户端的请求。

下面是客户端所发送的SOAP请求:


xmlns:ns1=\"http://wso2.org/wsf/php/helloService\">


Sam




下面是服务端响应上诉请求而发送的SOAP响应:


xmlns:ns1=\"http://wso2.org/wsf/php/helloService\">


Hello Sam




上面的SOAP消息都是利用WSDL模式的服务端和客户端来获取的。也可以利用non-WSDL模式的服务端和客户端来产生与上面相同的SOAP消息。但是,PHP代码必须有一点改变。下一节会说明如何使用non-WSDL模式。

non-WSDL模式服务端

function greet($param) {
$retval = \'Hello \'.$param;
return new SoapParam($retval, \'greetReturn\');
}

$server = new SoapServer(null, array(\'uri\' => \'http://wso2.org/wsf/php/helloService\'));

$server->addFunction(\'greet\');
$server->handle();
?>

在non -WSDL模式中,想WSDL模式一样首先实现greet函数的功能,但是函数实现的方式跟WSDL模式稍稍有所不同。在non-WSDL模式中,我们必须返回一个SoapParam对象作为响应,而不是一个数组。创建服务时,第一个参数设为null,说明没有提供WSDL;接着传递一个选项作为参数,这个选项参数是服务的URI。最后像WSDL模式一样调用剩下的方法。

non-WSDL模式客户端

try {
$client = new SoapClient(null,
array(\'location\' => \'http://localhost/hello/hello_service_nonwsdl.php\',
\'uri\' => \'http://wso2.org/wsf/php/helloService\'));
$result = $client->__soapCall(\'greet\', array(new SoapParam(\'Sam\', \'name\'))); printf(\"Result = %s\", $result);
} catch (Exception $e) {
printf(\"Message = %s\",$e->__toString());
}
?>

在non-WSDL模式中,因为没有使用WSDL,传递了一个包含服务所在位置和服务URI的参数数组作为参数。然后象WSDL模式中一样调用__soapCall()方法,但是使用了SoapParam类用指定格式打包参数。返回的结果将获取greet中的响应。


结论

这篇文章介绍了SOAP扩展,可以在PHP中通过它来提供和使用Web Services。PHP扩展的强项是它的简单和快速。使用C写的SOAP扩展来运行服务端和客户端是非常简单的。虽然SOAP扩展在处理一些简单的 Web Services时很有用,但是当用它来处理所有的Web Services时就表现出它的局限性。 WSO WSF/PHP就是为了弥补PHP扩展的缺陷而开发的,它是开源的,可以实现SOAP类似的功能并且支持MTOM,WS-Addressing,WS- Security和WS-RelaiableMessaging。WSO2 WSF/PHP 支持与SOAP扩展类似的API。我们正计划将API打包起来提供跟SOAP扩展一样的API,会用C来写。

2008年10月21日星期二

常用正则表达式语法例句

常用正则表达式语法例句
这里有一些可能会遇到的正则表达式示例:


/^\\[ \\t]*$/ \"^\\[ \\t]*$\" 匹配一个空白行。

/\\d{2}-\\d{5}/ \"\\d{2}-\\d{5}\" 验证一个ID号码是否由一个2位字,一
个连字符以及一个5位数字组成。

/<(.*)>.*<\\/\\1>/ \"<(.*)>.*<\\/\\1>\" 匹配一个 HTML 标记。


下表是元字符及其在正则表达式上下文中的行为的一个完整列表:

字符 描述

\\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后
向引用、或一个八进制转义符。例如,’n’ 匹配字符 \"n\"。’\\n’
匹配一个换行符。序列 ’\\\\’ 匹配 \"\\\" 而 \"\\(\" 则匹配 \"(\"。

^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的
Multiline 属性,^ 也匹配 ’\\n’ 或 ’\\r’ 之后的位置。

php学习之家http://www.444p.com


$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的
Multiline 属性,$ 也匹配 ’\\n’ 或 ’\\r’ 之前的位置。

* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 \"z\" 以及
\"zoo\"。 * 等价于{0,}。

+ 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 \"zo\" 以
及 \"zoo\",但不能匹配 \"z\"。+ 等价于 {1,}。

? 匹配前面的子表达式零次或一次。例如,\"do(es)?\" 可以匹配
\"do\" 或 \"does\" 中的\"do\" 。? 等价于 {0,1}。

{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配
\"Bob\" 中的 ’o’,但是能匹配 \"food\" 中的两个 o。

{n,} n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配
\"Bob\" 中的 ’o’,但能匹配 \"foooood\" 中的所有 o。’o{1,}’ www.444p.com
等价于 ’o+’。’o{0,}’ 则等价于 ’o*’。

{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹
配 m 次。刘, \"o{1,3}\" 将匹配 \"fooooood\" 中的前三个o。
’o{0,1}’等价于’o?’。请注意在逗号和两个数之间不能有空格

? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,},
{n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的
匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜
索的字符串。例如,对于字符串 \"oooo\",’o+?’ 将匹配单个
\"o\",而 ’o+’ 将匹配所有 ’o’。

. 匹配除 \"\\n\" 之外的任何单个字符。要匹配包括 ’\\n’ 在内的任
何字符,请使用象 ’[.\\n]’ 的模式。

(pattern) 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的
Matches 集合得到,在VBScript 中使用 SubMatches 集合,在 www.444p.com版权所有
Visual Basic Scripting Edition 中则使用 $0…$9 属性。要
匹配圆括号字符,请使用 ’\\(’ 或 ’\\)’。

(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹
配,不进行存储供以后使用。这在使用 \"或\" 字符 (|) 来组合
一个模式的各个部分是很有用。例如, ’industr(?:y|ies) 就
是一个比 ’industry|industries’ 更简略的表达式。

(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符
串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后
使用。例如,’Windows (?=95|98|NT|2000)’ 能匹配\"Windows
2000\"中的\"Windows\",但不能匹配\"Windows3 .1\"中\"Windows\"。
预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹
配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之 www.444p.com
后开始。

(?!pattern) 负向预查,在任何不匹配Negative lookahead matches the
search string at any point where a string not matching
pattern 的字符串开始处匹配查找字符串。这是一个非获取匹
配,也就是说,该匹配不需要获取供以后使用。例如’Windows
(?!95|98|NT|2000)’ 能匹配 \"Windows 3.1\" 中的 \"Windows\",
但不能匹配 \"Windows 2000\" 中的 \"Windows\"。预查不消耗字
符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开
始下一次匹配的搜索,而不是从包含预查的字符之后开始

x|y 匹配 x 或 y。例如,’z|food’ 能匹配 \"z\" 或 \"food\"。’(z|f)
ood’ 则匹配 \"zood\" 或 \"food\"。

[xyz] 字符集合。匹配所包含的任意一个字符。例如, ’[abc]’ 可以
匹配 \"plain\" 中的 ’a’。

[^xyz] 负值字符集合。匹配未包含的任意字符。例如, ’[^abc]’ 可以 www.444p.com
匹配 \"plain\" 中的’p’。

[a-z] 字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹
配 ’a’ 到 ’z’ 范围内的任意小写字母字符。

[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,
’[^a-z]’ 可以匹配任何不在 ’a’ 到 ’z’ 范围内的任意字符。

\\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,
’er\\b’ 可以匹配\"never\" 中的 ’er’,但不能匹配 \"verb\" 中
的 ’er’。

\\B 匹配非单词边界。’er\\B’ 能匹配 \"verb\" 中的 ’er’,但不能匹
配 \"never\" 中的 ’er’。

\\cx 匹配由x指明的控制字符。例如, \\cM 匹配一个 Control-M 或
回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一
个原义的 ’c’ 字符。

\\d 匹配一个数字字符。等价于 [0-9]。
本文来自 www.444p.com


\\D 匹配一个非数字字符。等价于 [^0-9]。

\\f 匹配一个换页符。等价于 \\x0c 和 \\cL。

\\n 匹配一个换行符。等价于 \\x0a 和 \\cJ。

\\r 匹配一个回车符。等价于 \\x0d 和 \\cM。

\\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于
[ \\f\\n\\r\\t\\v]。

\\S 匹配任何非空白字符。等价于 [^ \\f\\n\\r\\t\\v]。

\\t 匹配一个制表符。等价于 \\x09 和 \\cI。

\\v 匹配一个垂直制表符。等价于 \\x0b 和 \\cK。

\\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。

\\W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。

\\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确
定的两个数字长。例如, ’\\x41’ 匹配 \"A\"。’\\x041’ 则等价
于 ’\\x04’ & \"1\"。正则表达式中可以使用 ASCII 编码。.

\\num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。 php学习之家http://www.444p.com
例如,’(.)\\1’ 匹配两个连续的相同字符。

\\n 标识一个八进制转义值或一个后向引用。如果 \\n 之前至少 n
个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制
数字 (0-7),则 n 为一个八进制转义值。

\\nm 标识一个八进制转义值或一个后向引用。如果 \\nm 之前至少有
is preceded by at least nm 个获取得子表达式,则 nm 为后
向引用。如果 \\nm 之前至少有 n 个获取,则 n 为一个后跟文
字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为
八进制数字 (0-7),则 \\nm 将匹配八进制转义值 nm。

\\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-
7),则匹配八进制转义值 nml。

\\un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字
符。例如, \\u00A9 匹配版权符号 (?)。

2008年10月16日星期四

文件转换器服务推荐

1、通用类:

zamzar 是一个很牛的在线转换工具,能转换100M以下的到40种格式的文件,包括图象格式、文档格式、音频格式、视频格式等,几乎囊括了我们熟知的所有文件格式,可以自由转换,功能相当不错的了,可以说是一个比较全能的工具了,而且页面简洁易用,速度也很不错!!(via)



Youconvertit 提供堪称最完美的在线文件转换服务,能在线对文档、图片、音频以及视频文件进行转换。能在41种文档格式(常用如 html,txt,ppt,doc,pdf,rtf,csv,psd,xls,xhtml,xls等)、85种图片格式(常用如 bmp,jpg,gif,tiff,ico,png等)、7种音频格式(aac、aif、aiff、mp3、ra、wav、wma)、11种视频格式 (3gp、asf、avi、flv、mov、mp4、mpeg、mpg、rm、swf、wmv)进行相互转换。实在是一项非常不错的服务。(via)



Xurrency 是在线的当前货币兑换查询工具,界面非常简单,选择币种,输入金额即可快速获得目标币种的数额。同时,底部还有一个实时的汇率表,直观的反馈一些主要币种的现时汇率。放在此类有些牵强,对一些朋友会很有用。



2、媒体类

Fivix 是一个视频转换的平台,可将YouTube、Google Video等视频网站的视频转化格式、或直接生成下载链接,用户可将视频文件根据需要随意转化为avi、mov、3gp、mp4、mp3格式,并生成下载。(详情)



Movavi 是全绿色版本,不需要你注册、下载、安装等等繁琐,任何人进入网站就能直接使用。使用大致分为三步,在一页内均能完成。允许你将本地电脑、或者网络中的视频文件进行格式的转换,生成你所喜欢的media文件。并提供了转换工具下载及博客挂件,方便你的使用。(详情)



Converttube 可将Youtube视频文件进行转换并提供下载,最近更是添加了mobile文件的支持,一共可转换为6种格式:mpg、flv、mov、mp3、3gp、mp4。



与Converttube 几乎一样,Vconvert 又是一个在线视频转换工具,可将YouTube等视频共享网站的文件转换为wmv, mov, mp4, mp3, 3gp等。



SpinVox 提供语音到短信业务,出发点是为了方便用户随时掌握自己的留言,注册为用户后,网站会自动将你的语音留言转为文本短信,并及时的发送到你的手机、邮箱或博客上,用户不用上网,而利用手机就可以收发SpinVox 信息,同任何SpinVox 用户进行通信,而且可以支持任何手机,无需下载新的软件。但是,目前针对英语、西班牙语、法语和德语用户。(详情)



Vozme 更 为简单和实用,不需要注册就能使用所有功能。这次推荐的是英文版本,你只需要在对话框内输入想要说的话(英文),点击创建mp3,在短短进分钟内立刻就能 生成mp3文件。速度还是很快的,制作完成后提供在线播放和文件下载。同时网站还提供了挂件代码,贴在博客上可随时使用。(详情)



Filsh 提供在线下载视频网站的视频文件的服务,并且还支持对文件格式的转换,能将文件转换成如下格式: .mpg .avi .mov .3gp .mp4 .flv .mp3 .ogg,同时还可以对码率以及视频尺寸进行设置。功能已经是很强大的了,而且下载及转换的速度也还比较理想,不过不支持本地文件的转换,只能转换网络上 的一些文件。(via)



Flvto 是很简单的一个在线转换器,可以将Youtube视频转变为mp3格式,或者将你本地的视频(flv格式)转变为mp3文件。根据你提供的视频文件大小需要等待不同的时间,不过速度还算可以。转换后提供下载的网址,或者可以直接发布到你的社会化网络服务上。(详情)



3、文档类

pdfonline 功能最为强大的PDF在线工具集合,很奇怪国内用户很少人用。我以前也没怎么用过,这次整理时才发现,包括了一些很实用的工具,值得慢慢挖掘。其中pdf 文件转化工具更是让我眼前一亮,也是目前我所发现支持文件格式最多的一个工具,包括MS Word (DOC | RTF) 、MS PowerPoint (PPT)、MS Publisher (PUB)、MS Excel (XLS) 、HTML (MHT)、Text (TXT) 、JPG、GIF、TIFF、BMP、PNG、EMF、WMF。



KoolWire 也是一个在线PDF转换工具,但其操作方法有所不同,用户只需把想要转换的文档发送Email到 pdf@koolwire.com 邮箱中就OK了,过一段时间就会收到转换好的PDF文件了。目前KoolWire 支持Word (.doc), Powerpoint (.ppt), Excel (.xls), Jpeg, GIF, Rich Text Format (.rtf), TXT等格式的文档,并且完全支持中文。(引自)



Readthewords 是一款全能的在线将文本(文档)转换成语音的服务,可以将文本(文档)包括HTML以及RSS/Feed转换成语音文件并提供下载。在 readthewords可以直接输入一段文字进行转换,也可以上传PDF 、Word、HTML 三种格式的文件进行转换,不仅如此,你可以直接输入web/RSS Feeds 地址,readthewords能将组成该web/RSS Feeds 的每一个网页或者blog文章转换成单独的MP3文件。提供了14种语音,分别来自14个不同性别不同年龄的阅读者。(via)



Yakitome 又一个功能强大的在线转换文本成语音(Text To Speech)的服务,支持将English,Spanish,French,German四种语言的文字以及.doc .pdf .txt .html.xml等格式的文档转换成mp3.wav格式。(via)



Pdfmenot是一个提供在线文档转换服务的网站,可以将PDF文件转换成Flash格式。你可以将网页上的PDF文件链接,或者本地的PDF文件直接上传到Pdfmenot即可进行转换。转换后的Flash格式的内容,你可以通过链接 或者Js代码将其放置在你的网站或者Blog上面进行分享。这样也就提供了一种在你网站上面分享PDF文件的方式。(via)



4、图像类

Gickr 一个在线的绿色版小工具,你可以不需注册就能直接制作精美的GIF格式图片,享受动画的快感!几乎与一些专业的gif制作软件相似,可以用任意的几张图片进行组合,达到动画的效果,甚至支持用youtube的视频直接转换成gif图片。(详情)



Make3d 很有意思的一个在线工具,你上传照片后,Make3d 可根据你照片的场景,由二维变为三维。不过你上传的图片必须是连续的一组图片,现在大多的数码相机都有360度拍摄功能。Make3d 采用了类似立体电影的技术,在视觉上给你3D的感受。



Fotowoosh 可以让你在一张2D的图片上产生3D的错觉效果,它可以通过一定的技术将你上传上去的 2D 平面图片轻松转换成 3D 的效果;该技术由全球著名的免费空间服务商Freewebs提供。(via)



Vectormagic 在线位图转矢量图工具,可帮你轻松修复边缘的锯齿,让图片边缘更圆滑。大家都知道,我们通常作的图都是点阵图,放大后会失真,边缘出现难看的锯齿,而向量图放大后边缘不变,一样的圆滑。其实,Vectormagic 也正是将你的图片转变为向量图,从而使图片的质量大大提高!(详情)



Convertico 可实现在线PNG与ICO两种图片格式的互换,无须安装任何软件,简单而实用。



Photo2Text是一个提供将图片转化成文字图片服务的网站。只需上传你想要转换的图片即可。转换的图片可以通过下载,也可以生成专有的链接来查看。(via)

2008年10月7日星期二

你可能都没有老驴强

一头老驴,掉到了一个废弃的陷阱里,很深,根本爬不上来,主人看他是老驴,懒得去救他了,让他在那里自生自灭。那头驴一开始也放弃了求生地希望。每天还不断地有人 往陷阱里面倒垃圾,按理说老驴应该很生气,应该天天去抱怨,自己倒霉掉到了陷阱里 ,他的主人不要他,就算死也不让他死得舒服点,每天还有那么多垃圾扔在他旁边。

可是有一天,他决定改变他的人生态度(驴生态度更确切点),他每天都把垃圾踩到自己 的脚下,从垃圾中找到残羹来维持自己的生命,而不是被垃圾所淹没,终于有一天,他重新回到了地面上。

不要抱怨你的专业不好,不要抱怨你的学校不好,不要抱怨你住在破宿舍里,不要抱怨你的男人穷你的女人丑,不要抱怨你没有一个好爸爸,不要抱怨你的工作差,工资少,不要抱怨你空怀一身绝技没人赏识你,现实有太多的不如意,就算生活给你的是垃圾,你同样能把垃圾踩在脚底下,登上世界之巅

这一年的国庆

国庆都过去了,借个时间写写这个国庆里发生的一些事情,顺便收藏下.毕竟这个博客里自己的东西实在是太少了,今天偶尔有点时间,加上有想写博的冲动(呵呵,有时候自己还是蛮喜欢弄弄笔墨的,但决不是什么文学愤青,仅仅爱好,当然,就凭这菜鸟水平,也写不出什么像样的东西了.只不过也不是为了充实博客而有的举动,纯粹是为了打发时间,现在才想到那些无聊的人士是拿什么在网上来干什么了.写博客确实占时间,尤其对于我们这种又想写却又写不出东西的人来说.)这个国庆还算差强人意,虽然没有什么计划中的旅行,聚会,游玩.但是因为是国庆,周围的朋友都会知道怎么营造节日的氛围.平日里的忙碌都会停滞下来.大伙都会不约而同的想怎么去打发时间.
国庆第一天,到河西的同学们那边去玩了,同学们住在岳麓山的山腰上(同学们是因为准备考研才准备移居山中,隐姓埋名的,因为同学们的身上承载的不仅仅是他们自己的抱复也是我们的希望,所以我会经常去看望他们,(那里,是我们这些毕业后还待在长沙的同学的聚点,那是因为那里可以有免费的床睡,嘻嘻.)买些好吃的结他们让他们保重好身体.(至此,我觉得我是他们的恩人哪,我个人决定他们以后的工资要分我一半).那天,我们大部分的同学都在,于是我提出一建议并倡导大家履行.就是哥们参加工作的请考研的同志们好好的补充一下营养,海吃一顿.对,我们真的去HIGH吃了一顿,没喝多少酒.接着晚上去了好望角,一个我不熟的地方.就是溜冰的地方啦.(哈哈,我是不是很俗啊?)不用你说,我有自知之明.本来不溜没关系,这一溜可勾起我学溜冰的欲望.接着几天就放肆学溜冰..
还没写完..有点不想写了,下次续吧

2008年10月6日星期一

GOOGLE搜索技巧

第一篇
在搜索框上输入: “index of/ ”  inurl:lib

再按搜索你将进入许多图书馆,并且一定能下载自己喜欢的书籍。

在搜索框上输入: “index of /”  cnki

再按搜索你就可以找到许多图书馆的CNKI、VIP、超星等入口!

在搜索框上输入: “index of /”  ppt

再按搜索你就可以突破网站入口下载powerpint作品!

在搜索框上输入: “index of /”  mp3

再按搜索你就可以突破网站入口下载mp3、rm等影视作品!

在搜索框上输入: “index of /”  swf

再按搜索你就可以突破网站入口下载flash作品!

在搜索框上输入: “index of /”  要下载的软件名

再按搜索你就可以突破网站入口下载软件!

注意引号应是英文的!

再透露一下,如果你输入:

“index of /”  AVI

另补上第二篇
用GOOgle看世界!!!只要你在GOOGLE里输入特殊的关键字,就可以搜到数千个摄象头的IP地址!通过他你就可以看到其所摄的实时影象!!
在google里输入
inurl:\"viewerframe?mode=\"

随便打开一个,然后按提示装一个插件,就可以看到了!!!

再补上第三篇
三则黑客的Google搜索技巧简介
大家都知道,Google毫无疑问是当今世界上最强大的搜索引擎。然而,在黑客手中,它也是一个秘密武器,它能搜索到一些你意想不到的信息。赛迪编者把他们进行了简单的总结不是希望您利用他去攻击别人的网站,而是利用这些技巧去在浩如烟海的网络信息中,来个大海捞针,寻找到对您有用的信息。

如果您是一名普通网民,您可以使用黑客的技巧扩大自己的视野,提高自己的检索效率;如果您是一名网管,请您赶快看看您的网站是否做好了对下面黑客探测手段的防范措施,如果没有就赶快来个亡羊补牢,毕竟隐患胜于明火,防范胜于救灾;如果您是一名黑客,相信您早以在别的黑客站点上见过类似的方法,这篇文章对您没什么用处,这里的技巧对您是小儿科,菜鸟级!您可以节省宝贵的时间做更有意义的事情,这篇文章您不用看了,到别处去吧!

基于上面的考虑我编发了这篇文章。

  搜索URL

  比如我们提交这种形式:passwd.txt site:virtualave.net

  看到了什么?是不是觉得太不可思议了!有很多基于CGI/PHP/ASP 类型的留言板存在这种问题。有时我们得到密码甚至还是明码的!管理员或许太不负责了,或许安全防范的意识太差了,如果你是网络管理员,赶快检查一下不要让恶意攻击者捡了便宜。不要太相信DES加密,即使我们的密码经过DES 加密的密码,黑客们还是可以通过许多破解软件来搞定。

  



  这次我们能得到包含密码的文件。“site:virtualave.net”意思是只搜索 virutalave.net 的URL。virutalave.net是一个网络服务器提供商。

  同样,我们可以搜索一些顶级域名,比如:.net .org .jp .in .gr

  config.txt site:.jp

  admin.txt site:.tw

  搜索首页的目录

  首页是非常有用的,它会提供给你许多有用的信息。

  我们提交如下的形式:

  \"Index of /admin\"

  \"Index of /secret\"

  \"Index of /cgi-bin\" site:.edu

  你可以自己定义搜索的首页字符。这样就可以获得许多信息。

  搜索特定的文件类型

  比如你想指定一种文件的类型,可以提交如下形式:

  filetype:.doc site:.mil classified

  这个就是搜索军方的资料,你可以自定义搜索。
再提供一个第四篇

Google 的特殊功能
1 、查询电话号码
Google 的搜索栏中最新加入了电话号码和美国街区地址的查询信息。
个人如想查找这些列表,只要填写姓名,城市和省份。
如果该信息为众人所知,你就会在搜索结果页面的最上方看到搜索的电话和街区地址
你还可以通过以下任何一种方法找到该列表:
名字(或首位大写字母),姓,电话地区号
名字(或首位大写字母),姓,邮递区号
名字(或首位大写字母),姓,城市(可写州)
名字(或首位大写字母),姓,州
电话号码,包括区号
名字,城市,州
名字,邮递区号

2 、查找 PDF 文件
现在 GOOGLE 的搜索结果中包括了 PDF 文件。尽管 PDF 文件不如 HTML 文件那么多,但他们经常具备一些其他文件不具备的高质量信息
为了显示一个搜索结果是 PDF 文件而不是网页, PDF 文件的标题开头显示蓝色文本。
这就是让你知道 ACRTOBAT READER 程序会启动来阅读文件
如果你的计算机没装有该程序,计算机会指导你去能免费下载该程序的网页。
使用 PDF 文件时,相关的网页快照会由“ TEXT VERSION ”代替,它是 PDF 文档的复制文件,该文件除去了所有格式化命令。
如果你在没有 PDF 链接的情况下想看一系列搜索结果,只要在搜索栏中打上 -inurldf 加上你的搜索条件。

3 、股票报价
用 Google 查找股票和共有基金信息,只要输入一个或多个 NYSE , NASDAQ , AMEX 或
共有基金的股票行情自动收录机的代码,也可以输入在股市开户的公司名字。
如果 Google 识别出你查询的是股票或者共有基金,它回复的链接会直接连到高质量的金融信息提供者提供的股票和共有基金信息。
在你搜索结果的开头显示的是你查询的股市行情自动收录器的代码。如果你要查找一家公司的名字(比如, INTEL ),请查看“股票报价”在 Google 搜索结果的金融栏里会有那个公司的主页的链接(比如, WWW.INTEL.COM )。
Google 是以质量为基础来选择和决定金融信息提供者的,包括的因素有下载速度,用户界面及其功能。

4 、找找谁和你链接
有些单词如果带有冒号就会有特殊的意思。比如 link :操作员。查询 link:siteURL ,就会显示所有指向那个 URL 的网页。举例来说,链接 www.Google.com 会向你显示所有指向 GOOGLE 主页的网页。但这种方法不能与关键字查询联合使用。

5 、查找站点
单词 site 后面如果接上冒号就能够将你的搜索限定到某个网站。具体做法是:在 c 搜索栏中使用 site:sampledomain.com 这个语法结构。比如,在斯坦福找申请信息,输入:
admission site:www.stanford.edu

6 、查找字典释意
查找字典释意的方法是在搜索栏中输入你要查询的内容。在我们根据要求找到所有的字典释意都会标有下划线,位于搜索结果的上面,点击链接你会找到字典提供者根据要求给出的相关定义。 7 、用 GOOLGE 查找地图
想用 Google 查找街区地图,在 Google 搜索栏中输入美国街区地址,包括邮递区号或城市 / 州(比如 165 大学大街 PALO ALTO CA )。通常情况下,街区地址和城市的名字就足够了。
当 Google 识别你的要求是查找地图,它会反馈给你有高质量地图提供者提供的链接,使你直接找到相关地图。我们是以质量为基础选择这些地图提供者。值得注意的是 Google 和使用的地图信息提供者没有任何关联。

jquery-上下滚动新闻

jquery-上下动态滚动新闻并动态显示内容

jquery

$(function(){

$(\"#noticemove\").Scroll({line:1,speed:500,timer:3000,up:\"forword\",down:\"back\"});

}

(function($){
$.fn.extend({
Scroll:function(opt,callback){
if(!opt) var opt={};
var _btnUp = $(\"#\"+ opt.up);
var _btnDown = $(\"#\"+ opt.down);
var timerID;
var _this=this.eq(0).find(\"ul:first\");
var lineH=_this.find(\"li:first\").height(),
line=opt.line?parseInt(opt.line,10):parseInt(this.height()/lineH,10),
speed=opt.speed?parseInt(opt.speed,10):500;
timer=opt.timer
if(line==0) line=1;
var upHeight=0-line*lineH;
var scrollUp=function(){
_btnUp.unbind(\"click\",scrollUp);
_this.animate({
marginTop:upHeight
},speed,function(){
for(i=1;i<=line;i++){
_this.find(\"li:first\").appendTo(_this);
}
_this.css({marginTop:0});
_btnUp.bind(\"click\",scrollUp);
});

}
var scrollDown=function(){
_btnDown.unbind(\"click\",scrollDown);
for(i=1;i<=line;i++){
_this.find(\"li:last\").show().prependTo(_this);
}
_this.css({marginTop:upHeight});
_this.animate({
marginTop:0
},speed,function(){
_btnDown.bind(\"click\",scrollDown);
});
}
var autoPlay = function(){
if(timer)timerID = window.setInterval(scrollUp,timer);
};
var autoStop = function(){
if(timer)window.clearInterval(timerID);
};
_this.hover(autoStop,autoPlay).mouseout();
_btnUp.css(\"cursor\",\"pointer\").click( scrollUp ).hover(autoStop,autoPlay);
_btnDown.css(\"cursor\",\"pointer\").click( scrollDown ).hover(autoStop,autoPlay);

}
})
})(jQuery);

html





向前  向后

2008年10月5日星期日

超链接打开目标(target)

链接的target属性决定了链接在哪边打开,它的值通常为以下五种:_blank、_self、_parent、_top和自定义,依次表示为:新窗口、当前窗口、父窗口、顶层窗口和框架。当所指名称的框架不存在时,自定义作用等同于_blank。
当要打开一个链接时,先在本页面中搜索指定名称(target)的框架,找不到则在下层页面中搜索,还找不到就到上层页面中搜索,都找不到打开一个新的窗口!

2008年9月27日星期六

使用nusoap时需要注意的地方, 说不定你正被这些问题困扰着 - mynamesucks的技术blog - CSDNBlog

原来做web service用的是pear的soap包, 最近换了公司后改成用nusoap了, 所以对nusoap也算比较熟悉了. 在用的过程中发现有些地方需要注意一下, 所以本文不说nusoap的使用方法, 只说一些需要注意的地方.

nusoap这个类变态的长, 所以一般鲜有人会先把他看一遍再开始用, 大多直接参照例子就开始用了. 我也是这样的, 当然刚开始是没问题的, 程序运行的很好, 但是到从试验性的使用到真正的和别的公司web service传输数据的时候就有问题了, 然后传输大量数据的时候又出现了新的问题.

下面就来说说.

首先在传输少量数据的时候, 用如下语句生成对象
$client = new soapclient($service_address, true);
然后用如下语句调用对方web service的方法就行了
$result = $client->call(\'methodName\', $par);

当然这个在我本机测试时是好的, 也就是我自己写的client端调用自己写的service端是好的. 但是当我用这个调用对方.NET的service端时就出问题了. 数据传不过去. 后来发现原来要用proxy.
在生成$client对象后调用如下方法
$proxy = $client->getProxy();
然后调用对方web service的语句改成
$result = $proxy->methodName($par);
就可以了.

下面那个使用proxy的方法我后来自己请求自己也测试通过, 就是说用proxy比较好, 至少都能用.

这个问题解决后, 测试了几天, 然后需要做load testing了, 几千条的数据一起测, 结果数据传输就掉了很多, 一查, 原来web service中途停了. 所以把php.ini的max_execution_time调长, memory_limit调大, 为了保险, 把max_input_time也调长了. 结果执行结果还是老样子. 所以只好回头研究nusoap类里的东西, 然后发现了$response_timeout这个东西, 默认是30, 我把他改成了900, 估计是900秒, 然后再次执行, OK了. 当然为了保险, 我把nusoap里的所有$response_timeout的值都改为了900 ^^

然后和$response_timeout类似的, 还有一个问题, 就是中文字符的问题. 其实这个很简单, 只要把nusoap里的三个$decode_utf8的值都改成false就可以了. 原来是true, nusoap会自己把utf-8编码的字符转换成iso-8859-1, 所以中文的就变成问号了.

还有一个问题, 如果我为了安全, 把放有web service的目录用htaccess保护起来的话, client端当然也就访问不到service端了. 所以我做了下research, 又发现nusoap里有一个现成的方法. 所以说有时间还是要把nusoap这个类里的东西熟悉熟悉啊, 虽然长了点.
就是下面这个方法,
$client -> setCredentials(\'username\', \'password\');
另外请求的service端的地址也要稍作修改
比如原来的地址是
http://domain/test/service.php?wsdl
现在也要改成
http://username:password@domain/test/service.php?wsdl
必须要这两步都做了才能请求被htaccess保护起来的service地址, 缺一不可.

使用 NuSOAP 结合 WSDL 来编程

Defining New Data Structures

WSDL 一个重要的方面是它封装了一个或多个 XML 结构,允许程序员通过 service 来描述数据结构,为了说明 NuSOAP 如何支持这个,我会在 Programming with NuSOAP Part 2 文章中的 SOAP struct 实例中加入 WSDL 代码。

service 代码的改变已经显示在 Hello, World 实例中,但是它也包含了定义 Person 数据结构的代码:

// Pull in the NuSOAP code
require_once(\'nusoap.php\');
// Create the server instance
$server = new soap_server();
// Initialize WSDL support
$server->configureWSDL(\'hellowsdl2\', \'urn:hellowsdl2\');
// Register the data structures used by the service
$server->wsdl->addComplexType(
\'Person\',
\'complexType\',
\'struct\',
\'all\',
\'\',
array(
\'firstname\' => array(\'name\' => \'firstname\', \'type\' => \'xsd:string\'),
\'age\' => array(\'name\' => \'age\', \'type\' => \'xsd:int\'),
\'gender\' => array(\'name\' => \'gender\', \'type\' => \'xsd:string\')
)
);
$server->wsdl->addComplexType(
\'SweepstakesGreeting\',
\'complexType\',
\'struct\',
\'all\',
\'\',
array(
\'greeting\' => array(\'name\' => \'greeting\', \'type\' => \'xsd:string\'),
\'winner\' => array(\'name\' => \'winner\', \'type\' => \'xsd:boolean\')
)
);
// Register the method to expose
$server->register(\'hello\', // method name
array(\'person\' => \'tns:Person\'), // input parameters
array(\'return\' => \'tns:SweepstakesGreeting\'), // output parameters
\'urn:hellowsdl2\', // namespace
\'urn:hellowsdl2#hello\', // soapaction
\'rpc\', // style
\'encoded\', // use
\'Greet a person entering the sweepstakes\' // documentation
);
// Define the method as a PHP function
function hello($person) {
$greeting = \'Hello, \' . $person[\'firstname\'] .
\'. It is nice to meet a \' . $person[\'age\'] .
\' year old \' . $person[\'gender\'] . \'.\';

$winner = $person[\'firstname\'] == \'Scott\';

return array(
\'greeting\' => $greeting,
\'winner\' => $winner
);
}
// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : \'\';
$server->service($HTTP_RAW_POST_DATA);
?>

除了支持 WSDL 的附加代码之外,service 方法的代码本身也有一点改变,使用 WSDL ,不再需要使用 soapval 对象来为返回值指定名称和数据类型。

相似的, WSDL 客户端不需要使用 soapval 指定参数的名称和数据类型,演示代码如下:

// Pull in the NuSOAP code
require_once(\'nusoap.php\');
// Create the client instance
$client = new soapclient(\'http://localhost/phphack/hellowsdl2.php?wsdl\', true);
// Check for an error
$err = $client->getError();
if ($err) {
// Display the error
echo \'

Constructor error

\' . $err . \'
\';
// At this point, you know the call that follows will fail
}
// Call the SOAP method
$person = array(\'firstname\' => \'Willi\', \'age\' => 22, \'gender\' => \'male\');
$result = $client->call(\'hello\', array(\'person\' => $person));
// Check for a fault
if ($client->fault) {
echo \'

Fault

\';
print_r($result);
echo \'
\';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo \'

Error

\' . $err . \'
\';
} else {
// Display the result
echo \'

Result

\';
print_r($result);
echo \'
\';
}
}
// Display the request and response
echo \'

Request

\';
echo \'
\' . htmlspecialchars($client->request, ENT_QUOTES) . \'
\';
echo \'

Response

\';
echo \'
\' . htmlspecialchars($client->response, ENT_QUOTES) . \'
\';
// Display the debug messages
echo \'

Debug

\';
echo \'
\' . htmlspecialchars($client->debug_str, ENT_QUOTES) . \'
\';
?>

WSDL 是客户端多于一个功能,使用代理而不是用 soapclinet 类的 call 方法。代理(proxy)是一个类,它映射到 service 。因此,它具备了与 service 相同参数的相同方法,一些程序员更喜欢使用代理因为方法是作为用户一个实例的方法来调用的,而不是通过 call 方法,一个使用代理的实例如下:

// Pull in the NuSOAP code
require_once(\'nusoap.php\');
// Create the client instance
$client = new soapclient(\'http://localhost/phphack/hellowsdl2.php?wsdl\', true);
// Check for an error
$err = $client->getError();
if ($err) {
// Display the error
echo \'

Constructor error

\' . $err . \'
\';
// At this point, you know the call that follows will fail
}
// Create the proxy
$proxy = $client->getProxy();
// Call the SOAP method
$person = array(\'firstname\' => \'Willi\', \'age\' => 22, \'gender\' => \'male\');
$result = $proxy->hello($person);
// Check for a fault
if ($proxy->fault) {
echo \'

Fault

\';
print_r($result);
echo \'
\';
} else {
// Check for errors
$err = $proxy->getError();
if ($err) {
// Display the error
echo \'

Error

\' . $err . \'
\';
} else {
// Display the result
echo \'

Result

\';
print_r($result);
echo \'
\';
}
}
// Display the request and response
echo \'

Request

\';
echo \'
\' . htmlspecialchars($proxy->request, ENT_QUOTES) . \'
\';
echo \'

Response

\';
echo \'
\' . htmlspecialchars($proxy->response, ENT_QUOTES) . \'
\';
// Display the debug messages
echo \'

Debug

\';
echo \'
\' . htmlspecialchars($proxy->debug_str, ENT_QUOTES) . \'
\';
?>

使用NuSOAP编程---array

这篇文章是接着上两篇 Introduction to NuSOAP 和 Programming with NuSOAP ,增加了一些实例来说明如何使用 SOAP 数组(Arrays)和结构(Structs)类型来创建和使用 SOAP web service。

SOAP Arrays
SOAP Structs
Resources
SOAP Arrays

我在 Introduction to NuSOAP 和 Programming with NuSOAP 两篇文章中使用了普遍的 ’Hello, World\' 实例,显然是没有什么想象力,然而这里,我将会展示如何改进原有的代码,不是对单个人打招呼而使用数组来对多个人打招呼。

SOAP 数组是数字做索引的(不相关的),这与其它编程语言如 C 和 FORTRAN 很相似。因此,我们的 service 可以使用数组索引来访问数组的元素而不是关联的key值。

// Pull in the NuSOAP code
require_once(\'nusoap.php\');
// Create the server instance
$server = new soap_server;
// Register the method to expose
// Note: with NuSOAP 0.6.3, only method name is used w/o WSDL
$server->register(
\'hello\' // method name
);
// Define the method as a PHP function
function hello($names) {
for ($i = 0; $i < count($names); $i++) {
$retval[$i] = \'Hello, \' . $names[$i];
}

return $retval;
}
// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : \'\';
$server->service($HTTP_RAW_POST_DATA);
?>

客户端要改变的只是传递的参数是一个数组的名字,而不是单个标量的值。

// Pull in the NuSOAP code
require_once(\'nusoap.php\');
// Create the client instance
$client = new soapclient(\'http://localhost/phphack/helloworld5.php\');
// Check for an error
$err = $client->getError();
if ($err) {
// Display the error
echo \'

Constructor error: \' . $err . \'

\';
// At this point, you know the call that follows will fail
}
// Call the SOAP method
$names = array(\'Scott\', \'Albert\', \'Robert\', \'Phyllis\');
$result = $client->call(
\'hello\', // method name
array(\'names\' => $names) // input parameters
);
// Check for a fault
if ($client->fault) {
echo \'

Fault: \';
print_r($result);
echo \'

\';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo \'

Error: \' . $err . \'

\';
} else {
// Display the result
print_r($result);
}
}
?>

请求和响应的信息如下:

POST /phphack/helloworld5.php HTTP/1.0
User-Agent: NuSOAP/0.6.3
Host: localhost:80
Content-Type: text/xml; charset=\"ISO-8859-1\"
Content-Length: 736
SOAPAction: \"\"


SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"
xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\"
xmlns:si=\"http://soapinterop.org/xsd\">



Scott
Albert
Robert
Phyllis





HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Thu, 29 May 2003 18:46:12 GMT
X-Powered-By: PHP/4.0.6
Server: NuSOAP Server v0.6.3
Connection: Close
Content-Type: text/xml; charset=UTF-8
Content-Length: 743


SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"
xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\"
xmlns:si=\"http://soapinterop.org/xsd\">



Hello, Scott
Hello, Albert
Hello, Robert
Hello, Phyllis





SOAP Structs

我们已经使用标量类型和数组标量作为参数和返回值开发过实例,在这一部分,我将会使用SOAP 结构,在 XML 结构中它或多或少地符合复杂类型。这个例子是另一个不同的 Hello, World ,这次使用结构为参数来提供更多的问候信息。

NuSOAP 利用 PHP 的功能,使用关联数组来表现 SOAP 结构,这个例子,我们会使用一个包含了名字,年龄和性别的数组,在 PHP 中会像这样:

$person = array(
\'firstname\' => \'Betty\',
\'age\' => 32,
\'gender\' => \'female\'
);

这个 service 接受一个上面显示的关联数组为参数,它返回另一个数组:

$return = array(
\'greeting\' => \'Hello...\',
\'winner\' => false
);

service 的代码:

// Pull in the NuSOAP code
require_once(\'nusoap.php\');
// Create the server instance
$server = new soap_server;
// Register the method to expose
$server->register(
\'hello\' // method name
);
// Define the method as a PHP function
function hello($person) {
$greeting = \'Hello, \' . $person[\'firstname\'] .
\'. It is nice to meet a \' . $person[\'age\'] .
\' year old \' . $person[\'gender\'] . \'.\';

$winner = $person[\'firstname\'] == \'Scott\';

$retval = array(
\'greeting\' => $greeting,
\'winner\' => $winner
);

return new soapval(\'return\', \'ContestInfo\', $retval, false, \'urn:MyURN\');
}
// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : \'\';
$server->service($HTTP_RAW_POST_DATA);
?>

要注意的一件事情是 service 方法返回的是一个 soapval,所以这里的 xml 数据类型 urn:MyURN:ContestInfo 已可以被指定为返回值。

这里是客户端代码:

// Pull in the NuSOAP code
require_once(\'nusoap.php\');
// Create the client instance
$client = new soapclient(\'http://localhost/phphack/helloworld6.php\');
// Check for an error
$err = $client->getError();
if ($err) {
// Display the error
echo \'

Constructor error: \' . $err . \'

\';
// At this point, you know the call that follows will fail
}
// Call the SOAP method
$person = array(\'firstname\' => \'Willi\', \'age\' => 22, \'gender\' => \'male\');
$result = $client->call(
\'hello\', // method name
array(\'person\' => new soapval(\'person\', \'Person\',
$person, false, \'urn:MyURN\')) // input parameters
);
// Check for a fault
if ($client->fault) {
echo \'

Fault: \';
print_r($result);
echo \'

\';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo \'

Error: \' . $err . \'

\';
} else {
// Display the result
print_r($result);
}
}
?>

像服务器端,这里使用一个 soapval 为参数,以便 XML 数据类型 urn:MyURN:Person 可以被指定。

请求和响应的信息如下:

POST /phphack/helloworld6.php HTTP/1.0
User-Agent: NuSOAP/0.6.3
Host: localhost:80
Content-Type: text/xml; charset=\"ISO-8859-1\"
Content-Length: 688
SOAPAction: \"\"


SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"
xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\"
xmlns:si=\"http://soapinterop.org/xsd\">



Willi
22
male





HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Thu, 29 May 2003 19:50:30 GMT
X-Powered-By: PHP/4.0.6
Server: NuSOAP Server v0.6.3
Connection: Close
Content-Type: text/xml; charset=UTF-8
Content-Length: 679


SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"
xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\"
xmlns:si=\"http://soapinterop.org/xsd\">


xsi:type=\"ns7437:ContestInfo\">

Hello, Willi. It is nice to meet a 22 year old male.

0





这个实例已经展示了如何发送一个 SOAP 结构参数和返回结果,它也展示了如何指定每个结构的 XML 类型。没有附加的工具,使用这些类型服务器端和客户端的交互遵守了这些结构的约定就可以进行高级的请求和交互。这是原生的 SOAP 1.1 规范的极大的自由之一,但是他也引起了交互的问题。这个系列的下一篇文章将会展示如何使用 WSDL 来为 web service 提供metadata ,也包括我们在使用的数据结构。

2008年9月25日星期四

PHP字符串函数库

AddSlashes: 字符串加入斜线。
bin2hex: 二进位转成十六进位。
Chop: 去除连续空白。
Chr: 返回序数值的字符。
chunk_split: 将字符串分成小段。
convert_cyr_string: 转换古斯拉夫字符串成其它字符串。
crypt: 将字符串用 DES 编码加密。
echo: 输出字符串。
explode: 切开字符串。
flush: 清出输出缓冲区。
get_meta_tags: 抽出文件所有 meta 标记的资料。
htmlspecialchars: 将特殊字符转成 HTML 格式。
htmlentities: 将所有的字符都转成 HTML 字符串。
implode: 将数组变成字符串。
join: 将数组变成字符串。
ltrim: 去除连续空白。
md5: 计算字符串的 MD5 哈稀。
nl2br: 将换行字符转成

Ord: 返回字符的序数值。
parse_str: 解析 query 字符串成变量。
print: 输出字符串。
printf: 输出格式化字符串。
quoted_printable_decode: 将 qp 编码字符串转成 8 位字符串。
QuoteMeta: 加入引用符号。
rawurldecode: 从 URL 专用格式字符串还原成普通字符串。
rawurlencode: 将字符串编码成 URL 专用格式。
setlocale: 配置地域化信息。
similar_text: 计算字符串相似度。
soundex: 计算字符串的读音值
sprintf: 将字符串格式化。
strchr: 寻找第一个出现的字符。
strcmp: 字符串比较。
strcspn: 不同字符串的长度。
strip_tags: 去掉 HTML 及 PHP 的标记。
StripSlashes: 去掉反斜线字符。
strlen: 取得字符串长度。
strrpos: 寻找字符串中某字符最后出现处。
strpos: 寻找字符串中某字符最先出现处。
strrchr: 取得某字符最后出现处起的字符串。
strrev: 颠倒字符串。
strspn: 找出某字符串落在另一字符串遮罩的数目。
strstr: 返回字符串中某字符串开始处至结束的字符串。
strtok: 切开字符串。
strtolower: 字符串全转为小写。
strtoupper: 字符串全转为大写。
str_replace: 字符串取代。
strtr: 转换某些字符。
substr: 取部份字符串。
trim: 截去字符串首尾的空格。
ucfirst: 将字符串第一个字符改大写。
ucwords: 将字符串每个字第一个字母改大写

HTTP 1.1状态代码及其含义

100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)
101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)

200 OK 一切正常,对GET和POST请求的应答文档跟在后面。

201 Created 服务器已经创建了文档,Location头给出了它的URL。

202 Accepted 已经接受请求,但处理尚未完成。

203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。

204 No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。

205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。

206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。

300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。

301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。

302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。
出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。

注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。

严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。

303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。

304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。

307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。(HTTP 1.1新)

400 Bad Request 请求出现语法错误。

401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。

403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。

404 Not Found 无法找到指定位置的资源。这也是一个常用的应答。

405 Method Not Allowed 请求方法(GET、POST、HEAD、Delete、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)

406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。

407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)

408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)

409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)

410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。(HTTP 1.1新)

411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)

412 Precondition Failed 请求头中指定的一些前提条件失败(HTTP 1.1新)。

413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。

414 Request URI Too Long URI太长(HTTP 1.1新)。

416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)

500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。

501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。

502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。

504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)

505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)

流言蜚语

哈哈,本来以为很火星..............
烧录服务......................OMG

Apache 2.2.x for Win32 配置SSL实例。

今天尝试一下给Apache2 配置 SSL。由于MYOA2.2已经使用了Apache 2.2.x,所以暂不考虑Apache 2.0.x,但操作应该是通用的。

一、准备工作:
1.获取Apache2.2 for Win32。例如 apache_2.2.8-win32-x86-openssl-0.9.8g.msi
2.获取OpenSSL,如果下载的Aapche 2.2 for Win32已经包含OpenSSL则不用重复下载。

二、安装Apache2.2——这个我早就安装了,但是不带SSL的。可以将ssleay32.dll和libeay32.dll两个库和openssl.exe集中到一个地方,下一步要用。

三、获取SSL用到server.crt(证书)和server.key(密钥)。这个时候我们还需要一个 openssl.cnf 配置文件。一般 openssl 包都会自带,例如 Apache2.2.x with SSL就有。
1.执行 openssl req -new -out server.csr -config openssl.cnf ,会提示你输入一些内容,其中

Loading \'screen\' into random state - done
Generating a 1024 bit RSA private key
....................++++++
....++++++
writing new private key to \'privkey.pem\'
Enter PEM pass phrase: none
Verifying - Enter PEM pass phrase: none
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter \'.\', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:GUANGDONG
Locality Name (eg, city) []:FOSHAN
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CCJTJ
Organizational Unit Name (eg, section) []:OFFICE
Common Name (eg, YOUR name) []:192.168.1.39 (这里要输入要做SSL的主机地址,或者域名)
Email Address []:

Please enter the following \'extra\' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

以上输入完后,可以得到一个 server.csr 和 privkey.pem,

2.执行openssl rsa -in privkey.pem -out server.key 生成服务器密钥 server.key

Enter pass phrase for privkey.pem: none (跟第1步输入的PEM pass phrase一样)
writing RSA key

3.执行 openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650 ,创建自签证书 server.crt

四、完成之后,将生成的server.crt和server.key这两个文件拷贝到apache的conf目录下

五、修改Apache配置文件:
1.conf/httpd.conf
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf

2.conf/extra/httpd-ssl.conf


# General setup for the virtual host
DocumentRoot \"D:/webs/projects_5\" //修改成https方式的默认文件夹
ServerName www.open-src.com:443 //这个应该不一定改为同上面输入的Common Name一样。只要访问时输入 https://common name/ 并不会提示证书无效

六、重启Apache服务,应该可以通过 https 访问了

在网上有些参考文章中,是要对 httpd-ssl.conf 做一些修改的。但是我对照过,都是修改成默认值。如果按照以上步骤来操作,则不需要修改其他东西了。
另外一点就是要深化一下,注意上面的,应该可以利用虚拟主机的设置来实现不同的IP或域名,使用不同的证书实现SSL连接。关键是针对不同的IP或域名生成不同的密钥和证书,然后在VHOST内配置不同的指向。

PHP中使用XML-RPC构造Web Service简单入门

[ Web Service介绍 ]

Web Service就是为了异构系统的通信而产生的,它基本的思想就是使用基于XML的HTTP的远程调用提供一种标准的机制,而省去建立一种新协议的需求。目前进行Web Service通信有两种协议标准,一种是XML-RPC,另外一种是SOAP。XML-RPC比较简单,出现时间比较早,SOAP比较复杂,主要是一些需要稳定、健壮、安全并且复杂交互的时候使用。

PHP中集成了XML-RPC和SOAP两种协议的访问,都是集中在xmlrpc扩展当中。另外,在PHP的PEAR中,不管是PHP 4还是PHP 5,都已经默认集成了XML-RPC扩展,而且该扩展跟xmlrpc扩展无关,能够独立实现XML-RPC的协议交互,如果没有xmlrpc扩展,建议使用PEAR::XML-RPC扩展。

我们这里主要是以XML-RPC来简单描述Web Service的交互过程,部分内容来自PHP手册,更详细内容,建议参考手册。


[ 安装xmlrpc扩展 ]

如果你的系统中没有安装xmlrpc的php扩展,那么请正确安装。

在Windows平台下,首先把PHP安装目录下的扩展php_xmlrpc.dll放到C:\\Windows或者C:\\Winnt目录下,(PHP4的扩展在C:\\php\\extensions目录中,PHP5的扩展在C:\\php\\ext目录中),同时在C:\\Windows\\php.ini或者C:\\Winnt\\php.ini中把extension=php_xmlrpc.dll前面的分号\";\"去掉,然后重启Web服务器后查看phpinfo()有没有XML-RPC项目就能够确定是否已经正确安装xmlrpc扩展。

在Unix/Linux平台下,如果没有安装xmlrpc扩展,请在重新编译PHP,在configure的时候请加入 --with-xmlrpc 选项,然后查看phpinfo()看是否正常安装xmlrpc。

(注意:以下操作都是建立在xmlrpc扩张正常安装前提下,请务必正确安装。)


[ XML-RPC工作原理 ]

XML-RPC大致就是整个过程就是使用XML来进行通信。首先构造一个RPC 服务器端用来出来从RPC客户端传递过来的使用XML封装的请求,并且把处理结果通过XML的形式返回给RPC客户端,客户端就去分析XML获取自己需要的数据。

XML-RPC的服务器端必须有现成的函数提供给客户端调用,并且客户端提交的请求中的函数和方法必须和服务器端的一致,否则将无法获取所需要的结果。

下面我进行简单的代码来描述整个过程。


[ XML-RPC实践 ]

服务器端使用xmlrpc_server_create函数产生一个服务器端,然后把需要需要暴露的RPC调用接口进行注册,接受RPC客户端POST过来的XML数据,然后进行处理,处理结果通过XML的形式显示给客户端。

代码如下: rpc_server.php

/**
* 函数:提供给RPC客户端调用的函数
* 参数:
* $method 客户端需要调用的函数
* $params 客户端需要调用的函数的参数数组
* 返回:返回指定调用结果
*/
function rpc_server_func($method, $params) {
$parameter = $params[0];
if ($parameter == \"get\")
{
$return = \'\'This data by get method\'\';
}
else
{
$return = \'\'Not specify method or params\'\';
}
return $return;
}

//产生一个XML-RPC的服务器端
$xmlrpc_server = xmlrpc_server_create();

//注册一个服务器端调用的方法rpc_server,实际指向的是rpc_server_func函数
xmlrpc_server_register_method($xmlrpc_server, \"rpc_server\", \"rpc_server_func\");

//接受客户端POST过来的XML数据
$request = $HTTP_RAW_POST_DATA;

//执行调用客户端的XML请求后获取执行结果
$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null);

//把函数处理后的结果XML进行输出
header(\'\'Content-Type: text/xml\'\');
echo $xmlrpc_response;

//销毁XML-RPC服务器端资源
xmlrpc_server_destroy($xmlrpc_server);
?>

服务器端构造好了,那么再构造我们的RPC客户端。客户端大致通过Socket访问XML-RPC服务器端的80端口,然后把需要调用的RPC接口封装到XML里,通过POST请求提交给RPC服务器端,最后获取服务器端返回结果。

代码如下:rpc_client.php

/**
* 函数:提供给客户端进行连接XML-RPC服务器端的函数
* 参数:
* $host 需要连接的主机
* $port 连接主机的端口
* $rpc_server XML-RPC服务器端文件
* $request 封装的XML请求信息
* 返回:连接成功成功返回由服务器端返回的XML信息,失败返回false
*/
function rpc_client_call($host, $port, $rpc_server, $request) {

//打开指定的服务器端
$fp = fsockopen($host, $port);

//构造需要进行通信的XML-RPC服务器端的查询POST请求信息
$query = \"POST $rpc_server HTTP/1.0\\nUser_Agent: XML-RPC Client\\nHost: \".$host.\"\\nContent-Type: text/xml\\nContent-Length: \".strlen($request).\"\\n\\n\".$request.\"\\n\";

//把构造好的HTTP协议发送给服务器,失败返回false
if (!fputs($fp, $query, strlen($query)))
{
$errstr = \"Write error\";
return false;
}

//获取从服务器端返回的所有信息,包括HTTP头和XML信息
$contents = \'\'\'\';
while (!feof($fp))
{
$contents .= fgets($fp);
}

//关闭连接资源后返回获取的内容
fclose($fp);
return $contents;
}

//构造连接RPC服务器端的信息
$host = \'\'localhost\'\';
$port = 80;
$rpc_server = \'\'/~heiyeluren/rpc_server.php\'\';

//把需要发送的XML请求进行编码成XML,需要调用的方法是rpc_server,参数是get
$request = xmlrpc_encode_request(\'\'rpc_server\'\', \'\'get\'\');

//调用rpc_client_call函数把所有请求发送给XML-RPC服务器端后获取信息
$response = rpc_client_call($host, $port, $rpc_server, $request);

//分析从服务器端返回的XML,去掉HTTP头信息,并且把XML转为PHP能识别的字符串
$split = \'\'\'\';
$xml = explode($split, $response);
$xml = $split . array_pop($xml);
$response = xmlrpc_decode($xml);

//输出从RPC服务器端获取的信息
print_r($response);

?>
这样危险的标记过滤掉。最好是在提交得时候就进行过滤,这需要一点正则表达式的知识。

The Cross Site Scripting FAQ at cgisecurity.com provides much more information and background on this type of flaw, and explains it well. I highly recommend reading and understanding it. XSS flaws can be difficult to spot and are one of the easier mistakes to make when programming a PHP application, as illustrated by the high number of XSS advisories issued on the popular security mailing lists.

SQL注入的危险

SQL injection vulnerabilities are yet another class of input validation flaws. Specifically, they allow for the exploitation of a database query. For example, in your PHP script, you might ask the user for a user ID and password, then check for the user by passing the database a query and checking the result.

SQL注入攻击是另一种输入验证上的漏洞。这种漏洞可以允许执行数据库命令。例如,在你的PHP脚本中,可能会要求用户输入用户ID和密码,然后通过数据库查询获得结果来检查用户ID和密码是否正确。

SELECT * FROM users WHERE name='$username' AND pass='$password';

However, if the user who's logging in is devious, he may enter the following as his password:

但是,如果一个用户在登录时不怀好意,他可能会这样输入密码:

' OR '1'='1

This results in the query being sent to the database as:

执行数据库的命令就成为如下所示:

SELECT * FROM users WHERE name='known_user' AND pass='' OR '1'='1';

This will return the username without validating the password -- the malicious user has gained entry to your application as a user of his choice. To alleviate this problem, you need to escape dangerous characters from the user-submitted values, most particularly the single quotes ('). The simplest way to do this is to use PHP's addslashes() function.

这样就会不经过密码验证而返回用户名——恶意用户就会任意选择用户名登录。为了避免这样的问题,应该对用户提交的数据进行危险字符的过滤,最主要的就是单引号(’)的过滤。一个简单的方法就是用addslashes函数过滤。

$username = addslashes($_POST["username"]);
$password = addslashes($_POST["password"]);

But depending on your PHP configuration, this may not be necessary! PHP's much-reviled magic quotes feature is enabled by default in current versions of PHP. This feature, which can be disabled by setting the magic_quotes_gpc php.ini variable to Off, will automatically apply addslashes to all values submitted via GET, POST or cookies. This feature safeguards against inexperienced developers who might otherwise leave security holes like the one described above, but it has an unfortunate impact on performance when input values do not need to be escaped for use in database queries. Thus, most experienced developers elect to switch this feature off.

但是根据你的PHP设置,也许可以不需要这样做。PHP一个经常被争论的问题就是magic quotes在当前版本中默认设置为启用。这个特性——可以在php.ini文件中设置magic_quotes_gpc变量来禁用——会自动的对 GET,POST和cookie变量进行addslashes过滤。这个特性是针对缺乏经验的开发者有可能留下上文所述的安全漏洞,但是在不需要过滤的情况下,会对性能产生一些负面影响。所以,大多数有经验的开发者都会关掉这个特性。

If you're developing software that may be installed on shared servers where you might not be able to change the php.ini file, use code to check that status of magic_quotes_gpc and, if it is turned on, pass all input values through PHP's stripslashes() function. You can then apply addslashes() to any values destined for use in database queries as you would normally.

如果你是在共享主机上开发软件,可能会没有权限修改php.ini,那么用函数检查magic_quotes_gpc选项的设置,如果是启用,则将所有输入得数据用stripslashes函数过滤掉转义,然后再像往常一样对需要的数据进行addslashes过滤。

if (get_magic_quotes_gpc()){
$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
}

SQL injection flaws do not always lead to privilege escalation. For instance, they can allow a malicious user to output selected database records if the result of the query is printed to your HTML output.

通常SQL注入不会导致用户权限上的问题,只会允许恶意用户获得某些特定数据库和数据表中的内容。

You should always check user-provided data that will be used in a query for the characters '",;() and, possibly, for the keywords "FROM", "LIKE", and "WHERE" in a case-insensitive fashion. These are the characters and keywords that are useful in a SQL insertion attack, so if you strip them from user inputs in which they're unnecessary, you'll have much less to worry about from this type of flaw.

你应当检查用户提交的所有数据,其中可能包含数据库命令用到的字符例如单引号,双引号,逗号,分号和括号。如果可能,对“FROM”,“LIKE”和 “WHERE”这样的关键词进行不区分大小写的检查。这些都是SQL注入攻击中常用的字符和关键词,如果你不需要用到他们则将他们过滤调,这样此类攻击的危险就会大大降低。

Error Reporting

错误报告

You should ensure that your display_errors php.ini value is set to "0". Otherwise, any errors that are encountered in your code, such as database connection errors, will be output to the end user's browser. A malicious user could leverage this flaw to gain information about the internal workings of your application, simply by providing bad input and reading the error messages that result.

你应当确保php.ini中display_errors重的设置为0,否则,你的代码产生的任何错误,例如数据库连接错误,将会显示在最终用户面前。一个恶意用户只要输入一些非法数据然后观察、分析错误信息,就会获得程序内部运行机制的一些信息。

The display_errors value can be set at runtime using the ini_set function, but this is not as desirable as setting it in the ini file, since a fatal compilation error of your script will still be displayed: if the script has a fatal error and cannot run, the ini_set function is not run.

Display_errors的值可以在运行期间通过ini_set函数来设置,但仍然不如通过在php.ini中设置。如果你的脚本发生了一个致命错误而终止了运行,那么ini_set函数就不会起作用,错误信息仍然会被显示。

Instead of displaying errors, set the error_log ini variable to "1" and check your PHP error log frequently for caught errors. Alternatively, you can develop your own error handling functions that are automatically invoked when PHP encounters an error, and can email you or execute other PHP code of your choice. This is a wise precaution to take, as you will be notified of an error and have it fixed possibly before malicious users even know the problem exists. Read the PHP manual pages on error handling and learn about the set_error_handler() function.

为了替代直接显示错误信息,把ini中的error_log设为1,并且经常检查PHP的错误日志来获取错误信息。通常,你也可以写一个自己的错误处理函数来处理PHP中产生的错误,并可以用email通知你或者执行特定的一段PHP代码。在恶意用户知道一个可能的错误产生之前就将错误修复,这是一个明智的事先准备工作,。可以去PHP手册中的错误处理部分看一下set_error_handler函数的用法。

Data Handling Errors

数据处理错误

Data handling errors aren't specific to PHP per se, but PHP application developers still need to be aware of them. This class of error arises when data is handled in an insecure manner, which makes it available to possible interception or modification by malicious parties.

数据处理错误并非只针对PHP,但PHP的开发人员仍然需要注意。此类错误通常是因为采用了不安全数据处理方法,而且会导致恶意用户对数据的监听或者修改。

The most common type of data handling error is in the unencrypted HTTP transmission of sensitive data that should be transmitted via HTTPS. Credit card numbers and customer information are the most common types of secured data, but if you transmit usernames and passwords over a regular HTTP connection, and those usernames and passwords allow access to sensitive material, you might as well transmit the sensitive material itself over an unencrypted connection. Use SSL security whenever you transmit sensitive data from your application to a user's browser. Otherwise, a malicious eavesdropper on any router between your server and the end user can very easily sniff the sensitive information out of the network packets.

最常见的数据处理错误就是将本来应该通过HTTPS传送的数据在未加密的HTTP上传输。信用卡密码和用户个人信息应该是作为私密的安全信息来处理,但是如果你通过普通的HTTP连接来传输用户名和密码,那么你也很可能用这种未加密的方式来传输那些敏感的数据。在你的应用程序和用户的浏览器通讯时,一定用 SSL安全连接来传输敏感的信息。否则,恶意的监听者就可以在你的应用程序与最终用户之间的任何路由器上通过数据包探嗅到那些敏感的信息。

The same type of risk can occur when applications are updated using FTP, which is an insecure protocol. Transferring a PHP file that contains database passwords to your remote Webserver over an insecure protocol like FTP can allow an eavesdropper to sniff the packets and reveal your password. Always use a secure protocol like SFTP or SCP to transmit sensitive files. Never allow sensitive information to be sent by your application via email, either. An email message is readable by anyone who's capable of reading the network traffic. A good rule of thumb is that if you wouldn't write the information on the back of a postcard and put it through the mail, you shouldn't send it via email, either. The chance anyone will actually intercept the message may be low, but why risk it?

在使用FTP这种不安全的协议时会承担同样的风险。用FTP上传包含数据库用户名和密码的PHP文件到远程WEB服务器时,恶意的监听者就会通过探嗅数据包来获得密码。一定要用SFTP或者SCP协议来传输敏感的文件,也不要用email来传输敏感信息。对于任何有能力获得网络传输数据的人来说,email的信息都是可读的。就像你不会把重要信息写在明信片的背面然后投到信箱里一样,你也不要用email来传递这些信息。虽然实际上这些信息被监听的机会很小,但是为什么要承担这个风险?

It's important to minimize your exposure to data handling flaws. For example, if your application is an online store, is it necessary to save the credit card numbers attached to orders that are more than six months old? Archive the data and store it offline, limiting the amount of data that can be compromised if your Webserver is breached. It's basic security practice not only to attempt to prevent an intrusion or compromise, but also to mitigate the negative effects of a successful compromise. No security system is ever perfect, so don't assume that yours is. Take steps to minimize the fallout if you do suffer a penetration.

重要的一点就是尽可能的减少暴露数据处理错误的漏洞。例如,如果你的应用程序是一个在线商店,对那些6个月之前的信用卡号和订单还有必要保存么?将他们放在一个离线的机器上作为存档,并对这些数据的数量做一个限制防止万一这些机器被非法入侵。对于阻止入侵和减少安全威胁,或者是尽可能的减少一次成功黑客的攻击所带来的损失,这些都是最基本的原则。没有一个安全系统是完美的,所以不要存有侥幸心理。如果你存在入侵的风险一定要采取措施来减少损失。

Configuring PHP For Security

配置PHP的安全选项

Generally, most new PHP installations that use recent PHP releases are configured with much stronger security defaults than was standard in past PHP releases. However, your application may be installed on a legacy server that has had its version of PHP upgraded, but not the php.ini file. In this case, the default settings may not be as secure as the default settings on a fresh install.

通常来讲,通过最新发布的PHP来进行安装,比起之前发布的PHP,都会获得更见安全的配置选项。你的应用程序也许会放在一个通过升级来获得最新PHP版本的web服务器上,但是php.ini没有升级。在这种情况下,默认设置也许就不会像新的安装一样安全。

You should create a page that calls the phpinfo() function to list your php.ini variables and scan them for insecure settings. Keep this page in a restricted place and do not allow public access to it. The output of phpinfo() contains information that a potential hacker might find extremely useful.

你应当创建一个包含phpinfo()函数的页面,列出你的php.ini变量来检查不安全的设置。把这个页面保存在特定的地方,不要让公共人员可以访问。Phpinfo()产生的信息会包含那些对黑客十分有用的信息。

Some settings to consider when configuring PHP for security include:

配置PHP安全选项时下面是要考虑到的:

1. register_globals: The boogeyman of PHP security is register_globals, which used to default to "on" in older releases of PHP but has since been changed to default to "off". It exports all user input as global variables. Check this setting and disable it -- no buts, no exceptions. Just do it! This setting is possibly responsible for more PHP security flaws than any other single cause. If you're on a shared host, and they won't let you disable register_globals, get a new host!

2. safe_mode: The safe mode setting can be very useful to prevent unauthorized access to local system files. It works by only allowing the reading of files that are owned by the user account that owns the executing PHP script. If your application opens local files often, consider enabling this setting.

3. disable_functions: This setting can only be set in your php.ini file, not at runtime. It can be set to a list of functions that you would like disabled in your PHP installation. It can help prevent the possible execution of harmful PHP code. Some functions that are useful to disable if you do not use them are system and exec, which allow the execution of external programs.

1. Register_globalsHP 安全的最大杀手就是register_globals。在PHP过去的版本中这个设置默认是为on的,但是在最近的版本中关掉了此项设置。这个选项可以把用户所有的输入作为全局变量,你所要做的就是检查这这项设置并且关掉它——没有但是,也没有例外,一定要这样做!这项设置是其他PHP安全漏洞最大的潜在隐患,如果你在使用共享主机但是却不能禁止register_globals,那么就换一个空间服务商!

2. Safe_mode:阻止未授权的用户访问本地文件系统,这个选项是十分有用的。它只允许拥有此脚本的用户来执行读文件的操作。如果你的应用程序经常打开本地文件,记住要启用此项设置。

3. Disable_functions:这项设置不能在运行期间修改,只能在php.ini文件中设置。你可以在此项设置中创建一个函数列表来禁用这些函数。这样就能阻止潜在的危险的PHP代码的执行。system和exec函数如果你用不到的话,就将他们禁用,因为这些函数允许执行内部其他程序。

Read the security section of the PHP manual and get to know it well. Treat it as material for a test you'll take and get to know it backwards and forwards. You will be tested on the material by the hackers who will indubitably attempt to penetrate your site. You get a passing grade on the test if the hackers give up and move on to an easier target whose grasp of these concepts is insufficient.

去读一下PHP手册中的安全部分,那么你就可以更好的了解这些。把这当作一次测试,你就可以更好的了解来龙去脉。一些黑客在尝试入侵你的站点时你的安全知识就会得到检验。如果那些黑客放弃了攻击或者转向其他更容易攻击的对象,那么你就通过了考试。

Further Reading

The following sites are recommended reading to maintain your security knowledge. New flaws and new forms of exploits are discovered all the time, so you cannot afford to rest on your laurels and assume you have all the bases covered. As I stated in the introduction to this article, "Security is a process", but security education is also a process, and your knowledge must be maintained.

推荐你去下面的站点看一下来获取更多的安全知识。新的漏洞和入侵一直都在被发现,所以对于以往的成功安全措施没有任何值得骄傲的地方,一定要有未雨绸缪的心态。正如我在文章开始所说,“安全措施是一个过程”,同样学习安全知识也是一个过程,你必须要牢牢掌握这些知识。

OWASP, The Open Web Application Security Project, is a non-profit oganisation dedicated to "finding and fighting the causes of insecure software". The resources it provides are invaluable and the group has many local chapters that hold regular meetings with seminars and roundtable discussions. Highly recommended.

OWASP, The Open Web Application Security Project,一个致力于软件不安全因素收集和研究的非盈利性组织。他们所提供的资源是无法估量的,并且他们定期举行研讨会和一些非正式的讨论。强烈推荐。

CGISecurity.Net is another good site dealing with Web application security. They have some interesting FAQs and more in-depth documentation on some of the types of flaws I've discussed in this article.

CGISecurity.Net是另一个关注web应用安全的站点。他们有一些很有趣的常见问题集锦,对我在上文提到得一些安全问题也有更深的讨论。

The security section of the PHP Manual is a key resource that I mentioned above, but I include it here again, since it's full of great information that's directly applicable to PHP. Don't gloss over the comments at the bottom of each page: some of the best and most up-to-date information can be found in the user-contributed notes.

The security section of the PHP Manual有很多与PHP直接相关的非常有用的信息,我在上文已经提到过,但还要在这里强调一次。不要忽视每一页下面的用户评论,一些相当不错的最新信息都会在这里找到。

The PHP Security Consortium offers a library with links to other helpful resources, PHP-specific summaries of the SecurityFocus newsletters, the PHP Security Guide, and a couple of articles.

The PHP Security Consortium提供一个连接到其他资源的库,针对PHP的安全新闻通讯,PHP安全向导和一些文章。

The BugTraq mailing list is a great source of security related advisories that you should read if you're interested in security in general. You may be shocked by the number of advisories that involve popular PHP applications allowing SQL insertion, Cross Site Scripting and some of the other flaws I've discussed here.

The BugTraq mailing list是一个很大的安全资讯站点,如果你对安全方面感兴趣,一定要看一下。这里有很多关于PHP的SQL注入,跨站脚本攻击的安全建议,并且数量惊人。

Linux Security is another good site that is not necessarily restricted to PHP but, since you are likely running a Linux Webserver to host your PHP applications, it's useful to try to stay up to date on the latest advisories and news related to your chosen Linux distribution. Don't assume your hosting company is on top of these developments; be aware on your own -- your security is only as good as your weakest point. It does you no good to have a tightly secured PHP application running on a server with an outdated service that exposes a well-known and exploitable flaw.

Linux Security是一个不错的站点,虽然并非只针对PHP,但是如果你在一台Linux服务器上运行PHP,在这里多读一些关于你所用Linux版本的安全资讯还是很有用的。不要以为你的空间服务商总是把安全措施做的很好,你自己就要注意——像对待你的缺点一样改正它们。在一个存有常见安全漏洞并且没有及时更新的服务器上运行对安全要求很高的PHP脚本,是没有一点好处的。

Conclusions

总结

As I've shown in this article, there are many things to be aware of when programming secure PHP applications, though this is true with any language, and any server platform. PHP is no less secure than many other common development languages. The most important thing is to develop a proper security mindset and to know your tools well. I hope you enjoyed this article and learned something as well! Remember: just because you're paranoid doesn't mean there's no one out to get you.

正如本文所述,像其他语言和平台一样,PHP编程需要注意很多安全方面的问题。PHP和其他许多编程语言一样,本身是十分安全的。最重要的就是有一个正确的安全理念,并且对PHP要相当熟悉。我希望你能喜欢这篇文章并且能从中获益。记住:对于安全问题,不要存在任何侥幸心理!