Cannot Change Session when sesion is active 转

转自:https://www.bocchi.tokyo/2019/06/24/can-not-change-session-name/

背景

最近把准备把项目直接从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的设计更加不合理吧。

点赞
  1. BluffMaster说道:
    Google Chrome Windows 10
    https://t.me/s/iGaming_live/4864
  2. Pokerdomded说道:
    Google Chrome Windows 10
    https://t.me/s/officials_pokerdom/3657
  3. PokerPhantom说道:
    Google Chrome Windows 10
    https://t.me/s/Flagman_officials
  4. PokerPhantom说道:
    Google Chrome Windows 10
    https://t.me/s/kazino_s_minimalnym_depozitom/12
  5. HighRollerMage说道:
    Google Chrome Windows 10
    В джунглях игр, где любой сайт пытается заманить заверениями простых выигрышей, рейтинг казино по версии игроков является именно той ориентиром, что направляет мимо дебри рисков. Для хайроллеров да новичков, кто устал из-за ложных посулов, такой помощник, дабы почувствовать настоящую rtp, как ощущение выигрышной фишки на ладони. Обходя ненужной воды, только реальные сайты, в которых rtp не лишь показатель, а реальная удача.Составлено из яндексовых трендов, словно сеть, которая захватывает самые горячие тенденции по интернете. В нём минуя роли к шаблонных приёмов, каждый момент будто ход у столе, там подвох раскрывается мгновенно. Хайроллеры понимают: по рунете тон письма с иронией, там юмор притворяется как рекомендацию, помогает миновать ловушек.На www.don8play.ru/ этот топ находится как открытая карта, приготовленный на старту. Зайди, если хочешь ощутить ритм настоящей игры, минуя обмана да провалов. Для что ценит ощущение удачи, это как взять карты в ладонях, минуя пялиться по экран.

发表回复

电子邮件地址不会被公开。必填项已用 * 标注