Php 抑制会话\u start()警告(标题已发送) 我有一个情况,我需要在文件中间调用 SeistOxSistar()/Cult>多次。显然,当session\u start()输出缓冲区时,我收到以下警告: 警告:会话\u start():无法发送会话cookie-标头已由…发送。 警告:会话\u start():无法发送会话缓存限制器-已发送头…

Php 抑制会话\u start()警告(标题已发送) 我有一个情况,我需要在文件中间调用 SeistOxSistar()/Cult>多次。显然,当session\u start()输出缓冲区时,我收到以下警告: 警告:会话\u start():无法发送会话cookie-标头已由…发送。 警告:会话\u start():无法发送会话缓存限制器-已发送头…,php,session,download,Php,Session,Download,关于由session\u start()引起的与标题相关的警告,有很多关于StackOverflow的文章。现在,在你决定将这篇文章标记为副本之前,请继续阅读——你会看到,它是不同的 其他线程中提出的大多数解决方案建议在进行任何PHP输出之前,将session\u start()放在文件的开头。如果每个文件只需要调用一次session\u start(),这可能是一个合适的解决方案,但是,这不是我的情况 我有一个文件下载脚本(见下面的代码)。在文件下载期间,我的脚本会定期使用下载进度状态更新“$

关于由
session\u start()
引起的与标题相关的警告,有很多关于StackOverflow的文章。现在,在你决定将这篇文章标记为副本之前,请继续阅读——你会看到,它是不同的

其他线程中提出的大多数解决方案建议在进行任何PHP输出之前,将
session\u start()
放在文件的开头。如果每个文件只需要调用一次
session\u start()
,这可能是一个合适的解决方案,但是,这不是我的情况

我有一个文件下载脚本(见下面的代码)。在文件下载期间,我的脚本会定期使用下载进度状态更新“$\u SESSION”变量。然后,我通过AJAX请求定期发布另一个脚本,它监视下载进度并通知我的JavaScript代码

为了避免锁定
$\u SESSION
变量,因此我必须在每次文件下载时多次调用
SESSION\u start()
SESSION\u write\u close()
,这在PHP文件的循环中发生

由于对
session\u start()
的每次后续调用都会返回警告(在我的例子中,这些警告会被注入下载的文件中),因此有没有任何编程正确的方法来抑制这些警告

我现在想到了两个解决方案,但我对其中任何一个都不满意:

  • 调用
    @session\u start()
    而不是
    session\u start()
    ——这不是一个好的做法,因为它会抑制函数返回的所有警告和错误
  • 调用
    ob_clean()
    在每次文件写入迭代结束时清空输出缓冲区,以删除注入缓冲区以写入文件的警告。-在这种情况下,警告仍然存在,我没有正确处理这种情况,我只是删除警告并忽略它
  • 因此,我的问题是,如何正确地调用每个文件的
    session\u start()
    session\u write\u close()
    多次并避免收到警告

    代码示例:
    
    
    您的情况与其他情况一样。不要做输出。如果无法避免输出,则使用输出缓冲。若不能使用输出缓冲,那个么就不要使用sessions.Marc B,不输出4GB文件并将其全部存储在服务器缓冲区是不可能的。这意味着,我来这里是想问一下,对于我的案例,是否有一个切实可行的解决方案。你为什么不在循环之前开始一个会话,然后在循环之后结束呢?为什么要在内部启动会话?请使用不同的通信方案。在开始时使用
    session\u start
    session\u write\u close
    然后使用会话id读/写到数据库表(或磁盘上的文件,无论什么)中,在那里交流进度。@ArtjomKurapov,您好,谢谢您的回复。想象一下,用户下载了一个500MB大的文件。下载需要15分钟。我有进度监控信息以及预计需要的时间等。。我通过定期扫描另一个脚本中的
    $\u会话['DownloadProgress']
    来获取此信息。我必须先关闭一个文件中的会话,然后才能从另一个文件访问
    $\u会话['DownloadProgress']
    。因此,为了使会话变量可用,我必须定期关闭会话。要修改变量,我必须启动会话。
    <?php    
    
    //...    
    
    
    // file download in small pieces
    while(!feof($file_source))
    {
        $chunk_data = fread($file_source, $chunk_size);
        print($chunk_data);
        ob_flush();
        flush();
    
        $bytes_already_transferred += strlen($chunk_data);
        $percent_complete = round(($bytes_already_transferred / $file_size) * 100);
    
        // update session variable, but how to avoid warnings?
        if (session_status() == PHP_SESSION_NONE) session_start();
        $_SESSION['DownloadProgress'] = $percent_complete;
        session_write_close();
    
        usleep(1000);
    }
    
    fclose($file_source);
    ?>