2010-03-30 248 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

相關問題