最近公司的网站在访问量大起来后,网站的响应时间经常性的变得很长,页面加载缓慢,经过php-fpm的慢查询日志分析,是session_start()这个函数导致的超时。

网站当中因为许多页面使用ajax发送了多个请求获取数据,并且这些请求大多数还需要操作session。php默认的会话处理器是以文件形式存储在服务器端的(我们的网站也是采用这种方式),为保证session文件中数据的安全,每次只能有一个请求去操作session文件,这个时候session文件就会被加上锁,只能等到脚本执行结束或者session正常关闭才会解锁。
session文件锁定期间,后进来的请求,只能处于等待状态,前面的请求执行结束,后面的请求才能去操作session文件。这就好比厕所里的坑位,先到先得,后面进来的人只能干等着,再着急也没用。

一方面是session锁造成的阻塞,另一方面上在访问量较大的情况下,服务器资源争竞很厉害,相比平时响应时间会有所增加。这么一来,想快都快不起来。

既然是持锁太久造成的阻塞,那就在操作完session后,及时释放文件锁就行了,使用 session_write_close() 函数保存会话数据并释放文件锁。这样问题就解决了。