Сессии: странное поведение скрипта....

StUV

Rotaredom
Сессии: странное поведение скрипта....

Вот скрипт:
PHP:
<?php
  require_once("tree.inc");
  session_start();
  if (!isset($_SESSION['st']))
  {
    $_SESSION['st'] = new tree_cls;
    echo "<HR>"."TREE IN SESSION"."<HR>"; // строка 7
//    $_SESSION['st']->setup_out(); // строка 8
  }
?>
<form method='post' action=''>
 <input type='submit' name='btn'>
</form>
В таком виде при первом запуске скрипта выводится текст из строки 7 и баттон из формы, при всех последующих сабмитах выводится только форма и все....

Но, если расскомментировать строку 8, то первоначальный запуск скрипта (ГЕТом) проходит так же, а после сабмита в браузер вываливается "Невозможно отобразить страницу", а в лог апача пишется "FATAL: erealloc(): Unable to allocate 1765461 bytes"...

Как такое возможно, ведь строка 8 не должна выполняться ???

(сорри 2 admin&moderators - подумалось, что в силу уточнения вопроса и большей его связи с пхп перенос в новички&... из оффтопа не будет считаться кросспостингом)

Спасибо
 

Bloody

Guest
Ну, не знаю... попробуй вместо конкретного присваивания, сначала сделать session_register()...
 

RomikChef

Guest
А какого хера ты тогда отвечать лезешь????
а ну брысь отсюда, пока я тебя в рид-онли не перевел.
Чайник? Вопросы задавай.
А отвечать не лезь
 

StUV

Rotaredom
2Bloody:
ничего не изменилось... :(
причем в следующем скрипте "счетчик" работает нормально:
PHP:
<?php
  require_once("tree.inc");
  
  session_start();
  if (!isset($_SESSION['st']))
  {
    session_register('st');
    session_register('val');
    $_SESSION['val'] = 0;
    $_SESSION['st'] = new tree_cls;
    echo "<HR>"."TREE IN SESSION"."<HR>";
//    $_SESSION['st']->setup_out();
  }
  else
  {
    ++$_SESSION['val'];
    echo "<HR>".$_SESSION['val']."<HR>";
  }
?>
<form method='post' action=''>
 <input type='submit' name='btn'>
</form>
(соответственно если убрать комментарий, то траблы возобновляются...)
 

Said

Guest
при работе с массивом $_SESSION вообще то не требуется еще и session_register
(rtfm: Session functions)
 

StUV

Rotaredom
2Said:
знаю сам (сделал чтобы не возникало вопросов)...
ты лучше что-нить дельное скажи

а может это происходить после некорректной (?) пересвязки ссылками между объектами ? (то есть даже с учетом того, что строка и НЕ должна выполняться, но скрипт все-равно начинает _глючить_)
 

Georgy

Guest
2 Ромик:

чегой-то ты совсем озверевший:) даж забавно наблюдать
 

StUV

Rotaredom
<...несколько нехороших слов...>
скажите что-нить по теме, плиз...
 

911

Guest
session_start() надо бы в начало скрипта поставить
 

StUV

Rotaredom
да, как это ни странно, но что-то изменилось....
теперь после сабмита прежде чем в браузере появится "Невозможно..." выскакивает два раза окно "Инструкция по адресу ... обратилась к памяти по адресу... Память не может быть "read".
При этом в лог апача ничего не пишется....

Может теперь кто-нить понимает в чем трабл ???

Спасибо
 

Profic

just Profic (PHP5 BetaTeam)
Это все происходит на одной машине?
Что говорит print_r ($_SESSION) в первом и втором случаях

Трабл в том, что апач не может заграбастать под свои нужды 1 765 461 байт памяти одним блоком. Но вот из-за чего...

А что это за класс? Может там где рекурсия в данных?
 

StUV

Rotaredom
2Profic:
да, на локалке

... слишком много всего говорит :)

структура классов такая, как в примере Crazy из
http://phpclub.net/talk/showthread.php?s=&threadid=35041&rand=6
так что - да, рекурсия есть...

в конструкторы вставил что-то вроде echo "class _name_ created";
вызываются по одному разу для всех объектов...

в чем еще трабл может быть ?
 

StUV

Rotaredom
Что говорит print_r ($_SESSION) в первом и втором случаях
если имеется ввиду случаи перестановки строк require_... и session_start(), - то говорит одно и то же...
после сабмита в обоих случаях не успевает ничего сказать
 

Profic

just Profic (PHP5 BetaTeam)
Ну по природе сессий, включение определения класса, должно быть ДО десерелизации объекта ,т.е. session_start ()...

Ну вот он видимо и зацикливается на рекурсионных данных...
 

StUV

Rotaredom
если в начале скрипта вставить (после всех заголовков):
PHP:
  for ($i = 0; $i<1000; $i++)
    echo "<!-- sdfsadfasdfasdf -->";
то после сабмита в браузер форма все таки попадает, потом что-то еще грузится, и только потом вылезает "Невозможно..."
(это если сначала require_once..., а потом start_session)

какой такой процесс еще может идти, если последняя строка скрипта уже выполнилась (причем процесс этот идет только при ПОСТе, а ГЕТом он не вызывается) ???

--------------------------------
хотя нет, при <form method='get' ..> то же самое
 

Profic

just Profic (PHP5 BetaTeam)
процесс этот называется сериализация переменых зарегестрированных в сессии и запись их на диск

без конкретики, не видя кода, говорить сложно...

Это известный (по крайней мере мне) прикол - когда соединение через HTTP/1.1 и апач рушится, идет перезапуск страницы ИЕ, которую он второй раз загрузить не в состоянии, т.к. апач только загружается...

Тебе видимо нужно пересмотреть структуру данных или воспользоваться __sleep и __wakeup - явно апач валится на сериализации рекурсивных данных (учитывая сколько он хочет захапать памяти)
 

StUV

Rotaredom
2Profic:
спасибо, кажется до меня доперло что ты сказал :)...
 

Profic

just Profic (PHP5 BetaTeam)
А ты попробуй сделать :)

Вот контретный пример:
PHP:
<?php
$a = array ('key1' => &$a);
echo '<pre>';
print_r ($a);
echo '</pre>';
echo serialize ($a);
?>
Выводит
Код:
Array
(
    [key1] => Array
        (
            [key1] => Array
 *RECURSION*
        )

)

a:1:{s:4:"key1";a:1:{s:4:"key1";R:2;}}
Но тут структура очень простая, а на сложных структурах он не так быстро как хотелось бы определяет, что он встрял в рекурсию...
 

StUV

Rotaredom
Сделал вот так:
PHP:
<?php
  require_once("tree.inc");
  session_start();

  if (!isset($_SESSION['st']))
  {
    $st = new tree_cls;
    $st->setup_out();
  }
  else
  {
    $st = unserialize($_SESSION['st']);
    echo "<HR><PRE>";
    print_r($st);
    echo "</PRE><HR>";
  }
  
  if (isset($st))
    $_SESSION['st'] = serialize($st);
?>
<form method='get' action=''>
 <input type='submit' name='btn'>
</form>
работает без "сбоев"...
осталось перенести на исходный скрипт (надеюсь получится то, что хотелось :) )
 
Сверху