Добрый вечер! У меня тут проблема с куками и локальным хранилищем. У меня есть единственный входной файл index.php. Сайт, предположим, имеет две ссылки: site.ru/something site.ru/go/something Так вот в index.php есть следующий код, что если ссылка "site.ru/something", то (1): Код (Text): $_SESSION['test'] = 'test'; var_dump($_SESSION); А если ссылка site.ru/go/something, то (2): Код (Text): var_dump($_SESSION); Так вот в случае, когда я первый раз загружаю страницу site.ru/something, на ней с помощью var_dump отображается, что в $_SESSION есть элемент "test" со значением "test". Но если я в этот момент зайду в настройки браузера (например, в Chrome, но так же и в Opera тестировал) и посмотрю куки, то там либо ничего, либо "Локальное хранилище". Если обновлю страницу, то будет то же самое. Если я после этого зайду на site.ru/go/something, то var_dump скажет, что массив $_SESSION пустой. Однако, зайдя опять же в куки я увижу, что появилась кука PHPSESSION. Тогда уже, когда я повторю действия и зайду на site.ru/something, все будет то же самое, но т.к. кука PHPSESSION уже есть, зайдя после этого на site.ru/go/something, я уже наконец увижу, что в SESSION что - то лежит. Удалив все куки, я решил зайти сначала на site.ru/go/something и увидел, что кука PHPSESSION сразу же создалась, тогда уже, зайдя на другую ссылку, а потом еще куда - то, все работало корректно. Следовательно вопросы: как это лечится? Почему при изначальном заходе на site.ru/something страница отображает, что в $_SESSION что - то лежит, но кука PHPSESSION не создается? Надеюсь, понятно объяснил суть проблемы. Если нет, то уточняйте. UPD: Забыл добавить: тот же самый index.php на локальной машине обрабатывает все верно, захожу на localhost/something и сразу создается PHPSESSION и все работает замечательно. Заливаю этот index.php на сервер и там получается то, что описал выше.
Естественно у меня есть вызов этой функции, иначе бы там вообще ничего не работало. Я описал только примерный код, который относится к данному вопросу. Так что тут не в этом проблема
так оно и не работает, не? развиваем мысль: если session_start() есть, но он не работает, можно предположить что какая-то хрень выводится до session_start(). например случился Warning, на который ты х* забил, как водится. кука устанавливается с помощью специального заголовка. заголовки не могут работать если уже произошел любой вывод на страницу. разница между разными хостингами может быть в уровне error_reporting(), поэтому я предполагаю что виноват warning. в одном из случев вывод предупреждений отключен. или есть разница в версиях php и в одном случае пребдупреждение говорит об устаревшей функции. короче в исходный текст страницы загляни. если есть возможность, сравни заголовки ответа сервера.
Я понимаю, как работает отправка куки. Поэтому у меня сначала вызывается session_start, потом присваивается $_SESSION, а потом уже идёт вывод. И на localhost все работает замечательно, но тот же код, залитый на хостинг ведёт себя непонятно. Но идея просмотреть заголовки и что там на уровне error_reporting мне понравилась, вечером проверю и отпишусь
В общем, я уже не знаю даже, что делать. Борюсь с этим 3ьи сутки. Включил все ошибки через error_reporting, все чисто. Версия PHP 5.3.28 на сервере, на локальном 5.4.26. Но не думаю, что из - за этого проблема, на некоторых страницах же корректно отправляется кука. Вот примеры ответов сервера: 1. site.ru/something (кука должна отправиться, но ничего) Код (Text): HTTP/1.1 200 OK Server: nginx/1.6.0 Date: Sat, 13 Dec 2014 17:17:46 GMT Content-Type: text/html; charset=utf-8 Content-Length: 6328 Connection: keep-alive X-Powered-By: PHP/5.3.28 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache 2. site.ru/go/dfsfsdfds (доступ закрыт, но сессия все равно создается, все правильно) Код (Text): HTTP/1.1 403 Forbidden Server: nginx/1.6.0 Date: Sat, 13 Dec 2014 17:28:44 GMT Content-Type: text/html; charset=utf-8 Content-Length: 5371 Connection: keep-alive X-Powered-By: PHP/5.3.28 Set-Cookie: PHPSESSID=bac8de0e91433535d80d1a62901347d4; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache 3. site.ru (главная страница, сессия логично создается) Код (Text): HTTP/1.1 200 OK Server: nginx/1.6.0 Date: Sat, 13 Dec 2014 17:18:16 GMT Content-Type: text/html; charset=utf-8 Content-Length: 2552 Connection: keep-alive X-Powered-By: PHP/5.3.28 Set-Cookie: PHPSESSID=dc10f78be6f9680185a138c0543bd062; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Возможно проблемы в .htaacess, так же прилагаю: Код (Text): RewriteEngine on #RewriteCond %{REQUEST_FILENAME} !-f #RewriteCond %{REQUEST_FILENAME} !-d RewriteRule !\.(js|css|jpg|gif|png|ico|txt)$ index.php #RewriteRule ^(.*)$ index.php?route=$1 [L,QSA] ErrorDocument 404 http://site.ru/404 Примерно так выглядит index.php: Код (Text): session_start(); $request = $_SERVER['REQUEST_URI']; $splits = explode ('/',trim($request,'/')); // site.ru/something if (!empty($splits[0])) $name = $splits[0]; // name = something else { //index.html; exit; } // site.ru/fdfsd/fdsfds/fsdfsd if (!empty($splits[2])){ // 404 error; exit; } if($name == 'go') { // do something; exit } elseif(!empty($splits[1])) { // 404 error; exit; } // site.ru/something ... Помогите решить эту проблему, уже никаких идей нет.
До session_start() что-нибудь есть? Может какой-нибудь include ? Не бывает чудес. Что-то мешает. Удали/закомментируй всё, кроме session_start, проверь ответ сервера. Потом включи половину того что убрал, проверь …
Дык и ты еще жалуешься((( Жизни ты еще не повидал))) Проблема может в чем угодно даже в маленькой гребанной переменной((( Дебажить надо!!!
denis01, да, код не работает именно на сервере, на localhost все замечательно. Не знаю, что там можно настроить каряво. Делал тесты вместе с тех. поддержкой. Т.е. если без специального .htaccess, который все перенаправляет на index.php, и роутинга, просто создать два файла test.php и test2.php, в первом написать: Код (Text): session_start(); $_SESSION['a'] = 'я сделан в test.php'; а в test2.php написать: Код (Text): session_start(); echo $_SESSION['a']; то все будет работать. Ganzal, логи сейчас не могу посмотреть, как получится, отпишусь о результатах. artoodetoo, да, конечно, перед session_start() есть кое - что, я же примерный index.php описал. В оригинале вместо session_start() у меня два инклуда. В первом описаны константы. Во втором описана автозагрузка классов, запуск сессии(имеется ввиду session_start()) и задается кодировка. Т.е. ничего криминального, перед заголовками ничего не отправляю. Мне кажется дело в моем жалком подобии роутинга или .htaccess. Просто если заходить на site.ru, то сессия отрабатывает все правильно, но это может быть так же из - за того, что index.php существует физически. Хотя если зайти на site.ru/bla/bla/bla, то все тоже работает. Еще была идея в том, что все из - за расширения названия файла. Т.е. ссылка у меня site.ru/some.zip. Файла физически такого нет, и тогда index.php начинает обработку. Пройдя до самого конца, где Код (Text): // site.ru/something ... в $name лежит some.zip, дальше у меня просто из БД берется нужная страница для этого файла и отображается пользователю. И все работает, все корректно отображается, но так же должна и создаваться сессия, в начале index.php же session_start() прописан, а она не создается. Может это описание поможет, и у кого - нибудь еще какие - то идеи будут, что можно сделать. И да, я же думал, что это из - за расширения, я изменил и заходил на site.ru/some-zip, все так же - страница отображается, а сессия не создается. Точнее, она создается(в отображение страница вставлял var_dump($_SESSION), все отображалось), но кука пользователю не отправляется. Соответственно, там получается убирать то нечего. Если роутинг убрать, который я описал выше, то вообще ничего работать не будет. А то, что дальше в Код (Text): // site.ru/something ... я думаю нет смысла убирать, т.к. все, что там работает отлично, там просто запрос к бд пара обработок и отображение. Я даже не знаю, что можно было бы там написать, чтобы перекрыть session_start(), написанный в начале файла. smitt, да я не столько жалуюсь, сколько хочу просто разобраться. Вроде все правильно, но не работает. При чем ошибка, наверное, какая - то на поверхности. Всем спасибо за ответы, надеюсь, будут еще.
Если кому интересно, то вчера ситуация разрешилась. После многих тестов, я все - таки убедился, что проблема не с моей стороны, а со стороны хостинга. Оказалось, что у них весь трафик проксируется через веб-сервер nginx, где запросы проходят через комплекс фильтров для защиты от переборов паролей к админкам Wordpress, Joomla, а также кэширования статического контента. Все это базируется на кукисах, и нужная мне кука обнулялась.