session_start返回true,但当session_name包含空格时不起作用

Mik*_*oos 0 php session

有人可以解释这是否是PHP的正确行为,我期望session_start()返回false并获得警告说session_name包含非法字符.

代码重现:

<?php
session_name('m m');
var_dump(session_start());

if(!isset($_SESSION['count'])) {
     $_SESSION['count'] = 0;
}
else {
     $_SESSION['count']++;
}

echo session_name();
echo $_SESSION['count'];
Run Code Online (Sandbox Code Playgroud)

运行一次:

bool(true) m m0

重装页面:

bool(true) m m0

应该是(如果会议工作):

bool(true) m m1

session_start()返回true表示会话已启动.该$_SESSION['count']指示就是不起作用.会话名称中的非法字符没有警告.

我在手册页上找不到任何提示,也没有关于会话的有效字符的定义.

Álv*_*lez 5

PHP生成这样的东西:

Set-Cookie: m+m=unttot9siteipcsrc0r064hn37; path=/
Run Code Online (Sandbox Code Playgroud)

...并且浏览器(Firefox/23)将其发回:

Cookie: m+m=unttot9siteipcsrc0r064hn37
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是PHP会生成一个新的会话ID:

Set-Cookie: m+m=7tmi7kd8n27ef3qdk5q706gk85; path=/
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?我说这不是因为你的会话名称显然是无效的:

会话名称引用会话的名称,该名称用于cookie和URL(例如PHPSESSID).它应该只包含字母数字字符 ; 它应该简短且具有描述性(即对于启用了cookie警告的用户).如果指定了name,则将当前会话的名称更改为其值.

警告

会话名称不能仅包含数字,必须至少包含一个字母.否则,每次都会生成一个新的会话ID.

如果您遵循规则,它按预期工作:

session_name('mxm');
Run Code Online (Sandbox Code Playgroud)

总结一下:

  • 不要猜测,使用浏览器开发者控制台和其他工具
  • 阅读文档;-)

编辑:刚刚注意到你这样说:

我在手册页上找不到任何提示,也没有关于会话的有效字符的定义.

我在session_name()的手册页中找到了这些信息.