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

时间:2016-05-14 17:14:28

标签: php session joomla conflict

我最近升级到Joomla 3.5.1,当我在我的根目录中加载/包含php文件时出现以下错误。

  

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

我在模块中加载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();
&#13;
&#13;
&#13;

在升级之前它工作得很好。当我加载外部php文件来访问joomla数据库时,如何防止Joomla中的会话冲突?

3 个答案:

答案 0 :(得分:2)

通常,此问题是由文件开头几乎无法察觉的空间(或新行)引起的。在开始之前检查test.php文件中的任何空格&lt;?php。

答案 1 :(得分:1)

我认为你在3.5.1更新后得到这个错误的原因是他们现在在 /libraries/joomla/session/handler/native.php 第252行抛出一个异常,如果 header_sent()返回true。为避免这种情况,您可以尝试使用

将“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输出。

答案 2 :(得分:1)

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

  1. 输入您的Joomla网站的后端
  2. 从管理菜单中选择:扩展程序 - &gt;管理 - &gt;数据库
  3. 单击FIX按钮。您可能会发现需要进行一些其他更新才能使数据库达到3.5。
  4. 前往全球配置,关闭网站&#39;在此下一步之前,不要劝阻任何用户。
  5. 然后,如上所述,前往phpMyAdmin并删除xxxxx_sessions表中的所有条目。
  6. 前往后端并重新开启该网站。