我最近升级到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;
在升级之前它工作得很好。当我加载外部php文件来访问joomla数据库时,如何防止Joomla中的会话冲突?
答案 0 :(得分:2)
通常,此问题是由文件开头几乎无法察觉的空间(或新行)引起的。在开始之前检查test.php文件中的任何空格&lt;?php。
答案 1 :(得分:1)
我认为你在3.5.1更新后得到这个错误的原因是他们现在在 /libraries/joomla/session/handler/native.php 第252行抛出一个异常,如果 header_sent()返回true。为避免这种情况,您可以尝试使用
将“session.use_cookies”指令设置为falseini_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)
请按照以下步骤操作,这可能会解决问题。