Исправления для модуля "DokuWiki integration" + обновление DokuWiki
Исправляем досадный баг с совпадающими именами и id-шниками сессий у DokuWiki и LiveStreet. Выглядело это так что сайт переставал отвечать на запросы пока не очистим куки или пока не разорвем сессию. (кстати тут и вина PHP есть т.к. ее поведение при возникновении этой ситуации не очень забавное, надо бы багрепорт оформить)
Обновляем DokuWiki до последней стабильной версии.
Нам понадобятся:
0. LiveStreet 0.4.2
1. Плагин DokuWiki integration
2. Свежая и стабильная сборка DokuWiki (на данный момент это Release 2011-05-25 «Rincewind»)
Последовательность:
1. Устанавливаете плагин «DokuWiki integration».
2. Переименовываете папку wiki в wiki_old
3. Создаем папку wiki и копируем в нее свежую DokuWiki
4. В папке wiki удаляем папки conf и data
5. Копируем в папку wiki папки conf и data из папки wiki_old
6. В папку wiki/inc/auth/ копируем файл livestreet.class.php из папки wiki_old/inc/auth/
7. В папку wiki/lib/tpl/ копируем папку livestreet из папки wiki_old/lib/tpl/
8. В файл wiki/doku.php в самом начале после "<?php" добавляем
9. Правим файл wiki/inc/load.php
Если не внести эту правку, то при открытии http://nash_site.com/wiki/ получаем ошибку «Fatal error: Class 'PluginCtrlenter' not found in ля-ля/www/engine/classes/Engine.class.php on line 401» (Ctrlenter это плагин который у меня в LiveStreet грузится первым)
т.к. классы LiveStreet будет пытаться подгрузить DokuWiki и LiveStreet не запуститься
находим
заменяем на это
До (в этом месте внес изменение в инструкцию //BEGIN)
Добавляем
(в этом месте внес изменение в инструкцию //END)
В функции load_autoload
находим
и заменяем на это
10. Правим файл wiki/lib/plugins/config/admin.php
В функции _restore_session после
добавляем
11. Правим файл wiki/inc/auth.php
В функции auth_createToken после
добавляем
В функции auth_logoff после
добавляем
12. Правим файл wiki/inc/common.php
В функции send_redirect после
добавляем
Папку wiki_old можете удалить если вам из нее ничего не надо.
Описанное решение я протестировал примерно с неделю более ошибок с сессиями не обнаружено.
Вот и все. :) В итоге мы получили обновленную DokWiki и исправили досадный баг с совпадающими именами и id-шниками сессий у DokuWiki и LiveStreet.
С точки зрения DokuWiki это и не баг совсем т.к. она сама по себе хорошо живет а баг вылез из-за интеграции DokuWiki и LiveStreet т.к. разработчик DokuWiki не указывал имя сессии когда ее открывал он-то надеялся что оно еще такое как он при запуске задал. :)
UPD: обновил инструкцию
Обновляем DokuWiki до последней стабильной версии.
Нам понадобятся:
0. LiveStreet 0.4.2
1. Плагин DokuWiki integration
2. Свежая и стабильная сборка DokuWiki (на данный момент это Release 2011-05-25 «Rincewind»)
Последовательность:
1. Устанавливаете плагин «DokuWiki integration».
2. Переименовываете папку wiki в wiki_old
3. Создаем папку wiki и копируем в нее свежую DokuWiki
4. В папке wiki удаляем папки conf и data
5. Копируем в папку wiki папки conf и data из папки wiki_old
6. В папку wiki/inc/auth/ копируем файл livestreet.class.php из папки wiki_old/inc/auth/
7. В папку wiki/lib/tpl/ копируем папку livestreet из папки wiki_old/lib/tpl/
8. В файл wiki/doku.php в самом начале после "<?php" добавляем
if ($_SERVER['REQUEST_METHOD'] == 'GET' && !$_SERVER['HTTP_REFERER'])
{
$_SERVER['HTTP_REFERER'] = 'http://' . $_SERVER['HTTP_HOST'] .'/wiki/';
}
9. Правим файл wiki/inc/load.php
Если не внести эту правку, то при открытии http://nash_site.com/wiki/ получаем ошибку «Fatal error: Class 'PluginCtrlenter' not found in ля-ля/www/engine/classes/Engine.class.php on line 401» (Ctrlenter это плагин который у меня в LiveStreet грузится первым)
т.к. классы LiveStreet будет пытаться подгрузить DokuWiki и LiveStreet не запуститься
находим
spl_autoload_register('load_autoload');
заменяем на это
//--spl_autoload_register('load_autoload');
До (в этом месте внес изменение в инструкцию //BEGIN)
/**
* spl_autoload_register callback
Добавляем
load_autoload("");
(в этом месте внес изменение в инструкцию //END)
В функции load_autoload
находим
if(isset($classes[$name])){
require_once($classes[$name]);
return;
}
и заменяем на это
/*if(isset($classes[$name])){
require_once($classes[$name]);
return;
}*/
foreach ($classes as $aclasses) {
require_once($aclasses);
}
10. Правим файл wiki/lib/plugins/config/admin.php
В функции _restore_session после
if (!headers_sent()) {
добавляем
session_name("DokuWiki");
if (version_compare(PHP_VERSION, '5.2.0', '>')) {
session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()),true);
}else{
session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()));
}
11. Правим файл wiki/inc/auth.php
В функции auth_createToken после
$token = md5(mt_rand());
добавляем
session_name("DokuWiki");
if (version_compare(PHP_VERSION, '5.2.0', '>')) {
session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()),true);
}else{
session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()));
}
В функции auth_logoff после
global $conf;
global $USERINFO;
global $INFO, $ID;
global $auth;
добавляем
session_name("DokuWiki");
if (version_compare(PHP_VERSION, '5.2.0', '>')) {
session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()),true);
}else{
session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()));
}
12. Правим файл wiki/inc/common.php
В функции send_redirect после
if (isset($MSG) && count($MSG) && !defined('NOSESSION')){
//reopen session, store data and close session again
добавляем
session_name("DokuWiki");
if (version_compare(PHP_VERSION, '5.2.0', '>')) {
session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()),true);
}else{
session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()));
}
Папку wiki_old можете удалить если вам из нее ничего не надо.
Описанное решение я протестировал примерно с неделю более ошибок с сессиями не обнаружено.
Вот и все. :) В итоге мы получили обновленную DokWiki и исправили досадный баг с совпадающими именами и id-шниками сессий у DokuWiki и LiveStreet.
С точки зрения DokuWiki это и не баг совсем т.к. она сама по себе хорошо живет а баг вылез из-за интеграции DokuWiki и LiveStreet т.к. разработчик DokuWiki не указывал имя сессии когда ее открывал он-то надеялся что оно еще такое как он при запуске задал. :)
UPD: обновил инструкцию
7 комментариев
Однако у меня не получается добиться результата.
Если взять пункт 9 как контрольную точку, то вместо
«Fatal error: Class 'PluginCtrlenter' not found in ля-ля/www/engine/classes/Engine.class.php on line 401»
у меня в логах
«PHP Fatal error: Class 'ModulePlugin' not found in /engine/classes/Engine.class.php on line 162»
Подскажите, с чем это может быть связано?
Какая версия LiveStreet и DokuWiki у тебя?
dokuwiki_plugin_ls_1.0 (2009-12-25c «Lemming»)
с оф сайта DokuWiki dokuwiki-2011-05-25a “Rincewind”
после выполнения 8-го пункта 2 ошибки в логах
PHP Notice: Undefined index: HTTP_REFERER
PHP Fatal error: Class 'ModulePlugin' not found in /engine/classes/Engine.class.php on line 162
после выполнения 9-го пункта
PHP Notice: Undefined index: HTTP_REFERER
PHP Fatal error: Class 'DokuWiki_Plugin' not found in .wiki/lib/plugins/action.php on line 15
шаг с
Подправил
и
добавляем не вместо
а ниже блока
Пробуй ;)