在项目开发过程中,曾经有段时间负责系统认证的公共接口的编写,在这个过程中遇到了似曾相识的问题。那就是在session_start 和session_write_close 频繁的调用过程中会导致客户端的请求数据失败,原因是频繁的session_start/close接口的调用, 导致了返回的http头被很多的set-cookie 信息覆盖掉了,引发http头其他内容写不进去了,继而导致了客户遇到的问题。根据官方的说法是consider it as a feature and write the better code, so 在我们编码的时候就要注意这个问题了,写更好的代码, it's funny
我想有人在问,为什么session_start执行之后为什么不能一直开着呢,这样就可以避免这样的问题了,但是问题又来了:如果session_start打开session文件不关闭的话,会导致执行一个第三方exe程序阻塞,执行逻辑停滞. 如果同一个客户端同时发送多个请求,那么后来的请求就会因为session文件被锁住而卡主,不能执行,解决方法是操作完session文件,调用session_write_close关闭句柄,参考如下句话:
如果同一个客户端并发发送多个请求,而每个请求都使用了Session,那么PHP Session锁的存在会导致服务器串行响应这些请 求,而不是并行。这是因为在默认情况下,PHP使用文件存储Session数据。对于每一个新的Session,PHP会创建一个文件,并 持续向其中写入数据。所以,每次调用session_start()方法,就会打开Session文件,并取得文件的独占锁。这样,如果服务 器脚本正在处理一个请求,而客户端又发送了一个同样需要使用Session的请求,那么后一个请求会阻塞,直至前一个请求处 理完成释放了文件上的独占锁。不过,这只限于来自同一个客户端的多个请求,也就是说,来自一个客户端的请求并不会阻 塞另一个客户端的请求。
来源:http://www.infoq.com/cn/news/2015/01/php-session-concurrency-problems
因此养成良好的资源释放是很重要的,不能完全依赖程序的自动化,这应该作为一个程序员的修养。