У меня есть серьезные проблемы с отладкой этой конкретной проблемы, и я надеюсь, что кто-то подскажет, что я делаю неправильно.
У меня есть пользовательская система CMS, которая использует абзацы в качестве строительных блоков, которые обновляются с использованием вызовов Ajax (prototypejs) и функций, которые анализируют фрагменты HTML в заданном порядке, очищают их и сохраняют эти данные в ассоциативных массивах в переменной сеанса, Вход в систему, сеанс создан, и я могу проверить этот сеанс без проблем на каждой странице, в которой я нуждаюсь. Система работает непосредственно на определенных сайтах, поэтому пользователь может видеть свои обновления в реальном времени и просматривать сайт, как это сделал бы обычный пользователь, но редактирование. Итак, ничего нового здесь нет. Но вот что странно.
Сайт Enduser в режиме редактирования (вход пользователя admin): path "/"
После проверки состояния журнала функция обрабатывает редактируемый контент и сохраняет ассоциативный массив для сеанса, а также запускает некоторые объекты javascript для редактирования каждого абзаца. Фактически данные сохраняются, я могу использовать внешний script, чтобы проверить, есть ли он после этого завершения PHP скрипт. Если я загружаю новую страницу (новый контент), сеанс обновляется новыми данными)
Admin Пользователь изменяет абзац с помощью Inplaceeditor, и этот кусок HTML отправляется через Ajax на php script, который запускает именованный сеанс, считывает текущие данные сеанса, проверяет, должен ли абзац быть изменен, добавлен или удален и переназначен значения для существующих ключей массива в $_SESSION
. если я сделаю var_dump()
o print_r до $_SESSION
после назначения новых данных. После этого script эхо обрабатывает html, а ajax обновляет исходный абзац на вызывающей странице.
Этот script находится в /admin/cms/...etc, что означает не менее 4 каталогов внутри корня сайта.
Когда заканчивается script, я проверяю использование того же дампа сеанса script, чтобы увидеть, действительно ли данные были записаны/зафиксированы, но нет, $_SESSION
имеет только исходные данные с вызывающей страницы.
Тот же идентификатор, одно и то же имя сеанса, те же session_start()
, но данные не записываются.
Вся эта операция очень быстрая, поэтому, хотя это может быть проблема скорости, сценарии заканчиваются до того, как session_write_close сможет выполнить свою работу.
Но если я добавлю новый ключ в массив $_SESSION
и поместил туда некоторые данные, данные будут обновляться и записываться. Если я ничего не выведу на этом script и просто обрабатываю данные и устанавливаю переменные сеанса, он также обновляется и записывается.
Это похоже на то, что некоторые члены массива $_SESSION
блокируются для обновления.
Что я сделал, чтобы отслеживать эту ошибку и что я уверен, что я не ошибаюсь.
- 1.-
register_globals
, конечно, - 2.-
session_name()
иsession_start()
всегда присутствуют и в данном случае заказ. Раньше у меня было несколькоsession_start()
-close на одной странице
для использования нескольких названных сеансов, но для уточнить проблему, это не дольше поэтому. - 3.- Я использую
session_write_close()
после обработки данных сеанса. Кроме изображения попробовал без, разрешив php решить когда для фиксации данных, но не удачи. - 4.- Я использую только файлы cookie для SID.
- 5.- сессии хранятся в /tmp, я вижу, как данные обновляются.
- Я также попытался использовать пользовательское сохранение
обработчик на БД, но та же проблема,
"_write" вызывается только при отсутствии выхода в качестве присутствующего. - Я искал php.net, stackoverflow, google и т.д. для этой темы. Я никогда не спрашиваю без расследования, это мой первый раз за многие годы... но это просто так нелогично, что это должно быть что-то маленькое, о котором не думал.
Самое странное, что когда я просто обрабатываю данные без вывода $_SESSION
, он обновляется в порядке. Но если я изменю этот script, добавив вывод и повторю попытку, вместо того, чтобы просто иметь новое (последнее) значение, я получаю исходное значение назад, тот, который создается вызывающей страницей на первом месте, иногда после игры несколько раз! PHP не может кэшировать значения между скриптами или? У меня нет globlals.
Я действительно невежественный. Эта система работала безупречно на PHP4.3, так как я использую 5.3.3 для двух мотыльков моих пользователей, которые калибруют данные, где смешиваются, поэтому я проверил и да, есть серьезные проблемы. Сегодня я обновился до (5.3.6), и я не могу получить значения этого сеанса.
Script код, вызываемый через Ajax:
<?
session_cache_limiter('nocache');
session_name("CMS_ses");
session_start();
include('../htmLawed/htmLawed.php');
include("utils_cms.php");
include("../../../php/utils_array.php");
$value=$_POST['value'];
$editorId=$_POST['editorId'];
$clase=$_POST['clase'];
$editorId=str_replace("pre","",$editorId);
$value=html_entity_decode(stripslashes($value),ENT_QUOTES);
if (strlen(trim($value))==0)
{
die();
}
$value="<div id=\"$editorId\" class=\"$clase\">$value</div>";
$newXHTML=$value;
$retorno=CMS_nuevoBloque($newXHTML,$editorId);
$_SESSION['data']['CMSeditores']=$retorno[1];
$_SESSION['data']['CMScont']=$retorno[2];
session_write_close();
print_r($retorno[0]); //Offending part...without everything works
?>
действительно ничего странного здесь.... код главной страницы еще проще, никаких странных директив php и т.д.
Вот заголовок страницы вызывающего абонента
include 'php/db.php';
$len=$_GET['len'];
$sec=$_GET['sec'];
$cont=$_GET['cont'];
$admfin=$_GET['admfin'];
$fecha=$_GET['fecha'];
$token=$_GET['token'];
$cur=$_GET['cur'];
$PHP_SELF=$_SERVER['PHP_SELF'];
session_cache_limiter('nocache');
session_name("CMS_ses");
session_start();
$passvar='';
unset($adm);
if ((!empty($_SESSION['cms_logged'])) and (!isset($admfin)) )
{
$nivelpermisos=$_SESSION['cms_logged_group'];
$useractual=$_SESSION['cms_logged'];
$adm=1;
}
elseif (empty($_SESSION['cms_logged']))
{
unset($useractual);
}
//.........rest of the code
ОБНОВЛЕНИЕ: я провёл ночные тесты и обнаружил, что не понимаю. ХЭЛП:
Это связано не только с сеансами, но и с запросами Mysql. Тот же код, но вместо того, чтобы писать в массив $_SESSION
, я сделал простое обновление таблицы Innodb с помощью session_id. Когда я выхожу на какой-то код, обновление выполняется, (я могу вывести строку запроса и не mysql_error()
или уведомление), но при проверке базы данных строка не обновляется. Если вы выберете выход, если script и Query будут совершены. Лишь обычная вещь: сеансы начинаются и выводятся.
Я перезапустил Apache и т.д. (кто знает), но не повезло. Тогда я сделал что-то действительно глупое, потому что это дело на стороне сервера. Я изменил свой браузер на Firefox (используя сафари), и все работает! Хорошо, повторите проверку, вернемся к сафари, ничего не работает. Оба работают бок о бок, одна и та же проблема. PHP - это серверная сторона, как разные браузеры могут обрабатывать код по-разному, может ли браузер говорить об откате Apache, запросить не обрабатывать или вызывать один и тот же script дважды без уведомления (проверена панель разработчика safaris и script вызывается только один раз)? Может ли сафари повторно отправить данные молча, потому что "думает", что ajax не удалось? Я проверил заголовки с помощью инструментов Firebug и Safaris, ничего странного, но всякий раз, когда я делаю вызов Ajax с сафари, страница вызывающего абонента перезагружает данные (Aka conection to server...).
Я действительно ничего не понимаю.