在进行Web应用程序开发的时候,人们经常会用Session存储数据。但可能有人不知道,在PHP中,Session使用不当可能会引起并发问题。印度医疗行业软件解决方案提供商Plus91 Technologies高级工程师Kishan Gor在个人博客上对这个问题进行了阐释。 如果同一个客户端并发发送多个请求,而每个请求都使用了Session,那么PHP Session锁的存在会导致服务器串行响应这些请求,而不是并行。这是因为在默认情况下,PHP使用文件存储Session数据。对于每一个新的 Session,PHP会创建一个文件,并持续向其中写入数据。所以,每次调用session_start()方法,就会打开Session文件,并取得 文件的独占锁。这样,如果服务器脚本正在处理一个请求,而客户端又发送了一个同样需要使用Session的请求,那么后一个请求会阻塞,直至前一个请求处 理完成释放了文件上的独占锁。不过,这只限于来自同一个客户端的多个请求,也就是说,来自一个客户端的请求并不会阻塞另一个客户端的请求。 如果脚本很短,这通常没有问题。但如果脚本运行时间比较长,那就可能会产生问题。在现代Web应用程序开发中,有一个非常常见的情况,就是使用…
PHP:如何实现Hook机制, php钩子函数, php钩子实现
所谓Hook机制,是从Windows编程中流行开的一种技术。其主要思想是提前在可能增加功能的地方埋好(预设)一个钩子,这个钩子并没有实际的意义,当我们需要重新修改或者增加这个地方的逻辑的时候,把扩展的类或者方法挂载到这个点即可。
笔者在学习钩子机制时,参考的是TP3.2.3的tag和Hook机制,使用的是自己开发的MVC框架,其目录风格等均模仿TP3.2.3,让大佬们见笑了。
举个简单的例子,我们现在要写一个用户注册的功能,如下图:
/App/Home/Controller/IndexController.class.php
突然有一天,客户说我需要增加一个功能,新用户注册奖励50积分,那我只好这样写:
客户看了很满意,但是你的另一个同事需要你的代码,你跟他说自己从git上pull。客户又提出一个要求,要在用户注册后给用户发一个邮件(忍住(╬▔皿▔)),那你会这样做:
如果在一个项目中,有大量的类似修改,你该怎么办?就那么修改?项目只会越来越臃肿,越发的杂乱不堪。捅死客户?别闹了,犯法的ㄟ( ▔, ▔ )ㄏ。辞职?想想房贷,再想想妻儿老小,我忍(。・`ω´・)。ps:程序员哪来的妻儿…( ̄∀ ̄)
言归正传,最好解决办法就是使用钩子机制。
首先来看一下我们写的Hook类:
/CutePHP/Lib/Cute/Hook.class.php
这是我仿照TP的Hook写的一个简单的Hook类,该类中包含了一个静态的私有属性Hooks用于记录所有已经注册的钩子
add方法传入钩子的名称和方法,即可将这个钩子存入数组中,listen则是用于监听某个钩子,只要有这个钩子将调用exec方法执行这个钩子
我们来测试一下,首先在/App/Home/Controller.class.php中埋入钩子:
然后在/App/Home/Plugin目录下面建立和钩子一样的文件夹 /App/Home/Plugin/register 下面建立和钩子名一样的文件register.php,写一个简单的类,名称也叫register,下面有个两个方法,一个叫before一个叫after:
然后在项目的公共配置中注册两个钩子:
/App/Conf/Hook.php
那么当我们访问Home下面Index控制器的Register方法时就会显示:
那么具体的原理究竟是怎么实现的呢?首先大家先来简单的了解一下我的这个框架,在Cute核心类中有个一个Start方法,用于加载路由启动框架,并且在加载控制器之前就先把/App/Conf/Hook.php文件加载进来:
那么在这个文件中,我们的代码是这样的:
大家想一下我们Hook的add方法,是把register这个钩子(类)实例化保存到Hooks这个私有数组中,这一步是在listen方法之前,那么我们再用listen方法去监听这个插件,发现存在,就执行一下这个对象的方法,也就实现了钩子的功能。
本文:PHP:如何实现Hook机制, php钩子函数, php钩子实现