Проблема при старте сеанса на WML-странице

agx

Программер :-)
Проблема при старте сеанса на WML-странице

Вопрос в следующем:
Я генерю WML страницу при помощи PHP. Скрипт выполняет авторизацию реализованную при помощи сеансов. Сценарий должен извлекать данные из БД, сравнивать их с введенными пользователем и заносить результат (авторизован/не_авторизаван) в переменные сеанса. Так вот, при вызове функции session_start() что-то просиходит со страницей, и после этого мой wap-эмулятор (M3Gate) не может ее отобразить. Стоит закоментировать session_start() - страница генереится правильно, и эмулятор ее отображает корректно. Подскажите, как эту проблему решить? Что может такого сервер добавлять к странице при вызове session_start(), что она перестает пониматься микробраузером?
Привожу текст ошибки, которую выдает M3Gate:
---
Bad WML syntax. 'Fatal Error. Ln 1, Col 1 The main XML document cannot be empty'.
---
 

Фанат

oncle terrible
Команда форума
а если обычным браузером или из консоли вызвать - что пишет?
 

agx

Программер :-)
Запустил из командной строки, ошибка оказалась банальной:
---
Cannot send session cache limiter - headers already sent
---
Но тогда в какой строке сценария вызывать session start()?
Вот код простейшего сценария:
---
<?php //session_start(); ?>
<?php header("Content-Type: text/vnd.wap.wml;"); ?>
<?php echo '<'.'?'.'xml version="1.0"'.'?'.'>'; ?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main" title="WorkMAN">
<p>Hello</p>
</card>
</wml>
---
Если убрать комментарии в первой строке возникает пресловутая ошибка. Понятно, почему она возникает, но не понятно, как от нее избавиться?
 

Фанат

oncle terrible
Команда форума
не вижу никаких комментариев в первой строчке.
Избавляются от этой ошибки таким же банальным путём, как и сама ошибка.
 

agx

Программер :-)
Фанат
Имелся в виду вот этот оператор:
<?php //session_start(); ?>
---
Наверное, путь этот очевиден, но не для меня. Намекни хотя бы, как от этой ошибки избавиться. Please! :)
 

agx

Программер :-)
Ладно, а как тогда сделать, чтобы session cache limiter не отсылался? Или как его правильно отсылать? И вообще, что такое session cache limiter?
 

Фанат

oncle terrible
Команда форума
при чём здесь это всё? Неужели так трудно прочитать сообщение об ошибке?

-~{}~ 29.05.05 16:19:

сдаётся мне, что ты темнишь, мил человек.
ведь если у тебя сессия ругается на заголовки, то и
<?php header("Content-Type: text/vnd.wap.wml;"); ?>
тоже должна
 

agx

Программер :-)
В том то и дело, я сейчас попробовал написать простой скрипт на использование сеансов, взял его из книжки:
---
<?php session_start(); ?>
<html>
<head>
<title>Пример</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<?php
echo 'HelloWorld';
$_SESSION['asd']="gx";
?>
<a href="next.php?<?php echo SID; ?>">href</a>
</body>
</html>
---
Он работает, но только если запустить из командной строки, то выдает то же самое предупреждение.
===
А на <?php header("Content-Type: text/vnd.wap.wml;"); ?> не ругается. Я немного выше приводил полный код wml страницы, она корректно отображается в M3Gate, и из командной строки тоже корректно выполняется.

-~{}~ 29.05.05 16:26:

Может, что-то связанное с настройкой php.ini или сервера?
 

Фанат

oncle terrible
Команда форума
интересно, сколько раз надо тебе повторить,чтобы ты прочитал сообщение об ошибке?
 

agx

Программер :-)
Из сообщения об ошибке
---
Cannot send session cache limiter - headers already sent
---
Я понял следующее: Не могу отправить session cache limiter, так как HTTP-заголовок уже отправлен. Но как он мог уже отправиться, если я вызываю session_start() первой строкой? Как и когда тогда ее вообще надо вызывать?
 

Фанат

oncle terrible
Команда форума
посмотри свой файл чем-нибудь ещё, ФАРом, к примеру.
и прочти, наконец, сообщение об ошибке. ЦЕЛИКОМ
 

agx

Программер :-)
В блокноте содержимое сценария один в один такое же, как я приводил выше. Более того, я их блокнота целиком весь этот код и копировал.
Сообщение полностью выглядит так:
---
PHP Warning: session_start() [<a href='http://www.php.net/function.session-start'>function.session-start</a>]: Cannot send session cache limiter - headers already sent in c:\test.php on line 1
---
На мой взгляд, ничего нового здесь не пишут. PHP все так же ругается на то, что уже успел отправить заголовок. Непонятно только, когда именно.
 

Фанат

oncle terrible
Команда форума
Непонятно только, когда именно.
именно это тебе и пишут.

А ещё тебе пишут, чтобы ты посмотрел свой код ЕЩЁ В КАКОМ_НИБУДТЬ РЕДАКТОРЕ
НЕ БЛОКНОТЕ
 

SiMM

Новичок
> В блокноте содержимое сценария один в один такое же, как я приводил выше.
Не говори гоп, пока не перепрыгнешь. Наверняка вставляется какая-нибудь гадость типа BOM, ты ведь в UTF-8 поди текст сохранаешь, не так ли? Ни каких BOM быть не должно.
PHP FAQ: решение проблемы "Cannot add header information - headers already sent"
 

agx

Программер :-)
Вы не поверите, но в файле кроме того кода, который я приводил не АБСОЛЮТНО НИЧЕГО! Открывал его в фаре, даже в шестнадцатиричном виде его просматривал. СОВЕРШЕННО ничего лишнего. Еше раз код файла, скопированного из ФАРы:
---
<?php session_start(); ?>
<?php header("Content-Type: text/vnd.wap.wml;"); ?>
<?php echo '<'.'?'.'xml version="1.0"'.'?'.'>'; ?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="qwe" title="WorkMAN">
<p>Hello</p>
</card>
</wml>
---
Ну что тут может быть не так??? Pleace, HELP!!!
 

Фанат

oncle terrible
Команда форума
Очень странная штука.
Вообще, по виду этого кода, рукаться должно не на сессии, а на следующую строчку.

Ищи глюки у себя.
Может быть, ты запускаешь не тот файл, который редактируешь
 

agx

Программер :-)
Фанат
Да нет, именно его. Комментирую первый оператор и запускаю - все ОК, убераю комментарий - все bad.
Кстати, ты говоришь, что должен ругаться на header(). А как тогда в одном сценарии отправить заголовок через header и использовать сеансы одновременно? Ведь чтобы wml-документ сгененериь, без header("Content-Type: text/vnd.wap.wml;"); не обойдешься, разве не так. И в то же время, чтобы сессии использовать, нужно вызывать session_start(). Или может, мне попытаться автозапуск сессий включить? Сейчас попробую...

-~{}~ 29.05.05 17:41:

Включил session.auto_start, и убрал вызов session_start() из сценария. PHP из командной строки ругаться перестал, однако теперь все, что проходит через php, M3Gate не воспринимает. Выдает ту же ошибку, что и раньше. Чудеса, да и только.

-~{}~ 29.05.05 17:49:

Подскажите, может быть, есть какие-то настройки PHP или сервера (Apache), с которыми можно поэкспериментировать, чтобы решить мою проблему?
 
Сверху