Cannot Change Session when sesion is active

  1. 1. 背景
  2. 2. 剖析
  3. 3. 后记

背景

最近把准备把项目直接从PHP5.6 升级到7.3。
升级过程中遇到个比较棘手的问题,那就是出现了大量Cannot change session name when session is active的Warnning。

剖析

我们通常使用session_name($name)来改变session的名称(默认PHPSESSIONID)。而这个warning出现在我们在session_start()之后调用session_name

1
2
3
4
5
6
7
8
9
10
11
12
<?php

session_start();
session_name("hoge");

//echo session_name()."<br/>";
//echo session_id()."<br/>";

session_regenerate_id(true);

echo session_name()."<br/>";
echo session_id()."<br/>";

上面这段,如果使用PHP5.6,则会产生两个cookie。一个是PHPSESSIONID,另一个则是我们变更之后的hoge。echo输出的内容为hoge

1
2
d78ca52754275ef448ea8bff2ef4c051
hoge

环境切换到PHP7.3,我们发现出现了Warnning,然后查看Cookie,我们只看到了PHPSESSIONID

1
2
3
Warning: session_name(): Cannot change session name when session is active in /Users/ning.a.li/workplace/operations/tmp/test.php on line 4
PHPSESSID
tqa2u87v89ul1a7k7srrn8fhf5

原因我知道了,那么为什么会出现这种问题呢?

原来,现有的code在我们开始load framework之前有对session和cookie进行操作,而进入framework之后,由于framework并不知道我们已经建立了session,framework尝试根据config建立session的时候就会产生Warning。

那么如何解决这个warnning呢?

首先我们得考虑是否真正有必要变更session_name

通常,当我们有两个web app运行在同一个domain下面的时候,我们可以通过设置不同的session_name来区分两个不同app的用户。

但是这种情况往往会造成不必要的麻烦。

就目前项目的code来说,修正的方法很简单,我们在framework中对session_name相关的调用添加@即可。即类似@session_name(my_session)

后记

虽然网上多数人抱怨这个Warning设计的莫名其妙,多数情况下,相比还是现有的Code的设计更加不合理吧。

如果你觉得本文对你有帮助,请给我点赞助。