使用fastcgi_finish_request提高页面响应速度
当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法.按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行,就可以使用这个方法.
听起来可能有些茫然,我们通过几个例子来说明一下:
<?php echo '例子:'; fastcgi_finish_request(); /* 响应完成, 关闭连接 */ /* 记录日志 */ file_put_contents('log.txt', '生存还是毁灭,这是个问题.'); ?>
通过浏览器访问此脚本, 结果发现并没有输出相应的字符串,但却生成了相应的文件.由此说明在调用fastcgi_finish_request后,客户端响应就已经结束,但与此同时服务端脚本却继续运行!
更多 »
ISBN的校验
维基百科提供的ISBN码校验算法:
校验码的计算方法(10码)
假设某国际标准书号号码前9位是:7-309-04547
计算加权和S:S = 7×10+3×9+0×8+9×7+0×6+4×5+5×4+4×3+7×2 = 226
计算S÷11的余数M:M = 226 mod 11 = 6
计算11 – M 的差N:N = 11 ? 6 = 5
如果N = 10,校验码是字母”X”
如果N = 11,校验码是数字”0″
如果N为其他数字,校验码是数字N
所以,本书的校验码是5;如果用户提供的ISBN码是7-309-04547-6,那么校验失败
校验码的计算方法(13码)
假设某国际标准书号号码前12位是:978-986-181-728
计算加权和S:S = (9×1)+(7×3)+(8×1)+(9×3)+(8×1)+(6×3)+(1×1)+(8×3)+(1×1)+(7×3)+(2×1)+(8×3) = 164
计算S÷10的余数M:M = 164 mod 10 = 4
计算10 – M 的差N:N = 10 ? 4 = 6
如果N = 10,校验码是数字”0″
如果N为其他数字,校验码是数字N
所以,本书的校验码是6。完整的国际标准书号号码为 ISBN 978-986-181-728-6
下面是在网上看到的一段利用PHP进行ISBN进行校验的函数: 更多 »
关于用户邮箱验证的一个思路
当下很多运营或者应用都会引导用户激活验证注册的Email地址,为了确保获得更可靠的用户(虽然可靠性不是很高),同时也为了避免地址不被滥用,尽力获取更优化的用户资源等等,好处是很多的。
一般在验证流程上都很简单,无非是:根据用户登记的Email发送一个验证邮件,用户收到邮件后,访问一个特定的处理链接,系统接收后,便会确认此人Email通过验证激活。
这个方式简单容易,设计也很方便。
但有一个“问题”,某个用户起初登记了一个A地址,然后通过了验证,过了一阵他又将Email改成了B地址,也通过了验证,可过了一阵又因为某种原因他又将Email改回了A地址,可系统仍旧提示未通过验证,这个挺囧的——当然其实也不是什么大不了的问题,不过个人始终觉得这是一个人性化的考虑。已经通过验证了的邮箱为什么还要再次验证呢?
近期在一个项目上也有类似的处理,因为基于该异想天开的想法,我特意费时巴拉的用了一个新的机制,虽然没人能够看到,但我相信多多少少会让用户觉得有点人味的^_^
具体流程其实很简单,无非是增加一个数据表,用来储存经过验证的Email地址,且每个Email对应一个用户id。
当用户通过验证的时候记录下他的id和Email,以及其他信息(比如验证时间等等)
当用户修改Email的时候,先去到这个数据表内查询该记录是否存在(uid和email同时满足),存在了就表面该用户已经通过验证了,不需要再次发送验证邮件。
uid与Email是作为一个唯一性索引键(UNIQUE)存在的。这样可以确保别人冒用这个Email地址的情况也被认为是通过验证的。 也就是说,只有其本人曾经用过的Email地址才会采用跳过验证的机制。
简单说:
用户A曾经验证通过了a、b、c三个Email地址。 那么日后他无论将Email地址修改变换为这三个任意一个的时候,系统都不会提醒他再次去验证。
如果另一个用户B登记了a地址,那么系统还是要提醒他进行验证的,因为数据表记录下验证通过a地址的用户是A而不是B。
以上就是我在项目中关于用户Email地址验证的一个机制(当然实际操作过程中,还要加入一个验证的条件限制等条件,避免用户频繁的请求,关于这部分处理,相信所有的验证机制都会考虑的。),不一定有什么特别重大的作用,不过觉得还是挺有意思的,记录下来分享一下吧。
一个有意思的函数传参方法
最近在做的项目,虽然有很多前端的东西,现在不喜欢搞前端,觉得特麻烦,累。不如后台程序部分好玩,直接写代码还是很有意思的。
说实话,这么多年始终对于javascript属于入门汉的状态,主要是觉得javascript相对与服务端的PHP来说,不如PHP直接跟数据库打交道有意思。
不过,最近接触了好多jQuery,突然发现javascript原来不需要了解太多了,哈哈。jQuery真的是个好东西。
在使用和制作jQuery扩展的时候,发现jQuery有一个很有趣的函数传参办法,那就是直接利用数组或者已经格式化了的json字符串,这样做的好处显而易见——不必要记住函数参数的具体顺序,哪个在先哪个在后都无所谓。
现在懒得学习了,PHP手册也仅仅找需要的,加之英语实在不太好,所以在我的印象里,似乎php没有类似的方法(当然PHP类的那个不算在内)
晚上无聊的时候,尝试写了一个乱弹代码,觉得还是挺好玩的。 更多 »
关于验证码实现的另一个思路
最近在做一个项目。在涉及到关于忘记密码找回功能时,从用户体验角度去考虑,在申请找回密码表单中只有两个元素——Email输入文本框和一个提交按钮。应该说会很方便。
但在接下来测试的时候,突然发现,虽然方便一些,同时也有关于恶意动作的阻止策略,但某些意外因素仍旧无法避免。
因此考虑加上一个验证码,避免一些纯粹攻击性恶意申请动作(此类动作其实也可以用一个方式进行阻止,不过,因为某些原因在此不方便实现)。
原本验证码打算用一些比较成熟的开源的代码来实现(比如:Discuz!中的验证码类——/include/seccode.class.php就是一个不错的例子),但其实发现类似这些显示出的效果仍旧会出现“人”难识别的情况。
对于机器识别验证码图片字符的机理说实话了解不多,以我的知识,我觉得可能是利用图片色彩加上字库方式去分辨的。既然是这两个因素,那么图片色彩上如果过于复杂显然对于“人”也同样难以识别,这个因素可以大略不去考虑,从字库来说,我觉得如果验证码字符利用非常规字库去显示或许效果会很好——但我不清楚机器将什么字库作为“非常规”,因此,我决定利用图片组合的方式进行构建。
简单说,就是将事先做好的字符图片拼凑起来,字符图片可以使用多套然后随机选取,字符图片上的“字符”利用自己“个性设计”——比如,将常规的字库图形利用图片编辑软件加以变形、缩放等等。考虑到,字符涉及较多,因此设计遵循两个原则:一是要将某些模棱两可的字符排除掉(比如:L、1、i、0、O等),二是根据CSS Sprite的原理,将同类型的字符放到一个图片中——我自己称之为“字符库图片”。
经过设计,得到若干组的 字符库图片,然后再设计多种类型的“背景图片”,作为验证码的背景,略微增加一些识别干扰。设计的原则最重要的就是——易于人类识别。
由于字符是特定个数的(经过我的筛选剩余24个)字母和数字,因此很容易放到一个小的数组里,利用array_rand()函数以及shuffle()函数,很容易生成一个漂亮的随机字符串。利用字符串单元字符的特定“位置(其实与数组的键值是对应的)”可以很方便的在“字符库图片”中找到它的位置。利用imagecopymerge()函数轻松的将它们拼凑在一起。
这样最终就形成了一个验证码的显示。
配合验证码的验证,可以利用私有的加密函数将字符串原形加密后保存在cookie内,对用户提交后进行快速验证。
由于涉及到的数组、图片的数量都不大,因此对于压力负载情况很好。
组合图片不是这个思路的难处,难点在于如何设计“人类”能看懂的字符图形:)另外,对于字符图片的相对位置控制也是一个比较费思量的课题,好在通过一些位置上的计算也可以进行不规则的变化。
思路很简单,写了一个简单的应用类,设计了大概6组“字符库图片”和4组“背景图片”,加上测试也花了整整一个下午的时间,效果自认为还不错。
代码就不上了,其实代码很简单,每个人的算法都可能不一样,主要的难点在于“字符库图片”的设计和排序问题。
谁订阅了我的博客,有兴趣看代码的可以直接朝我要,不贴在这里了^_^
PS:最近做项目用最多的是jQuery,这个框架太爽了。通过这个了解到框架做事的确很轻松,可惜,接触PHP有年头了,某些观念和意识基本已经根深蒂固了,所以到现在还无法使用任何PHP的框架。同时对于面向对象的开发,我个人真的是不入门,我倒觉得面向过程也并非是网上说的一无是处——比如性能、比如理解力等等还是略胜上风的。呵呵,题外话,个人不喜欢(或不上路)并非宣传大家也不要用,事实上,我最近看到开源站最多的比如:ThinkPHP、CakePHP应该都还不错,否则也不会有人去用了(哈哈,我其实对于这两个真的一点都不了解~~)
建议所有的程序开发者一起来保护MySQL——《拯救MySQL》
对于其他程序不甚了解,但就PHP开发来说,估计99%的人都选择MySQL作为数据库,因为MySQL给大家的印象是轻巧、易用并且最重要的是它有一个免费的社区版本,这个版本同它收费版本是完全一样的区别仅在于它的商业版本提供技术服务而已。
作为一个PHPer来说,我自2000年接触PHP,因为没有任何程序语言基础,所以学习起来挺费劲,一直使用文本储存数据,但真的觉得既麻烦又不安全,然后2001年年初的时候第一次开始接触MySQL,对于我无任何数据库语言概念的人来说上手的确有一点点困难,但我清晰的记得,看完了几个例子以后,我便轻松的了解了MySQL知道了它的强大、易用,而且最主要的是它不像Orlce和SQL Server,它是免费的!!
自那个时候起,我慢慢开始了解了这世上还有一些人,在维护着PHP、维护着MySQL、维护着Apache,我知道了一个名词“开源社区”,知道了还有一个免费的操作系统Linux ,知道这世界上还有一群具有创新、共享精神的人……
到现在,熟练使用并在自己项目上应用部署MySQL已经有接近8年的时间了,从MySQL4.0用到MySQL5.1,这个过程是很奇妙的,我从未担心过什么,因为我知道MySQL精神会继续着 ……
突然有一天,我知道了那个卖得很贵的数据库Orcal的东家甲骨文开始“惦记”着MySQL了 ,就我个人的感觉来说,这不是什么好事,如果这个公司或者其他别有用心的公司去收购MySQL,那么可能会带来的两种情况就是:1.为了维护其自身收费的数据库产品,势必会打压MySQL的开发,致使MySQL慢慢落后于其他数据库,导致它的淘汰;2.将MySQL也变成一个完全收费的产品。我个人可能更容易想到第一种情况,如果是那样,那真的是一个灾难……
为此,包括MySQL的创始人Michael Widenius在内的一些人组织了一个《拯救MySQL》的活动,请求所有MySQL的支持者支持和保护MySQL。
刚刚也在上面签名了,做为能力有限的支持者来说,我也许只能做到这些了。
希望支持MySQL的朋友们,一起来救救MySQL,点击进入这个链接填写表单就可以了:http://www.helpmysql.org/cn/petition
不要害怕E文,呵呵,是多语言的,我给的连接是中文版的^_^
看到一个人的博客想写的……
先说一段引子吧,我特喜欢用Opera,虽然还有一些不尽如人意的地方,但越来越喜欢上这个浏览器了。最爱用的功能就是RSS(Opera叫做网摘订阅功能),我订阅了n多的RSS列表,呵呵,大多数都是技术类的,毕竟现在信息量太大找也不好找,而且有的时候忙着也没空满网络乱翻,订阅这个时不时阅读一下挺好的^_^
话说,今儿读到一篇来自博客园的某位PHPer看样子应该是新注册博客园的,发了个博文具体名字不写了,反正是关于求3值最大数的函数的,不知道是自己写的还是转载的,反正函数是: 更多 »
Nginx for Windows
file_get_contents()函数也可以发送HTTP_REFERER
有时候因为某些特殊原因,可能需要伪造浏览器发送的HTTP_REFERER信息,一直来对于这样的情况都使用PHP的一个CURL扩展,虽然功能不错,但某些时候有点不方便。这时候再去仔细研究手册,发现其中的奥妙…… 更多 »
windows下生成目录结构的树状报告
前一阵需要做一个文档,弄一个目录结构的树状报告,原本打算用PHP来写小程序的,尝试了一下发现生成的效果不太好看,也懒得去美化,另辟蹊径,突然发现命令行下有一个tree命令可以实现。 更多 »