Jommla 3.5.1会话冲突-已发送重复的会话标头


Jommla 3.5.1 Session Conflict - Duplicate session headers have already been sent

我最近升级到了Joomla 3.5.1,当我在根目录上加载/包含一个php文件时,我收到了以下错误。

"显示错误页面时出错:应用程序实例化错误:无法启动会话,因为test.php已经在第1行发送了标头"

我正在模块中加载test.php文件。test.php位于joomla安装的主根目录上。然而,由于Joomla本身已经设置了会话,由于上面的会话错误,我无法通过test.php访问Joomla数据库。

在test.php中,我要从以下代码开始;

<?php
define( '_JEXEC', 1 );
define( '_VALID_MOS', 1 );
define( 'JPATH_BASE', realpath(dirname(__FILE__)));
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe = JFactory::getApplication('site');
$mainframe->initialise();

升级前它运行良好。当我加载外部php文件访问Joomla数据库时,如何防止Joomla中的会话冲突?

通常,此问题是由文件开头几乎不明显的空格(或新行)引起的。在打开<?之前,请检查test.php文件中是否有空格;?php。

我认为在3.5.1更新后出现此错误的原因是,如果header_sent()返回true,它们现在会在/librarys/joomla/session/handlers/native.php行252中抛出异常。为了避免这种情况,您可以尝试使用将"session.use_cookies"指令设置为false

ini_set('session.use_cookies', 0);

但这实际上是一个技巧,而不是一个解决方案——你不应该这么做。事实上,我想不出你为什么要重新初始化Joomla!这样的框架。正确的方法是创建一个像/modules/mod_mymod/helper.php这样的文件

 defined('_JEXEC') or die('Restricted access');
 class MyModHelper {
    public static function doSth() {
        $db = JFactory::getDBO();
        //your code here
    }
 }

然后你可以使用在几乎任何地方执行代码

require_once JPATH_ROOT.DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR.'mod_mymod'.DIRECTORY_SEPARATOR.'helper.php';
MyModHelper::doSth();

但我来这里是因为我在执行Joomla时遇到了同样的错误!CLI脚本。所以只需要几个字,因为你的标题在某种程度上很合适。在某些机器上,即使对于默认的Joomla,header_sent()方法似乎也会返回true!CLI脚本,比如"finder_indexer.php"。为了解决这个问题,我写了

ob_start();

以缓冲输出,并在会话实际启动之前阻止任何CLI输出。

请按照以下步骤操作,这可能会解决问题。

  1. 输入Joomla网站的后端
  2. 从管理菜单中选择:扩展->管理->数据库
  3. 点击FIX按钮。您可能会发现,还需要进行一些其他更新,以使数据库达到3.5
  4. 前往"全局配置",并在执行下一步之前关闭网站,以暂时阻止任何用户
  5. 然后,如上所述,转到phpMyAdmin并删除xxxxx_sessions表中的所有条目
  6. 前往后端并重新打开网站