AImager

通过session_start开启一个会话session,流程如下(参考5.6.31源码)

  • static PHP_FUNCTION(session_start)
    • 检查session_id(它是以全局配置项存在的,通过PS()访问全局配置项)是否异常(如存在但长度为0),无异常开始初始化。
    • php_session_start(TSRMLS_C);
      • 检查配置,session状态,session的管理形式(cookie还是file等),没问题继续。
      • 依次按照_COOKIE/_GET/_POST/URL的顺序查找是否已经存在session_id。
      • 检查当前请求是否被外部站点引用,该外部站点会使先前发现的session_id失效。
      • 特殊字符检查
      • php_session_initialize(TSRMLS_C);
        • 如果id不存在,则通过s_create_sid创建
        • 一些参数检验和操作
      • gc和cache等收尾工作

session_id($id = null)用于设置和读取session_id,如果是设置就必须放在session_start()之前才能生效。WHY?

$_SESSION会在会话结束前被序列化,然后写入session存储。

当session以文件存储的时候,会存在锁的问题,文件锁会从session_start()持续到会话结束或执行session_​write_​close(),因此单个页面ajax过多的时候,会容易阻塞,再加上并发的影响,很可能拖垮服务器,所以最好尽快执行session_​write_​close()

配置解释

TODO

  • use_trans_sid

参考链接