Сеанс PHP не записывается после вывода (echo или print_r при внешнем вызове ajax)

У меня серьезные проблемы с отладкой этой конкретной проблемы, и я надеюсь, что кто-то поймет, что я делаю не так.

У меня есть настраиваемая система CMS, использующая абзацы в качестве строительных блоков, которые обновляются с помощью вызовов Ajax (prototypejs) и функций, которые анализируют фрагменты HTML в заданном порядке, очищают их и сохраняют эти данные в ассоциативных массивах в переменной сеанса. Users log in, Session is created and I can check for this session without problem in every page I need it. The system works directly on the definitive websites, so the user can see his updates on realtime and browse the site as a normal user would do, but editing. Так что здесь ничего нового. Но вот что странно.

Сайт конечного пользователя в режиме редактирования (пользователь admin вошел в систему): path "/"

После проверки зарегистрированного статуса функция обрабатывает редактируемый контент и сохраняет ассоциативный массив в сеанс, он также запускает некоторые объекты javascript для редактирования каждого абзаца. Данные фактически сохранены, я могу использовать внешний скрипт, чтобы проверить, есть ли они там после завершения этого php-скрипта. Если я загружаю новую страницу (новый контент), сеанс обновляется новыми данными)

Пользователь-администратор изменяет абзац с помощью Inplaceeditor, и этот фрагмент HTML отправляется через Ajax в сценарий php, который запускает именованный сеанс, считывает данные текущего сеанса, проверяет, следует ли изменить, добавить или удалить абзац, и переназначает значения существующим ключам массива в $ _SESSION . Same ID, same session name, same session_start() but no data gets written. This whole operation is very quick, so I though it could be a speed problem, scripts ends before session_write_close can make his work.

But if I add a new key to $_SESSION array and put some data there, data gets updated and written. If i don´t output anything on this script and just process data and set session variables it also get´s updated and written.

It´s like some members of $_SESSION array are getting blocked to update.

What i did to track this error and what i´m sure i´m not doing wrong.

  • 1.- register_globals are off of course
  • 2.- session_name() and session_start() are always present and in the given
    приказ. Раньше у меня было несколько
    session_start () -close на одной странице
    использовать несколько именованных сессий, но Уточните проблему, это больше не итак.
  • 3.- Я использую session_write_close () после обработки данных сеанса. Также
    пробовал без, позволяя php решать когда фиксировать данные, но не повезло.
  • 4.- Я использую только куки для SID.
  • 5.- сеансы хранятся в / tmp, я могу видеть, как обновляются данные.
  • Я также попытался использовать индивидуальное сохранение обработчик на БД, но та же проблема,
    "_write" вызывается только тогда, когда нет выходных данных.
  • Я искал эту тему в php.net, stackoverflow, google и т. д. Я никогда не спрашиваю без расследования, это мой первый раз за много лет ... но это настолько нелогично, что должно быть что-то крошечное, о чем даже не догадывались.

Самое странное, что когда я просто обрабатываю данные без вывода $ _ SESSION обновляется нормально. Но если я впоследствии изменю этот скрипт, добавив вывод и попробую снова, вместо того, чтобы просто иметь новое (последнее) значение, я верну исходное значение, созданное вызывающей страницей в первую очередь, иногда после нескольких игр раз! PHP не может кэшировать значения между скриптами или? У меня нет глобальных переменных.

Я действительно невежественен. Эта система безупречно работала на PHP4.3, поскольку я использую 5.3. 3 в течение двух месяцев мои пользователи, где данные калибровки были перепутаны, поэтому я проверил, и да, есть серьезные проблемы. Сегодня я обновился до (5.3.6), и я не могу зафиксировать значения этого сеанса.

Код сценария, вызываемый через 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  

ОБНОВЛЕНИЕ: Я сделал ночные тесты и обнаружил кое-что, чего я не понимаю. ПОМОЩЬ, пожалуйста: It has not only to do with Sessions but also with Mysql Querys. Same code, but instead of trying to write to $_SESSION array i made a simple update to a Innodb table using the session_id. When i Output some code, the update does get executed,(i can output the query string and no mysql_error() or notice) problems, but checking the database the row doesn´t get updated. Letting the output out if the script and Query does get commited. Only common thing is sessions are started and output is made.

I restarted Apache, etc(who knows) but no luck. Then i made something really stupid, because this is a server side thing. I changed my browser to Firefox(using safari) and everything works! Ok, recheck, back to safari, nothing works. Both running side by side, same issue. PHP is server side, how can different browsers handle code different, can a browser say to apache rollback, request not handled or call the same script twice without notice(checked safaris developer console and the script is called only once) ? Can safari resubmit data silently because it "thinks" ajax failed? I checked headers using firebug and Safaris developer tools , nothing strange but whenever i make a Ajax call with safari, the caller page reloads data(Aka conection to server...).

I really don´t understand nothing.

12
задан hakre 12 October 2012 в 09:21
поделиться