В PHP будет создана сессия, если браузер не используется - PullRequest
7 голосов
/ 04 октября 2008

У меня есть API, который зависит от определенной информации о состоянии между запросами. В качестве простой первой версии кода я просто использую сеансы PHP для хранения информации о состоянии вместо чего-то более продвинутого (APC, memcache, DB). На протяжении всего моего первоначального тестирования в веб-браузере все работало идеально. Однако кажется, что когда клиенты пытаются подключиться через не браузерные методы, такие как Curl или wget, информация о состоянии не сохраняется.

Будет ли сеанс PHP создаваться, только если браузер запрашивает страницу? Я явно начинаю сеанс с помощью session_start (), а также присваиваю ему имя перед сеансом с помощью session_name ().

Добавленная заметка . Я узнал, что одной из основных проблем, с которыми я столкнулся, было то, что я называл сессию вместо того, чтобы устанавливать идентификатор сессии через session_id ($ id); Мое намерение при использовании session_name () состояло в том, чтобы получить тот же сеанс, который был ранее создан, и правильный способ сделать это - установить session_id, а не session_name

Похоже, что информация о сеансе будет сохраняться на сервере, как указано ниже (СПАСИБО). Но чтобы сохранить это, вы должны передать идентификатор сеанса или, как в моем случае, любой другой идентификатор, который бы однозначно идентифицировал пользователя. Используйте этот идентификатор в качестве session_id, и ваши сеансы будут функционировать, как ожидается.

Ответы [ 3 ]

20 голосов
/ 04 октября 2008

Сессионные куки

Помните, что HTTP не имеет состояния , поэтому сеансы отслеживаются на вашем сервере, но клиент должен идентифицировать себя с каждым запросом. Когда вы объявляете session_start (), ваш браузер обычно устанавливает cookie («идентификатор сеанса PHP»), а затем идентифицирует себя, отправляя значение cookie с каждым запросом. Когда скрипт вызывается с использованием запроса со значением сеанса, функция session_start () попытается найти сеанс. Чтобы доказать это самому себе, обратите внимание, что сеансы умирают, когда вы очищаете свои куки-файлы. Вы упомянули, что вы называете сеанс ... посмотрите куки вашего браузера и посмотрите, сможете ли вы найти куки с тем же именем.

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

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

mysite.com?PHPSESSID=10alksdjfq9e

Как это конкретно зависит от вашей версии PHP, но в основном это просто конфигурация. Если установлены правильные параметры времени выполнения, PHP будет прозрачно добавлять идентификатор сеанса в качестве параметра запроса к ссылкам на странице (конечно, только с одним и тем же источником). Вы можете найти подробности по настройке этого на PHP сайте .

Sidenote: Несколько лет назад это была распространенная проблема при попытке реализовать сеанс. Файлы cookie были более новыми, и многие люди отключали поддержку файлов cookie в своих браузерах из-за предполагаемых проблем безопасности.

Sidenote: @ Uberfuzzy делает хорошее замечание - использование сессий с curl или wget действительно возможно. Проблема в том, что он менее автоматический. Пользователь может выгружать значения заголовков в файл и использовать их в будущих запросах. У curl есть несколько флагов «осведомленности о cookie», которые позволяют вам легче справиться с этим, но вы все равно должны явно это сделать. Опять же, вы можете использовать это в ваших интересах. Если на вашем альтернативном клиенте имеется функция curl, вы можете сделать вызов самостоятельно, используя флаги осведомленности о cookie. См. руководство по скручиванию .

2 голосов
/ 04 октября 2008

Будет ли сеанс PHP создаваться только в том случае, если браузер запрашивает страницу?

Краткий ответ : Да. Сессии были созданы специально для решения проблемы HTTP без сохранения состояния, используя возможности браузера. APC, memcached, DB и т. Д. Не имеют значения. Это всего лишь методы хранения сессии, и они будут страдать от той же проблемы.

Более длинный ответ : Концепция сеансов была создана для учета того факта, что HTTP является протоколом без сохранения состояния, и оказывается, что это состояние очень важно для широкого спектра программных приложений.

Самым распространенным способом реализации сеансов является использование файлов cookie. PHP отправляет идентификатор сессии в cookie, а браузер отправляет cookie с идентификатором сессии обратно. Этот идентификатор используется на сервере, чтобы найти любую информацию, которую вы сохранили в сеансе. PHP имеет возможность включать и читать идентификатор сеанса в конце URL-адреса, , но это предполагает, что пользователи будут переходить на страницы вашего сайта / приложения, щелкая ссылки, которые содержат сгенерированный идентификатор сеанса. *

В вашем конкретном случае можно использовать куки с curl (и, возможно, wget). Curl - это веб-браузер, только один без графического интерфейса. Если вы используете программу curl для командной строки (в отличие от библиотеки C, расширения PHP и т. Д.), Ознакомьтесь со следующими параметрами

-b/--cookie
-c/--cookie-jar
-j/--junk-session-cookies
2 голосов
/ 04 октября 2008

Если вы вызываете session_start (), тогда будет создан сеанс, если клиент не существует. Если клиент не поддерживает (или настроен на игнорирование) механизм cookie или механизм строк запросов, используемый для поддержки сеанса, новый сеанс будет создаваться при каждом запросе.

Это может привести к переполнению вашего механизма хранения сеансов неиспользуемыми сеансами.

Может быть, лучше вызывать session_start () только тогда, когда у вас есть что-то для хранения в сеансе (например, логин пользователя или что-то еще, что роботы вряд ли будут делать), если вы чувствуете, что это, вероятно проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...