2010-03-30 159 views
12

我的公司拿了一些老的php应用程序。由于我们偏好使用ASP.net,并且缺乏以前开发人员的任何文档,所以我们不希望花费太多资源来开发PHP。 为了实现新功能,我们将创建一个与用户具有相同外观的Asp.net应用程序。我们想开发一种'共存'的网络应用程序。因此,我们必须在PHP和Asp.net Web应用程序项目之间共享会话,因为涉及现有MySQL数据库的用户管理。如何在PHP和ASP.net应用程序之间共享会话?

(例如链接“A”引导到PHP的网站,并链接“B”引导到asp.net应用程序)

我们怎样才能和PHP和asp.net应用程序之间共享会话?

是否有人提示这种'共存'的东西​​,这可能在开发中有用?

编辑:IIS 6将是我们的目标服务器,altough IIS 7.5也将是一种选择

回答

13

我想告诉你,我怎么会做这件事。

这两个应用程序都访问一个MySQL数据库并访问一个“会话”表,它包含一个Guid,用户的ID和一个confirmationString(我猜我编码了IDUser)。

会议仅由PHP应用程序启动(由于这样的事实,即PHP应用仍然是主要应用程序)。新会话将在日志表中生成一个新条目。 PHP应用程序中每一个环节,链接到ASP.Net应用程序包含GET参数,包含的GUID等

的ASP.net应用程序检查的GET参数和设置ID用户在ASP.Net会议如果GET-Parameters指向一个现有的会话。

指回PHP程序的链接使用相同的技术。

(也有其他的事情要考虑,比如超时或注销,但可以处理为好)

所有的一切,我会说,我的方法是有用的,因为没有客户抱怨部署(超过1年前)

+0

感谢解决方案,这正是我也在努力。 – Mana 2012-12-11 07:53:08

0

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

您可以编写PHP的会话到MSSQL,并配置.NET使用MsSQL作为会话的后端。

+0

@Yossarian在MySQL中配置会话状态并不是很受ASP.NET支持,因为它使用了几个标准的过程,如果我没有弄错,它确实使用'SqlConnection'对象连接到** SQL服务器**后端。 – 2010-03-30 10:54:26

+0

是否有任何理由,你不能通过另一个连接器从MySQL连接到SQL服务器,并读取与SqlConnection相同的数据? – nothrow 2010-03-31 08:47:33

2

我不认为它本地可能共享PHP和ASP.NET之间的会话。

但是,通过使用读取会话内容的PHP页面,将它们存储在隐藏字段中,然后调用ASP.NET页面来读取这些字段并将它们加载到ASP.NET会话中,可能是可能的。

理论上有可能。

0

没什么大不了的。
你的ASP应用程序应该做的三个简单的事情:

  • 收到来自客户端的会话ID的Cookie
  • 认准sess_<id>文件中的PHP会话保存路径
  • 实现PHP序列化/反序列化功能读/写会话数据。
-1

哦,亲爱的,也许有一天你会看到你的方式错误,在此期间.....

默认情况下,PHP写入其会话数据序列化阵列到指定的文件根据会议。会话通常由名称为PHPSESSID的cookie标识。

所以在PHP手动读取会话:

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

文件的格式非常简单,简单解析。

然而,它很容易实现自己的PHP会话处理程序,以任何格式/将文件写入任何你喜欢的存储器(看看如何将修改过的代码与每个页面关联而不必重写每一个)。或者更改cookie用于存储会话的名称。

C.

+6

你会介意解释“哦,亲爱的,也许有一天,你会看到你的方式错误,在此期间......”? – citronas 2010-03-30 11:22:37

0

不是仅仅攻入两侧会话存储机制的一个更好的办法是建立OpenID提供商和堵塞的OpenID消费者都asp.net和PHP应用程序。

有很多现有的代码来做到这一点。与低级解决方案相比,它将更加优雅和容易出错。作为奖励,您可以在公司其他应用程序中使用集成的OpenId登录,并成为公司的英雄。

请参见:Using OpenID for both .NET/Windows and PHP/Linux/Apache web sites

2

这是一个老问题,但我不认为任何目前的答案是完整的。

首先,我认为这是一个坏主意,存储在MySQL或SQL Server中的数据库服务器会话数据。数据库是一个宝贵的资源,真的没有理由只为会话数据进行颠簸。

如果你打算把会话存储在类似的数据库中,那么有更好的方法来做到这一点,比如确保会话数据在自己的独立磁盘上等等......但老实说,我仍然觉得这是一个错误,并会限制你的可扩展性。

对于存储会话,你想要一个简单的键/值存储,在我看来,你不能击败memcached(尽管我已经有了redis + nodejs的好运气)。

memcached的具有可用于几乎每一种语言的客户端在地球上:http://code.google.com/p/memcached/wiki/Clients

所以,基本上所有你需要做的使用memcached的时候是生成的关键伪随机令牌,并做了memcached.set。然后将该密钥存储在名为session-id的cookie中。

session-id cookie可以从任何服务器语言,.net,php,python等等中读取,并且可以通过简单的memcached.get检索会话值。

退房memcached的文档:http://code.google.com/p/memcached/wiki/NewStart

这是一个非常简单的和可扩展的方式做会议,并将与几乎任何语言/服务器工作。

+0

而不是使用Memcache,我可以使用Microsoft Velocity进行PHP和ASP.NET之间的通信吗?微软Velocity会使用PHP吗?如果是的话,Microsoft Velocity如何与PHP一起工作? – user1338998 2013-11-14 19:06:12

相关问题