关于同一主题,我有两个问题要问。 在新服务器(debian 10)中,如果使用php.ini(7.4)中的标准参数和标准apache2配置,则以下代码将不起作用。
session_name('mySiteSession');
session_start();
$params = [
'lifetime' => time()+600,
'path' => '/crm',
'domain' => $_SERVER['HTTP_HOST'],
'secure' => 0,
'httponly' => 0,
'samesite' => 'Strict'
];
setcookie(session_name(),session_id(),$ params [“ lifetime”],$ params [“ path”],$ params [“ domain”],$ params [“ secure”],$ params [“ httponly “]);
Cookie仅正确设置了名称,路径和域参数,其余的保持为false而没有设置。 这是问题的第一部分,第二部分,我尝试使用session_start中的参数
session_name('mySiteSession');
$session_options = [
'cookie_lifetime' => time()+600,
'cookie_path' => '/crm',
'cookie_domain' => $_SERVER['HTTP_HOST'],
'cookie_secure' => 0,
'cookie_samesite' => 'Strict',
'cookie_httponly' => 1,
'read_and_close' => true
];
session_start($session_options);
正确设置cookie,但会话无法启动,并且如果我重复不带参数的session_start()
注意:session_start():会话已经开始- 忽略...
但是 var_dump($ _ SESSION)是无效的。
最诚挚的问候
答案 0 :(得分:0)
您必须在文件的第一行执行session_start()
。我认为那是您的问题。
答案 1 :(得分:0)
我遇到了完全相同的问题,即使我在脚本的开头直接设置了 session_start()
和 setcookie(...)
。由于未设置 cookie,每次调用都会启动一个新会话。
现在我的解决方案是先session_cookie_params(...)
,然后是session_start()
。 session_cookie_params
必须被调用 before session_start
!
Read about session_cookie_params() on php.net 了解有关参数和符号的更多详细信息。
session_set_cookie_params([
'lifetime' => 900, // expires in 15 minutes
'path' => '/', // any path on same domain
'secure' => true,
'httponly' =>true
]);
session_start();
注意:就我而言,'secure' 必须设置为 false 才能在本地测试中正常工作!进入生产环境时不要忘记切换真。域默认为当前。
无论此人多久回来一次,此 cookie 都会在生命周期结束后以秒为单位过期。如果您希望您的 cookie 在每次访问时自动刷新,您可以这样做:
session_start();
$currentParams = session_get_cookie_params();
$sessionID = session_id();
setcookie(
'PHPSESSID', // ------------------- name
$sessionID, // -------------------- value/ID
time() + 900, // ------------------ expires in 15 minutes
$currentParams['path'], // ------ path
$currentParams['domain'], // ------ domain
true, // -------------------------- secure
true // -------------------------- http-only
);
如果这仍然不能为您解决问题,您可以尝试缓冲每个输出(可能在您的会话设置之前发送标头)并定位问题。例如,请参见 ob_start
(on php.net) 和 ob_get_clean
(on php.net)。