【问题标题】:PHP 7.4 session_start and setcookie (session not start and cookie not set)PHP 7.4 session_start 和 setcookie(会话未启动且 cookie 未设置)
【发布时间】:2021-01-06 21:49:32
【问题描述】:

关于同一个主题,我有两个问题要问。 在带有 php.ini (7.4) 中的标准参数和标准 apache2 配置的新服务器 (debian 10) 中,以下代码不起作用。

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) 无效。

最好的问候

【问题讨论】:

  • 我遇到了一个类似的奇怪问题,由于浏览器中没有 PHPSESSID cookie,$_SESSION 总是为空(昨天它还在工作,该死的)。你搞清楚了吗?

标签: php session setcookie


【解决方案1】:

即使我在脚本开头直接设置了session_start()setcookie(...),我也遇到了完全相同的问题。由于未设置 cookie,每次调用都会启动一个新会话。

我现在的解决方案是先session_cookie_params(...),然后是session_start()session_cookie_params 必须在之前被调用 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 才能在本地测试中正常工作!投入生产时不要忘记切换 true 。域默认为当前。

无论此人在此期间多久回来一次,此 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)。

【讨论】:

  • 我从 php 7.1 迁移到 7.4 并遇到了 session_set_cookie_params 从 7.3 开始以不同的方式直接设置参数而不是数组的问题。这可能对任何迁移旧代码的人有用。
【解决方案2】:

您必须在文件的第一行输入session_start()。我认为这是你的问题。

【讨论】:

  • 是的,我没有在这里写,但它是。谢谢
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2019-11-18
  • 2013-04-17
  • 1970-01-01
  • 2015-11-30
  • 2020-11-27
  • 2015-02-26
相关资源
最近更新 更多