За последние 24 часа нас посетили 17739 программистов и 1280 роботов. Сейчас ищут 1443 программиста ...

Отправка сессии

Тема в разделе "Прочие вопросы по PHP", создана пользователем [code], 12 дек 2014.

  1. [code]

    [code] Новичок

    С нами с:
    14 июл 2014
    Сообщения:
    32
    Симпатии:
    0
    Добрый вечер!
    У меня тут проблема с куками и локальным хранилищем. У меня есть единственный входной файл index.php. Сайт, предположим, имеет две ссылки:
    site.ru/something
    site.ru/go/something

    Так вот в index.php есть следующий код, что если ссылка "site.ru/something", то (1):
    Код (Text):
    1. $_SESSION['test'] = 'test';
    2. var_dump($_SESSION);
    А если ссылка site.ru/go/something, то (2):
    Код (Text):
    1. 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 на сервер и там получается то, что описал выше.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    Для появления сессионной куки нужен вызов session_start().
     
  3. [code]

    [code] Новичок

    С нами с:
    14 июл 2014
    Сообщения:
    32
    Симпатии:
    0
    Естественно у меня есть вызов этой функции, иначе бы там вообще ничего не работало. Я описал только примерный код, который относится к данному вопросу.
    Так что тут не в этом проблема
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    так оно и не работает, не?

    развиваем мысль: если session_start() есть, но он не работает, можно предположить что какая-то хрень выводится до session_start(). например случился Warning, на который ты х* забил, как водится.

    кука устанавливается с помощью специального заголовка. заголовки не могут работать если уже произошел любой вывод на страницу.
    разница между разными хостингами может быть в уровне error_reporting(), поэтому я предполагаю что виноват warning. в одном из случев вывод предупреждений отключен. или есть разница в версиях php и в одном случае пребдупреждение говорит об устаревшей функции.

    короче в исходный текст страницы загляни. если есть возможность, сравни заголовки ответа сервера.
     
  5. [code]

    [code] Новичок

    С нами с:
    14 июл 2014
    Сообщения:
    32
    Симпатии:
    0
    Я понимаю, как работает отправка куки. Поэтому у меня сначала вызывается session_start, потом присваивается $_SESSION, а потом уже идёт вывод. И на localhost все работает замечательно, но тот же код, залитый на хостинг ведёт себя непонятно. Но идея просмотреть заголовки и что там на уровне error_reporting мне понравилась, вечером проверю и отпишусь
     
  6. [code]

    [code] Новичок

    С нами с:
    14 июл 2014
    Сообщения:
    32
    Симпатии:
    0
    В общем, я уже не знаю даже, что делать. Борюсь с этим 3ьи сутки. Включил все ошибки через error_reporting, все чисто. Версия PHP 5.3.28 на сервере, на локальном 5.4.26. Но не думаю, что из - за этого проблема, на некоторых страницах же корректно отправляется кука. Вот примеры ответов сервера:
    1. site.ru/something (кука должна отправиться, но ничего)
    Код (Text):
    1. HTTP/1.1 200 OK
    2. Server: nginx/1.6.0
    3. Date: Sat, 13 Dec 2014 17:17:46 GMT
    4. Content-Type: text/html; charset=utf-8
    5. Content-Length: 6328
    6. Connection: keep-alive
    7. X-Powered-By: PHP/5.3.28
    8. Expires: Thu, 19 Nov 1981 08:52:00 GMT
    9. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    10. Pragma: no-cache
    2. site.ru/go/dfsfsdfds (доступ закрыт, но сессия все равно создается, все правильно)
    Код (Text):
    1. HTTP/1.1 403 Forbidden
    2. Server: nginx/1.6.0
    3. Date: Sat, 13 Dec 2014 17:28:44 GMT
    4. Content-Type: text/html; charset=utf-8
    5. Content-Length: 5371
    6. Connection: keep-alive
    7. X-Powered-By: PHP/5.3.28
    8. Set-Cookie: PHPSESSID=bac8de0e91433535d80d1a62901347d4; path=/
    9. Expires: Thu, 19 Nov 1981 08:52:00 GMT
    10. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    11. Pragma: no-cache
    3. site.ru (главная страница, сессия логично создается)
    Код (Text):
    1. HTTP/1.1 200 OK
    2. Server: nginx/1.6.0
    3. Date: Sat, 13 Dec 2014 17:18:16 GMT
    4. Content-Type: text/html; charset=utf-8
    5. Content-Length: 2552
    6. Connection: keep-alive
    7. X-Powered-By: PHP/5.3.28
    8. Set-Cookie: PHPSESSID=dc10f78be6f9680185a138c0543bd062; path=/
    9. Expires: Thu, 19 Nov 1981 08:52:00 GMT
    10. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    11. Pragma: no-cache
    Возможно проблемы в .htaacess, так же прилагаю:
    Код (Text):
    1. RewriteEngine on
    2. #RewriteCond %{REQUEST_FILENAME} !-f
    3. #RewriteCond %{REQUEST_FILENAME} !-d
    4. RewriteRule !\.(js|css|jpg|gif|png|ico|txt)$ index.php
    5. #RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
    6. ErrorDocument 404 http://site.ru/404
    Примерно так выглядит index.php:
    Код (Text):
    1.  
    2.         session_start();
    3.     $request = $_SERVER['REQUEST_URI'];
    4.     $splits = explode ('/',trim($request,'/'));
    5.        
    6.         // site.ru/something
    7.     if (!empty($splits[0]))
    8.              $name = $splits[0]; // name = something
    9.     else
    10.         {
    11.         //index.html; exit;
    12.     }
    13.         // site.ru/fdfsd/fdsfds/fsdfsd
    14.     if (!empty($splits[2])){
    15.         // 404 error; exit;
    16.     }
    17.  
    18.     if($name == 'go')
    19.     {
    20.         // do something; exit
    21.     }
    22.     elseif(!empty($splits[1]))
    23.     {
    24.         // 404 error; exit;
    25.     }
    26.        
    27.         // site.ru/something
    28.         ...

    Помогите решить эту проблему, уже никаких идей нет.
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Так код на сервере не работает? Может его коряво настроили.
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а файл сессии создается? в журналах что-нибудь необычное есть?
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    До session_start() что-нибудь есть? Может какой-нибудь include ?

    Не бывает чудес. Что-то мешает.
    Удали/закомментируй всё, кроме session_start, проверь ответ сервера. Потом включи половину того что убрал, проверь …
     
  10. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Дык и ты еще жалуешься((( Жизни ты еще не повидал)))
    Проблема может в чем угодно даже в маленькой гребанной переменной((( Дебажить надо!!!
     
  11. [code]

    [code] Новичок

    С нами с:
    14 июл 2014
    Сообщения:
    32
    Симпатии:
    0
    denis01, да, код не работает именно на сервере, на localhost все замечательно. Не знаю, что там можно настроить каряво. Делал тесты вместе с тех. поддержкой. Т.е. если без специального .htaccess, который все перенаправляет на index.php, и роутинга, просто создать два файла test.php и test2.php, в первом написать:
    Код (Text):
    1. session_start();
    2. $_SESSION['a'] = 'я сделан в test.php';
    а в test2.php написать:
    Код (Text):
    1. session_start();
    2. 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):
    1. // site.ru/something
    2.         ...
    в $name лежит some.zip, дальше у меня просто из БД берется нужная страница для этого файла и отображается пользователю. И все работает, все корректно отображается, но так же должна и создаваться сессия, в начале index.php же session_start() прописан, а она не создается. Может это описание поможет, и у кого - нибудь еще какие - то идеи будут, что можно сделать.
    И да, я же думал, что это из - за расширения, я изменил и заходил на site.ru/some-zip, все так же - страница отображается, а сессия не создается. Точнее, она создается(в отображение страница вставлял var_dump($_SESSION), все отображалось), но кука пользователю не отправляется.
    Соответственно, там получается убирать то нечего. Если роутинг убрать, который я описал выше, то вообще ничего работать не будет. А то, что дальше в
    Код (Text):
    1. // site.ru/something
    2.         ...
    я думаю нет смысла убирать, т.к. все, что там работает отлично, там просто запрос к бд пара обработок и отображение. Я даже не знаю, что можно было бы там написать, чтобы перекрыть session_start(), написанный в начале файла.

    smitt, да я не столько жалуюсь, сколько хочу просто разобраться. Вроде все правильно, но не работает. При чем ошибка, наверное, какая - то на поверхности.

    Всем спасибо за ответы, надеюсь, будут еще.
     
  12. INETCHIK

    INETCHIK Активный пользователь

    С нами с:
    13 фев 2014
    Сообщения:
    35
    Симпатии:
    0
    header_remove(); мб?
    Может на хостинге скрытый код рекламы имеется
     
  13. [code]

    [code] Новичок

    С нами с:
    14 июл 2014
    Сообщения:
    32
    Симпатии:
    0
    Если кому интересно, то вчера ситуация разрешилась. После многих тестов, я все - таки убедился, что проблема не с моей стороны, а со стороны хостинга. Оказалось, что у них весь трафик проксируется через веб-сервер nginx, где запросы проходят через комплекс фильтров для защиты от переборов паролей к админкам Wordpress, Joomla, а также кэширования статического контента. Все это базируется на кукисах, и нужная мне кука обнулялась.
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    и что же ты сделал в этом случае?
     
  15. [code]

    [code] Новичок

    С нами с:
    14 июл 2014
    Сообщения:
    32
    Симпатии:
    0
    Обратился в тех. поддержку, и они сняли ограничения )