Jommla 3.5.1 Session Conflict — повторные заголовки сеанса уже отправлены

Я недавно обновился до Joomla 3.5.1 и получаю следующую ошибку при загрузке / включении файла php в мой корневой каталог.

«Ошибка отображения страницы с ошибкой: Ошибка создания приложения: не удалось запустить сеанс, поскольку заголовки уже были отправлены test.php в строке 1»

Я загружаю файл test.php в модуль. Test.php находится в главном корне установки joomla. Однако, поскольку сама Joomla уже установила сеанс, я не могу получить доступ к базе данных joomla через test.php из-за ошибки сеанса выше.

В 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();

2

Решение

Обычно эта проблема вызвана почти незаметным пробелом (или новой строкой) в начале файла. Проверьте файл test.php на наличие пробелов перед открытием <? php.

2

Другие решения

Я думаю, что причина, по которой вы получаете эту ошибку после обновления 3.5.1, заключается в том, что теперь они выдают исключение в /libraries/joomla/session/handler/native.php строка 252, если header_sent () возвращает истину. Чтобы избежать этого, вы можете попытаться установить для директивы 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 скрипт. Несколько слов об этом, потому что ваш заголовок как-то подходит. На некоторых машинах метод header_sent (), кажется, возвращает true даже для Joomla по умолчанию! Сценарии CLI, такие как «finder_indexer.php». Чтобы решить это я написал

ob_start();

в начале сценария для буферизации вывода и предотвращения вывода CLI до начала сеанса.

1

Пожалуйста, следуйте инструкциям ниже, это, вероятно, решит проблему.

  1. Введите бэкэнд вашего сайта Joomla
  2. Выберите из меню администратора: Расширения -> Управление -> База данных
  3. Нажмите на кнопку FIX. Вы можете обнаружить, что нужно сделать некоторые другие обновления, чтобы довести базу данных до 3.5.
  4. Перейдите к глобальной конфигурации и выключите сайт перед следующим шагом, чтобы на некоторое время отговорить пользователей.
  5. Затем, как упоминалось выше, перейдите к phpMyAdmin и удалите все записи в таблице xxxxx_sessions.
  6. Идите к бэкенду и включите сайт снова.
1