分类目录归档:Web开发

为PHP的mail()函数配置本地邮件服务器

mail()这个函数不是拿来就能用的,你需要再php.ini中做一些配置。一种方法是使用外部smtp邮件服务器;另一种方法是在本地配置一个邮件服务器。本文介绍如何利用hMailServer软件在本地配置邮件服务器。

hMailServer是一个邮件服务器软件,首先你需要下载并安装它,去这里下载,我下的是5.2版。安装的时候会提示你设置你的邮件服务器密码,记得保存好这个密码。启动hMailServer,输入密码,现在做一些简单的设置,直接照着图做就行了(点小图看大图),稍后解释这么做的目的。

hmailserver-2

hmailserver-3

hmailserver-4

第一步指定本地服务器名localhost,这个没什么好说。

第二步,在”Advanced>>IP Range>>My Computer”里,把POP3和IMAP前面的勾去掉,因为我们并不想用这个服务器收信,也不打算用IMAP协议;把所有的“Require SMTP authentication”选项都去掉是帮PHP扫清发信的障碍。

第三步,在”Advanced>>IP Range>>Internet”中,把SMTP, POP3, IMAP全部去掉,因为我们不想外人使用我们的邮件服务器;同时把“Require SMTP authentication”以加强安全性。

现在本地邮件发送服务器就配置完毕了。最后不要忘记在php.ini中确保以下部分没有被注释掉:

[mail function]
; For Win32 only.
smtp = localhost
smtp_port = 25

; For Win32 only.
sendmail_from = user@yourdomail.com

sendmail_from虽然可以不用设置,但是为了以防万一,最好设置一个默认值。

现在你就可以在本地自由的使用mail()函数了。但是不要乱发垃圾邮件哦!

What is ChkVersion?

ChkVersion是一个面向web专业人员及建站爱好者的工具站点,你可以在这里订阅你正在使用的或是喜欢的建站程序,ChkVersion会定时检查数据库里已有程序的最新版本,每当你订阅的程序有所更新时,会向你的邮箱发送提醒邮件。

你可以针对不同的程序进行单独订阅(图1,图2),也可以在多选后选择合并订阅(图3,图4)。此外,你也可以订阅ChkVersion的RSS Feed来关注所有程序的更新情况。

图1——单独订阅——1:点击“订阅更新”
图1——单独订阅——1:点击“订阅更新”
图2——单独订阅——2:输入用于接收更新信息的邮箱

图2——单独订阅——2:输入用于接收更新信息的邮箱

图3——合并订阅——1:勾选要订阅的程序项目并点击“合并订阅”

图3——合并订阅——1:勾选要订阅的程序项目并点击“合并订阅”

图4——合并订阅——2:输入用于接收更新信息的邮箱

图4——合并订阅——2:输入用于接收更新信息的邮箱

如果你发现ChkVersion还没有收录你正在使用的或是喜欢的建站程序,可以进行程序提交(图5,图6)。

图5——提交新程序——1:点击“提交新程序”

图5——提交新程序——1:点击“提交新程序”

图6——提交新程序——2:填写相关信息并提交

图6——提交新程序——2:填写相关信息并提交

无论进行订阅还是提交程序,都无需注册,且完全免费;如果你有任何关于ChkVersion的意见、建议或问题,请发送邮件至admin#chkversion.com。(#替换为@)

感谢你使用ChkVersion。

ChkVersion由Ven和Viiiix合力设计开发。


以上是“关于ChkVersion”,已经被写在这里了。

ChkVersion源于Viiiix的一个抱怨,他总是搞不清Joomla!什么时候就发布新版本了,于是想弄个小工具能及时提醒自己关注的建站程序的版本更新情况;他的想法和Ven一拍即合,于是就有了ChkVersion的idea雏形。

接下来,Viiiix和Ven一边对想法进行补完,一边着手开发。Viiiix承担了网站中几乎全部的前端设计开发的工作,而Ven则完成了后端程序脚本的编写。经过了一个多月的开发、测试和程序资料的收集,ChkVersion现在已经基本有样子了,可以见人了。于是ChkVersion就被发布出来了。接下来,Viiiix和Ven会继续扩充ChkVersion中的程序收录数量,同时增加新的功能与特性。

感谢使用ChkVersion,希望这个小工具对你有用。

最后,感谢Ray和王二在这个小工具开发阶段给于的关注和帮助。

Google犯下天大错误,5条PHP优化建议遭痛批

首先我承认我有点标题党了,然后:

近日Google 在 Google Code 下的 “Let’s make the web faster” 网站中,发表了一篇名为“PHP performance tips”的文章,介绍了一些php性能优化建议,其中:

  1. 不要随意复制变量
  2. 用单引号表示字符串
  3. 使用echo输出字符串
  4. 不要在echo中使用点号连接符
  5. 使用switch/case代替if/else

这篇文章发表后没多久就立刻遭到了一些PHP社区和个人无情的批驳,他们声称Google错了,错的很彻底,这5条看似有效优化建议其实完全是迷信:

1. 不要随意复制变量

Zend引擎采用了“写时复制”机制,这意味着无论你对变量进行多少次复制,真正的复制动作都仅在变量值改变时才发生。

2. 用单引号表示字符串

无数的基准测试已经证明,使用双引号表示纯字符串并不比使用单引号时慢。有兴趣的朋友也可以重复一下这个测试:

php > $blah=”blah”; $s=microtime(true); for($i=0;$i<100000;$i++) “omgwtf$blah\n”; echo microtime(true)-$s;
0.044615983963013
php > $blah=”blah”; $s=microtime(true); for($i=0;$i<100000;$i++) ‘omgwtf’.$blah.”\n”; echo microtime(true)-$s;
0.042807102203369

3. 使用echo输出字符串

根据php所在服务器环境的不同,某些情况下echo会比print()慢。这里有一篇echo和print()对比的帖子,对echo和print()的速度进行了测试:http://www.learnphponline.com/php-basics/php-echo-vs-print

4. 不要在echo中使用点号连接符

基准测试证明这又是一条与事实完全相反的建议。php引擎处理以点号连接(或者使用双引号)传递给echo的变量实际上是更快的。你可以重复这个测试:

$ php -d implicit_flush=off -r ‘$s=microtime(true); for($i=0;$i<100000;$i++) echo “omgwtf”,”bbq”,”\n”; echo microtime(true)-$s;’ | tail -n 1
1.071463108062710
$ php -d implicit_flush=off -r ‘$s=microtime(true); for($i=0;$i<100000;$i++) echo “omgwtf”.”bbq”.”\n”; echo microtime(true)-$s;’ | tail -n 1
0.44555306434631

5. 使用switch/case代替if/else

这条建议毫无意义。关于是要使用switch/case还是if/else的问题,其实完全是个代码风格问题,而它们的效率相差无几。

一向以技术为长的Google,竟然在技术问题上犯了如此错误,相当不严谨。PHP小组已经督促文章作者重新仔细审查文章,希望能尽快改掉,以正视听。

用PHP在网页上显示psd文件

或许你会有直接在网页上显示psd文件的需要,那么classPhpPsdReader.php能帮助你。这是一个由Tim de Koning在2007年编写的一个基于GD库的PHP类,能够用PHP对图片进行一些操作,包括显示psd文件。这个类兼容PHP4和PHP5,可以放心使用。

使用方法也很简单,上传classPhpPsdReader.php,然后:

就这么简单。

下载classPhpPsdReader.php

Elgg网站迁移指南

Elgg官方文档上的网站迁移部分是有问题的——缺少了一些重要步骤,而且过程更麻烦。正确的方法如下:

  1. 备份网站文件,包括uploads文件夹
  2. 导出数据库
  3. 在数据库文件中,将所有旧域名、网站根路径、uploads文件夹路径替换成新的
  4. 将数据库文件导入新数据库
  5. 上传网站文件,包括uploads文件夹
  6. 删除uploads文件夹中的view_path文件
  7. 编辑/engine/settings.php文件中的数据库配置信息
  8. 如果此时网站仍然不能正常访问,禁用所有插件,再重新启用

官方文档上要求在新服务器上安装elgg,然后删除数据库、导入uploads文件夹。这里缺少了“导入网站文件”一步,而且这样做很麻烦。直接在新服务器上导入数据库和网站文件、uploads文件夹和数据库就行了。

此外官方文档里没有6和8两步。如果view_path不删除,elgg会继续在旧的网站根路径和uploads文件夹路径里寻找文件,从而导致错误。

最后,有些插件在迁移后会出现故障,禁用后再重新激活就好了。

注:以上方法只在Elgg1.5上测试成功,未在旧版本上进行测试。

知识普及:

Elgg是一个开源SNS平台软件,通过组合如博客、微薄、书签、相册、群组等多种插件来打造个性化SNS网站。

广告:

扯Web是一个用Elgg搭建的SNS社区,这个社区的成员来自“扯淡的互联网从业人员”群,欢迎志同道合者加入。目前扯Web实行邮件邀请制,如果需要邀请邮件请给我发邮件或在本日志下留言(不要忘记写上你的邮箱地址)。

认识XFN链接关系

本文原载于WordPress啦!,想想还是在自己博客上也发一下吧。
——————————————————————

WordPress 2.7 的添加友情链接面板和以往版本不一样,多出了一些XFN相关的选项。那这个XFN是什么呢?

xfn-in-wp

XFN(全称XHTML Friends Network)是一种用现超链接来表现人际关系的方式。近年来,blog和blogroll在互联网上增长迅速。XFN允许互联网内容创造者通过在<a>标签里添加rel属性来表明自己与被链接者的关系。

为什么会有XFN?

越来越多的网民开始进入社交媒体网络,他们以各种形式(博客,微博客,社交个人主页等等)在互联网中创建了大量节点。TechnoratiFeedster 这种统计节点关联的服务也随之兴起,他们发掘出社交网络中节点间的连接,但却无法揭示连接背后的人际关系连接。

而XFN就是描述这个人际关系连接的。xfn-btn

怎样使用XFN?

XFN并不是某种神秘的新技术,它只是对传统技术的新应用。XFN通过<a href>标签中的rel属性来标示链接创造者与被链接者之间的关系。

一个传统的链接代码可能是:

<a href=”https://www.mrven.com”>布鲁文的蓝色奇想</a>

而一个XFN的链接会是:

<a href=”https://www.mrven.com”  rel=”friend met colleague”>布鲁文的蓝色奇想</a>

rel=”friend met colleague” 标示出了连接对象与我的关系是:朋友,见过面,同事。注意,这种关系是单向的,是从“我”到“对方”的,我给对方的XFN并不会影响对方给我的XFN。

XFN中共有6个关系分类,每个分类里又有多个具体的关系。一个连接中可以包含多个分类,但是某些分类下的关系类型只能选择一个(比如“家庭关系”),而一旦选中了“me”,那么就不能再放入任何其他的关系类型。以下是XFN中所有的关系类型:

friendship友情,只能选一个
friend 好朋友(一起混的)
acquaintance 熟人 (见面会打招会)
contact 有联系过 (至少你知道如何联系到Ta)
physical 直接接触
met 在真实世界中遇见过
professional 专业
co-worker 共事(一起合作过)
colleague 同事(与你共处同一专业领域)
geographical 地理关系,只能选一个
co-resident 同一区域(住同一个大院,同一个小区,同一个学校等等)
neighbor 邻居
family 家庭关系,只能选一个
child 孩子
parent 父母
sibling 兄弟姐妹
spouse 配偶
kin 亲属
romantic 恋爱关系
muse 我的女神
crush 我迷恋的
date 约会中
sweetheart 甜心
identity 自我识别
me 表示这个链接指向我的另一个节点(网站、网页等)

最后,你还需要给<head>标签加一个profile属性,好让浏览器或搜索引擎知道你的网页支持XFN:

<head profile=”http://gmpg.org/xfn/11″>

仅仅是添加一些代码?XFN有什么实际意义呢?

这个问题难到我了。搜索引擎“应该”是可以识别它的,但我不确定是否有搜索引擎在用XFN做一些有意义的事情。XFN是一项面向未来的标准,但目前,除了能让你的Blogroll更好玩一些,似乎也并没有太多用处。

CSS2.1支持属性选择器,你可以利用XFN给不同关系的友情链接编写不同的css样式。

XFN官方还提出了“XFN网页爬虫特性”的构想。在这一构想中,超链接背后的人际关系将被发觉,6度理论将得到终极的证明。

WordPress中的XFN

WordPress从2.7版本开始内置了XFN功能,在添加Blogroll链接时可以设置XFN属性。

如果你还在使用较早版本的WordPress,XFN Friendlier插件则可以帮你实现XFN。Auto XFN-ify插件能够自动给日志中出现的Blogroll里的链接添加对应的XFN属性。XFN Icons则允许你给不同的XFN属性设置小图标,并显示在Blogroll中。

pChat——无敌PHP图表库

无图无真相,先上图:

example1

example2

example6

example8

example10

example12

上面这些是什么?这可不是Excel做的图表,更不是Photoshop做的,这全是用pChat做的。

pChat是一个面向对象的PHP类,用于创建图表。它是开源的,免费的。数据可以来自SQL查询、CSV文件或者手工录入。然后指定图表样式,一张漂亮的图表就生成了。pChat需要GD库支持。

这里有更多用pChat做的例子可以看,下载pChat请点这里

推荐一本电子教程和一本电子书

《WordPress主题制作教程》

这份教程是由WordPress啦!的小雯子编写,站长百科的大漠孤狼制作的,我参与了审核校对工作。

本文档是WordPress主题制作的入门指导,详细分析了WordPress主题的每个文件,并对常用的函数使用参数做了详细的介绍。只要您具有基本的html及css知识,通过学习本文档就可以掌握WordPress主题的制作了。

下载地址: http://doc.zzbaike.com/wordpress/book/wordpress-themes.pdf

《Apache2.2中文文档》

这是金步国先生翻译的同名文档的PDF版,方便大家打印和阅读。

在线版文档:http://doc.zzbaike.com/apache/2-2/

PDF电子书: http://doc.zzbaike.com/apache/book/apache2.2.pdf

ip-国家查询之MySQL+PHP版

这个IP-国家查询库使用Webnet77整理的数据,包含了9万多个IP段,在免费数据中是最完整的了(原地址)。我把它转换成了MySQL数据表,同时加入了中文国家名。

使用时,先把SQL文件导入数据库。数据库有点大,完整大小8390KB,压缩后1.19MB,如果你无法一次性导入这么大的数据,可以考虑使用一些导入工具,比如Bigdump

查询时,先用ip2long()函数把xxx.xxx.xxx.xxx形式的IP(标准地址)转换成int数据(IPv4地址),然后执行查询:

$query = “SELECT * FROM iptocountry WHERE lower_bound <= $ip AND upper_bound >= $ip”;

详细代码就不写了,大致就是上面的那个意思。

下载SQL文件

解决Zend_Filter_Input中文乱码问题

Zend_Filter_Input默认会给所有通过的数据添加一个HtmlEntities的过滤器。不幸的是,这个HtmlEntities使用的是ISO-8859-1编码,如果你使用的是GB2312或者UTF-8一类的编码,那中文字符就惨了,乱码无疑。

想要避开这个问题,就不能再用$input->field的方式访问数据了,要用$input->getUnescaped(‘field’)的方式,这样会忽略掉默认的HtmlEntities过滤器。如果你仍然喜欢用$input->field的方式,往下看:

一个简单的解决方法是直接去改Zend/Filter/HtmlEntities.php文件,把构造函数(public function __construct($quoteStyle = ENT_COMPAT, $charSet = ‘ISO-8859-1’))里第二个参数的默认值改成你的网站使用的编码。

这个方法还有一个额外的好处,以后当你使用HtmlEntities时也无需再指定编码了。虽然通常不鼓励直接修改Zend Framework的源文件,但是这一点小小的改动不会有什么英系那个。唯一的弊端就是每次升级Zend Framework时必须再改一次。

另一个方法是用别的过滤器替换掉默认的HtmlEntities过滤器。你可以使用其他的标准过滤器,比如StringTrim;也可以模仿HtmlEntities写个你自己的html转移过滤器,用上你自己的网站编码;还可以创建一个空过滤器,不进行任何过滤。然后在实例化Zend_Filter_Input时这样写:

 $myFilter);
$input = new Zend_Filter_Input($filters, $validators, $data, $options);
?>

或者:

setDefaultEscapeFilter($myFilter);
?>

大功告成!