За последние 24 часа нас посетили 95453 программиста и 5669 роботов. Сейчас ищут 2803 программиста ...

PHP и сессии (клиент на PHP)

Тема в разделе "PHP для новичков", создана пользователем greenx2nsk, 2 июн 2016.

  1. greenx2nsk

    greenx2nsk Новичок

    С нами с:
    8 апр 2016
    Сообщения:
    5
    Симпатии:
    2
    Всем привет, очень надеюсь с Вашей помощью разобраться в проблеме.

    Вводная:
    1. Есть сервер (Apache+PHP). Требует авторизации (через GET-запрос), дальше на GET-запросы возвращает JSON.
    2. Есть скрипт на PHP, который выступает в роли клиента. Первым делом авторизуется на сервере, затем пытается вызвать GET-запрос.
    3. Сервер работает на сессиях (при авторизации в БД выбираем id пользователя и сохраняем его в сессионных переменных). При получении дальнейших запросов проверяем, что есть определенная сессионная переменная и соответственно возвращаем некий результат. Если этой переменной нет, то говорим, что сессия протухла и требуем авторизоваться

    Если GET-запросы делать через браузер, то все работает, т.е. сессия на сервере живет.
    Если запускаю PHP-скрипт, то авторизация проходит, но дальше все время получаю протухшую сессию.

    Что пытался сделать: пытался на этапе авторизации вернуть в скрипт ID сессии и вставить этот ID в следующий запрос, т.е. вместо
    Код (Text):
    1. http://url.com/index.php?param=123
    отправляю запрос
    Код (Text):
    1. http://url.com/index.php?param=123&PHPSESSID=j9he34alf8s29bqq1t8kktq5t7
    Не помогает...

    К серверу обращаюсь вот так:
    Код (Text):
    1. $lines = file('http://url.com/index.php?action=enter&PHPSESSID=j9he34alf8s29bqq1t8kktq5t7');
    2. foreach ($lines as $line) {
    3.     $res = json_decode($line, true);
    4. }
    Где и что я делаю неправильно?

    Заранее спасибо за помощь :)
     
  2. host

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

    С нами с:
    20 июн 2007
    Сообщения:
    728
    Симпатии:
    3
    Как вариант - сохранять не в сессию, а в БД.
     
    greenx2nsk нравится это.
  3. greenx2nsk

    greenx2nsk Новичок

    С нами с:
    8 апр 2016
    Сообщения:
    5
    Симпатии:
    2
    В БД...

    Вариант конечно, но тогда придется городить функционал сессий самому, в том числе протухание сессии...

    Идеальный вариант использовать штатные возможности, предлагаемые PHP, но если не найду как обойти, то видимо придется изобретать велосипед :)
     
  4. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    где ты тут передаёшь cookie с идентификатором сессии?

    Обращайся через cURL там есть возможность получать и отправлять cookie
     
    greenx2nsk нравится это.
  5. greenx2nsk

    greenx2nsk Новичок

    С нами с:
    8 апр 2016
    Сообщения:
    5
    Симпатии:
    2
    Я не передаю cookie, я передаю ID сессии в GET['PHPSESSID'].
    Этот механизм описан в документации к PHP как вариант работы при отключенных cookie.

    Про cURL почитаю, но есть одно "НО". Есть аналогичный скрипт на javascript, там та же проблема :) Но про javascript я здесь писать не буду :)
     
  6. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    тогда сравни через fiddler например, в чём разница когда всё работает в браузере и вариант из PHP.
     
    greenx2nsk нравится это.
  7. greenx2nsk

    greenx2nsk Новичок

    С нами с:
    8 апр 2016
    Сообщения:
    5
    Симпатии:
    2
    fiddler не ловит трафик от php-скрипта...
    --- Добавлено ---
    Поймал сессию браузера, попытался в PHPSESSID запихать ее идентификатор, не помогло.
    Надо как-то научится ловить на стороне сервера PHPSESSID, но как, не понятно.
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.601
    Симпатии:
    423
    Адрес:
    РД, г. Махачкала.
    Перечитал тему, что я советовал вам не подходит.
     
  9. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Это решается так, у fiddler есть proxy и через неё работаем с помощью cURL.
     
    mahmuzar и greenx2nsk нравится это.
  10. greenx2nsk

    greenx2nsk Новичок

    С нами с:
    8 апр 2016
    Сообщения:
    5
    Симпатии:
    2
    Разобрался :)
    В php.ini есть настройка session.use_only_cookies. По умолчанию она = 1, т.е. идентификатор сессии берется только из cookie.

    Решение:
    1. Прописать настройку в 0 в php.ini. Не очень правильно, т.к. будет действовать для всех сайтов на данном сервере
    2. В своих скриптах в session_start() передавать [use_only_cookies => 1]
    3. Перед session_start() вызывать функцию session_id($id), где $id - это ID нашей php-сессии (его передавать в GET).
    Я прикрутил себе третий вариант
    PHP:
    1. if ($_GET['PHPSESSID']) {session_id($_GET['PHPSESSID']);}
    Если делать без if, то слетают сессии в браузере.

    Ссылка на доку:
    http://www.php.net/manual/en/session.configuration.php#ini.session.use-only-cookies

    Большое спасибо всем за помощь!!!
     
    mahmuzar и denis01 нравится это.