Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нюансы сессий
 
 автор: Владимир55   (01.11.2009 в 00:25)   письмо автору
 
 

В скрипте есть такой фрагмент:
<?php
    $dop        
10 ;        

    
ob_start();
    
session_start();
    echo 
"<br> dop $dop ";
    
$_SESSION['dop'] = $dop;
    echo 
"<br> dop $dop ";


При вызове скрипта воспроизводится то, что и ожидалось:
dop 10
dop 10

Но если теперь в переменную $dop записать другое число, сохранить полученный код и ПЕРЕЗАПУСТИТЬ скрипт, то выводится прежнее зачение:
dop 10
dop 10

Вероятно, виной всему сессия. Но как от этого эффекта избавться, я никак не пойму!

===========
Работа на Денвере.

  Ответить  
 
 автор: ols   (01.11.2009 в 00:36)   письмо автору
 
   для: Владимир55   (01.11.2009 в 00:25)
 

Так ведь сессия уже инициализирована. в конце нужно уничтожить сессию. session_dectore()

  Ответить  
 
 автор: Владимир55   (01.11.2009 в 00:46)   письмо автору
 
   для: ols   (01.11.2009 в 00:36)
 

В смысле
session_destroy (); 


Так проблема решается, но создается другая. А именно. Даже если я делаю указанную Вами запись самой последней, в сессию, почему то, параметр $dop не уходит...

  Ответить  
 
 автор: tvv123456   (01.11.2009 в 00:50)   письмо автору
 
   для: ols   (01.11.2009 в 00:36)
 

А разве переменную в сессии нельзя перезаписывать? Много раз делал что-то типа: $_SESSION['a'] =$_SESSION['a']+$a;


А в этом проблемы не может быть(ни разу до этого не с талкивался с этим)
void ob_start ([string output_callback])

Эта функция включает буферизацию вывода. Если буферизация вывода активна, никакой 
вывод скрипта не высылается (кроме шапок/headers); 
вывод сохраняется во внутреннем 
буфере.

  Ответить  
 
 автор: Trianon   (01.11.2009 в 00:54)   письмо автору
 
   для: Владимир55   (01.11.2009 в 00:25)
 

Сессия тут не при чем.

  Ответить  
 
 автор: Владимир55   (01.11.2009 в 01:04)   письмо автору
 
   для: Trianon   (01.11.2009 в 00:54)
 

Похоже, что сессия и вправду не виновата. Я закомментировал ее, а эффект тот же!

Но что же это может быть? Это самый верх скрипта, над этими записями ничего нет. Если закрыть страницу и открыть ее заново, то все нормально, а при обновлении вот такой глюк.

Не исключено, что в Денвере включены глобальные переменные, но даже и в этом случае такого, вроде бы, быть не должно.

Ведь так?

  Ответить  
 
 автор: Trianon   (01.11.2009 в 02:06)   письмо автору
 
   для: Владимир55   (01.11.2009 в 01:04)
 

переменные живут только при жизни процесса, исполняющего скрипт.
Дело не в этом.
Просто вызов одного и того же документа должен выдавать один и тот же результат.
Это естественное поведение.

  Ответить  
 
 автор: tvv123456   (01.11.2009 в 02:41)   письмо автору
 
   для: Trianon   (01.11.2009 в 02:06)
 

>переменные живут только при жизни процесса, исполняющего скрипт.
>Дело не в этом.
>Просто вызов одного и того же документа должен выдавать один и тот же результат.
>Это естественное поведение.
Полностью согласен
НО автор темы прописал:

>>Но если теперь в переменную $dop записать другое число, сохранить полученный код и
>> ПЕРЕЗАПУСТИТЬ скрипт, то выводится прежнее зачение:

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

Я не встречался раньше с ob_start(); но в данном случае мне кажеться что это стоит убрать?

  Ответить  
 
 автор: tvv123456   (01.11.2009 в 02:45)   письмо автору
 
   для: tvv123456   (01.11.2009 в 02:41)
 

.

  Ответить  
 
 автор: Trianon   (01.11.2009 в 03:19)   письмо автору
 
   для: tvv123456   (01.11.2009 в 02:41)
 

>>>Но если теперь в переменную $dop записать другое число, сохранить полученный код и
>>> ПЕРЕЗАПУСТИТЬ скрипт, то выводится прежнее зачение:
>
>В итоге получается, что производиться вызов измененого документа(не того же самого),

Того же. Имя осталось тем же. URI не содержал и намека на динамический характер формирования контента.

>то есть в любом случае результат должен быть другой.

Не должен. И опыт автора это подтверждает.

  Ответить  
 
 автор: Владимир55   (01.11.2009 в 12:53)   письмо автору
 
   для: Trianon   (01.11.2009 в 03:19)
 

Я Вас понял, Спасибо! Постараюсь это учесть. С динамическим адресом наверняка будет нормально.

А вот что будет, если подобный код инклюдится в цикл, и значение переменной различное в каждом цикле. Опять будет вызов того же документа, который образовался при первом обращении? Или с инклюдом иначе?

  Ответить  
 
 автор: Trianon   (01.11.2009 в 12:57)   письмо автору
 
   для: Владимир55   (01.11.2009 в 12:53)
 

Не знаю, что будет.
Для меня include (с постоянным именем файла) загнать в цикл - дикость явное нарушение.

  Ответить  
 
 автор: Владимир55   (01.11.2009 в 13:08)   письмо автору
 
   для: Trianon   (01.11.2009 в 12:57)
 

Вот как! А я так часто делаю! Может, по этой причине порою в скипте происходят трудноуловимые процессы и сбои непонятного происхождения.

Но ведь само по себе использование include в цикле допустимо? Если при этом дать подключаемому файлу случайный динамический адрес?

Или как?

Вы каким образом поступаете?

  Ответить  
 
 автор: Николай2357   (02.11.2009 в 08:08)   письмо автору
 
   для: Trianon   (01.11.2009 в 12:57)
 

>Для меня include (с постоянным именем файла) загнать в цикл - дикость явное нарушение.

Слово "дикость" в данном контексте вполне объяснимо, а вот "явное нарушение" очень любопытно чего?

  Ответить  
 
 автор: Владимир55   (02.11.2009 в 11:10)   письмо автору
 
   для: Николай2357   (02.11.2009 в 08:08)
 

Более того: сколько я ни пытался, поместить в цикл include НЕ с постоянным именем файла, а с динамическим, меняющимся при каждом подключении, вообще не удалось. Диагностируется ошибка - "нет такого файла". Похоже, что include требует точного имени файла, знак ? здесь учитывается не так, как в урлах.

  Ответить  
 
 автор: cheops   (02.11.2009 в 12:17)   письмо автору
 
   для: Николай2357   (02.11.2009 в 08:08)
 

>Слово "дикость" в данном контексте вполне объяснимо, а вот "явное нарушение" очень
>любопытно чего?
Вообще стараются не использовать include в таком качестве, так как это традиционно область применения функций.

  Ответить  
 
 автор: Николай2357   (02.11.2009 в 14:03)   письмо автору
 
   для: cheops   (02.11.2009 в 12:17)
 

Спасибо, это как раз понятно, это и относится к области "дикость". Если можно использовать класс или функцию, нет смысла подключать в цикле файл.
Вопрос несколько в другом. Если нарушение "явное", то наверное есть какие то стандарты или документация, регламентирующие этот момент. А они мне не известны...
Очень хотелось бы заполнить пробел в знаниях.

  Ответить  
 
 автор: cheops   (02.11.2009 в 14:17)   письмо автору
 
   для: Николай2357   (02.11.2009 в 14:03)
 

Дело в том, что включаемый файл каждый раз дергается при вызове include, один раз загруженная функция потом не приводит к обращению к файловой системе. Все обращения к файловой системе лучше сводить к минимуму, так как они очень дорогие. Собственно специально это обычно не проговаривают, это подразумевается неявно при создании любой программы, на любом языке программирования.

PS Существуют исключения, когда include в цикле допустим - если у вас несколько файлов и о том, что включать нужно принимать решение динамически, а функциями в силу причин вам воспользоваться не удобно.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования