微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP 7.4 session_start和setcookie会话未启动且未设置cookie

如何解决PHP 7.4 session_start和setcookie会话未启动且未设置cookie

关于同一主题我有两个问题要问。 在新服务器(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)是无效的。

最诚挚的问候

解决方法

您必须在文件的第一行执行session_start()。我认为那是您的问题。

,

我遇到了完全相同的问题,即使我在脚本的开头直接设置了 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)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。