PHP7.2.7-fpm/Docker ini_set(): Headers already sent. You cannot change the session module's ini settings at this time. PHP7.2.7-fpm/Docker 报错:无法更改会话模块的ini设置,因为头信息已经发送。

3

我正在尝试创建一个安全的登录页面,当我使用XAMPP时它工作得很好,但是现在切换到Docker后,我遇到了这个错误:

Warning: ini_set(): Headers already sent. You cannot change the session module's ini settings at this time in /var/www/inc/cUser.php on line 30

我不确定,是否需要在容器本身上进行一些设置,到目前为止我还没有找到解决办法。

我从表单中获取$_POST数据并将其传递给我的process.php:

require_once(dirname($_SERVER['DOCUMENT_ROOT']) . '/inc/autoloader.php');
  $user = new cUser();

  $user -> sec_session_start();

cUser.php:

protected function sec_session() {
    define("SECURE", true);
    $session_name = 'sec_session_id';   
    $secure = SECURE;
    $httponly = true;
    if (ini_set('session.use_only_cookies', 1) === FALSE) {
    //header("Location: /error.php?err=Could not initiate a safe session (ini_set)"); 
// here i got the same error twice, so i commented it out and used the code below
        echo("<script>location.href = /error.php?err=Could not initiate a safe session (ini_set);</script>");
            exit();
        }
        $cookieParams = session_get_cookie_params();
        session_set_cookie_params($cookieParams["lifetime"],
            $cookieParams["path"],
            $cookieParams["domain"],
            $secure,
            $httponly);
        session_name($session_name);
        session_start();  
        session_regenerate_id();
    }

以上内容没问题,我回到了我的process.php文件:
if ($login) {
              // Login successful
              exit(header('Location: /index.php'));
          } else {
              // Login not successful
              exit(header('Location: /error.php?error=1'));
          }

我被成功重定向到index.php。在我的index.php文件中,我再次调用同样的方法,以确保我拥有正确的用户并且被授权查看该页面:

require_once(dirname($_SERVER['DOCUMENT_ROOT']) . '/inc/autoloader.php');
  $user = new cUser();

  $user -> sec_session_start();

现在我遇到了错误。这是问题所在的代码行:

if (ini_set('session.use_only_cookies', 1) === FALSE) {

我不确定这里出了什么问题,有人能帮我吗?


确保在执行任何发送头信息的操作之前调用ini_set(),例如session_start()setcookie() - Barmar
@barmar 但那已经是事实。 - tmzafar
1个回答

1

我认为理解导致“Headers already sent”错误的原因是关键的,这样才能找到您错误的根源。

当有人请求一个网页时,在任何HTML形式发送之前,页面的第一部分是一组标题。它们是包含关于页面的关键信息的键值对,例如状态码(成功为200,未找到为404等)。

它还包含Cookie信息,这对于PHP会话的工作非常重要(鉴于您执行的命令,我猜您可能已经知道这一点)。

由于标题在请求开始时发送,因此如果您已经将任何与标题无关的输出放入页面中(即使是位于<?php标记之外的换行符),这将阻止发送任何其他标题并抛出您正在看到的错误。

考虑到您正在看到的症状(以前可以正常工作,但在Docker中不起作用),最可能的原因是配置差异方面的错误报告(Docker容器中的错误报告设置比XAMPP中更高)或PHP版本(在Docker容器中使用比XAMPP中更新的PHP版本)。

你发布的代码中没有看起来会出错的地方,因此我会认为这个潜在的错误发生在你的autoloader.php文件中。


在autoload文件中只是另一个文件,cUser正在工作。我认为这确实是docker php版本的问题。在XAMPP中,我有PHP版本7.3.7,在Docker中是7.2.7,而且没有7.3.7 PHP版本的Docker镜像,至少我找不到。 - tmzafar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接