处理PHP中Session机制导致阻塞问题

PHP 2019-12-24 715 次浏览 次点赞

有时候造成卡顿的是PHP本身的处理方式

起步

一个页面内发起多个 ajax 请求,发现很卡,估摸着后台阻塞了。阻塞的原因这次定位到了 Session 机制上了。session 存储使用的是默认的文件存储。

阻塞的原因

阻塞的原因的开启会话的 session_start() ,程序会取得文件的独占锁,其他请求想读或写都要先等它释放。而锁的释放只有在该请求处理结束后,才会释放。这也就造成了当某一个用户多个请求造成阻塞的原因了。

这个当然不是 bug,这属于php中机制的部分:

Thank you for taking the time to write to us, but this is not a bug.This is expected, the session file is locked to avoid corruption.

会话数据被锁定以防止并发写入,因此任何时候任何会话都只能对一个脚本进行操作。

手动释放锁

手动执行 session_write_close() 就可以释放文件独占锁。它的作用就是将 $_SESSION 写入文件,关闭 session 文件即解除锁定。所以解决的方法就是在使用 $_SESSION 后都手动调用下关闭文件的函数:

<?php
session_start();
$_SESSION["count"]=1;
session_write_close();

session_start();  // 需要修改时重新打开
$_SESSION["count"]=3;
session_write_close();

$count = $_SESSION["count"];  // 若是只读操作,不需要session_start

这个方式有些小瑕疵,那就是由于执行多次 session_start() ,响应头部会有多个 set-cookie

20191224132517.png

虽然不影响程序的运行,但对代码洁癖的人就有点受不了。但如果 session_write_close() 前没有 session_start() 的话,数据写不到文件。所以目前我也没什么好办法解决这个瑕疵,如果后续找到的话我再跟进。


本文由 hongweipeng 创作,采用 署名-非商业性使用-相同方式共享 3.0,可自由转载、引用,但需署名作者且注明文章出处。

赏个馒头吧