Как разделить сессии между PHP и приложением ASP.net? - PullRequest
13 голосов
/ 30 марта 2010

Моя компания переняла старое php-приложение. Из-за нашего предпочтения ASP.net и отсутствия какой-либо документации от предыдущего разработчика, мы не хотим тратить много ресурсов на разработку на PHP. Для реализации новых функций мы создадим приложение Asp.net, которое будет выглядеть одинаково для пользователя. Мы хотим разработать своего рода «сосуществующее» веб-приложение. Поэтому мы должны делиться сессиями между PHP и проектом веб-приложения Asp.net, потому что есть управление пользователями, связанное с существующей базой данных MySQL.

(например, ссылка «A» направляет на веб-сайт PHP, а ссылка «B» направляет в приложение asp.net)

Как мы можем поделиться сессией между PHP и приложением asp.net?

И есть ли у кого-нибудь подсказка для этой «сосуществующей» вещи, которая может быть полезна при разработке?

Редактировать : IIS 6 будет нашим целевым сервером, хотя IIS 7.5 также будет вариантом

Ответы [ 7 ]

14 голосов
/ 25 сентября 2011

Я хочу рассказать вам, как я это сделал.

Оба приложения обращаются к базе данных MySQL и к таблице «сеансов», которая состоит из Guid, идентификатора пользователя, и String String (я думаю, я как-то закодировал IDUser в нем) и даты.

Сеансы запускаются только приложением PHP (из-за того, что приложение PHP по-прежнему является основным приложением). Новый сеанс приведет к новой записи в таблице журнала. Каждая ссылка в приложении PHP, которая ссылается на приложение ASP.Net, содержит GET-параметры, содержащие Guid и т. Д.

Приложение ASP.net проверяет GET-параметры и устанавливает IDUser в сеансе ASP.Net, если GET-параметры указывают на существующий сеанс.

Ссылки, указывающие на приложение PHP, используют ту же технику.

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

В целом, я бы сказал, что мой подход полезен, и никто из клиентов не жаловался с момента развертывания (более 1 года назад)

2 голосов
/ 20 марта 2013

Это старый вопрос, но я не думаю, что какой-либо из текущих ответов был полным.

Во-первых, я считаю плохой идеей хранить данные сеанса на сервере базы данных, таком как mysql или SQL Server. БД - это ценный ресурс, и на самом деле нет причин использовать его только для данных сеанса.

Если вы собираетесь хранить сеанс в такой базе данных, есть «лучшие» способы сделать это, например, убедиться, что данные сеанса находятся на собственном независимом диске, и т. Д. ... но, честно говоря, я все еще чувствую как будто это ошибка и ограничит вашу масштабируемость.

Для хранения сессии вы хотите использовать простое хранилище ключей / значений, и, по моему мнению, вы не можете превзойти memcached (хотя мне также повезло с redis + nodejs).

У memcached есть клиенты, доступные практически для любого языка на земле: http://code.google.com/p/memcached/wiki/Clients

Итак, в основном все, что вам нужно сделать при использовании memcached, - это сгенерировать псевдослучайный токен для ключа и создать memcached.set. Затем сохраните этот ключ в файле cookie, который называется идентификатор сессии или что-то в этом роде.

Файл cookie с идентификатором сеанса может быть считан с любого языка сервера, .net, php, python и т. Д., А значение сеанса можно получить с помощью простого memcached.get.

Проверьте документы в memcached: http://code.google.com/p/memcached/wiki/NewStart

Это очень простой и масштабируемый способ выполнения сеансов, который будет работать практически с любым языком / сервером.

2 голосов
/ 30 марта 2010

Я не думаю, что изначально возможно разделять сессии между PHP и ASP.NET.

Однако это может быть возможно при использовании страницы PHP, которая читает содержимое сеанса, сохраняет их в скрытых полях, а затем вызывает страницу ASP.NET, которая считывает эти поля и загружает их в сеанс ASP.NET.

Теоретически это возможно.

0 голосов
/ 19 января 2011

Лучше, чем просто взломать механизмы хранения сеансов с обеих сторон, - это настроить поставщика OpenId и подключить потребителей OpenId к приложениям asp.net и php.

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

См .: Использование OpenID для веб-сайтов .NET / Windows и PHP / Linux / Apache

0 голосов
/ 30 марта 2010

О, дорогой, может быть, однажды ты увидишь ошибку своих путей, тем временем .....

По умолчанию PHP записывает свои данные сеанса в виде сериализованного массива в файл с именем в соответствии с сеансом. Сеанс обычно идентифицируется с помощью файла cookie с именем PHPSESSID.

Так что в PHP вручную читать сессию:

$imported_session=unserialize(file_get_contents(session_save_path() . '/' . $_COOKIE[session_name()]));

Формат файла очень прост и легко разбирается.

Однако довольно легко реализовать свой собственный обработчик сеанса PHP для записи файлов в любом формате / в любое хранилище, которое вам нравится (посмотрите на автоматическое добавление, чтобы связать пересмотренный код с каждой страницей, не переписывая каждую один). Или измените имя файла cookie, используемого для хранения сеанса.

С

0 голосов
/ 30 марта 2010

Ничего страшного.
Ваше приложение asp должно сделать три простых вещи:

  • Получить сессионный cookie от клиента
  • найдите файл sess_<id> в пути сохранения сеанса PHP
  • реализовать функции сериализации / десериализации PHP для чтения / записи данных сеанса.
0 голосов
/ 30 марта 2010

http://cz.php.net/manual/en/function.session-set-save-handler.php
http://support.microsoft.com/kb/317604

Вы можете записывать сеансы PHP в MsSQL и настраивать .NET для использования MsSQL в качестве бэкенда для сеансов.

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