您的位置:首页 > 编程语言 > ASP

Asp.net mvc与PHP的Session共享的实现

2014-07-01 11:57 525 查看
最近在做的一个ASP.NET MVC的项目,要用到第三方的php系统,为了实现两个系统的互联互通。决定将两者的session打通共享。让asp.net mvc 和php 都能正常访问和修改Session内容。

在决定实现之前,先搜索了一下院子里有没有相类似的文章,对于跨语言的程序互通,有两种方案:

(1) SSO单点登录,其实就是把用户名和密码传给另一个系统在另一个系统上自动创建session 来解决。

(2) 还有就是用同一套Session,在数据库或缓存上架设session服务。

第一种方案因为两套系统的交互比较多,不仅仅是登陆和验证,所以不适合。

第二种方案网上资料不多,不过关于session 数据库持久化的内容不少。选择第二种方案。

先说一下 大概的思路:

(1) 将Asp.net 的Session 采用mysql 存储。

(2) 将PHP的session也采用同一个数据库,同一张表存储。

(3) 修改Asp.net的Session内容的序列化和反序列化方式,使之与PHP的序列号方式相同。

(4) 修改两者的 cookie 中的sessionID 名称让二者采用同一个Sessionid名称。

(5) 修改两者的cookie作用域,使两者的Cookie Domin 位于主域名如 xxx.com。

(6) 解决后续出现的问题。

* php session 序列化格式: user_id|s:1:"3";user_name|s:4:"test";email|s:12:"fdff@fdf.com";avatarSrc|s:0:"";

闲话不多说直接上代码。

--Mysql 数据表的创建代码
CREATE TABLE `sessions` (
`SessionId` VARCHAR(80) NOT NULL,
`ApplicationName` VARCHAR(255) NOT NULL,
`Created` DATETIME NOT NULL,
`Expires` DATETIME NOT NULL,
`LockDate` DATETIME NOT NULL,
`LockId` INT(10) UNSIGNED NOT NULL,
`Timeout` INT(10) UNSIGNED NOT NULL,
`Locked` SMALLINT(1) UNSIGNED NOT NULL,
`SessionItems` LONGTEXT NOT NULL,
`Flags` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`SessionId`,`ApplicationName`)
) ENGINE=INNODB DEFAULT CHARSET=utf8


  

Asp.net SessionProvider 代码

public class SessionProvider : SessionStateStoreProviderBase
{

private SessionStateSection pConfig = null;
private string connectionString;
private ConnectionStringSettings pConnectionStringSettings;
private string eventSource = "OdbcSessionStateStore";
private string eventLog = "Application";
private string exceptionMessage =
"An exception occurred. Please contact your administrator.";
private string pApplicationName;

//
// If false, exceptions are thrown to the caller. If true,
// exceptions are written to the event log.
//

private bool pWriteExceptionsToEventLog = false;

public bool WriteExceptionsToEventLog
{
get { return pWriteExceptionsToEventLog; }
set { pWriteExceptionsToEventLog = value; }
}

//
// The ApplicationName property is used to differentiate sessions
// in the data source by application.
//

public string ApplicationName
{
get { return pApplicationName; }
}

public override void Initialize(string name, NameValueCollection config)
{
//
// Initialize values from web.config.
//

if (config == null)
throw new ArgumentNullException("config");

if (name == null || name.Length == 0)
name = "OdbcSessionStateStore";

if (String.IsNullOrEmpty(config["description"]))
{
config.Remove("description");
config.Add("description", "Sample ODBC Session State Store provider");
}

// Initialize the abstract base class.
base.Initialize(name, config);

//
// Initialize the ApplicationName property.
//

pApplicationName =
System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath;

//
// Get <sessionState> configuration element.
//

Configuration cfg =
WebConfigurationManager.OpenWebConfiguration(ApplicationName);
pConfig =
(SessionStateSection)cfg.GetSection("system.web/sessionState");

//
// Initialize connection string.
//

pConnectionStringSettings =
ConfigurationManager.ConnectionStrings["MySqlSessionServices"];

//if (pConnectionStringSettings == null ||
//  pConnectionStringSettings.ConnectionString.Trim() == "")
//{
//    throw new ProviderException("Connection string cannot be blank.");
//}

connectionString = pConnectionStringSettings.ConnectionString;

//
// Initialize WriteExceptionsToEventLog
//

pWriteExceptionsToEventLog = false;

//if (config["writeExceptionsToEventLog"] != null)
//{
//    if (config["writeExceptionsToEventLog"].ToUpper() == "TRUE")
//        pWriteExceptionsToEventLog = true;
//}
}

//
// SessionStateStoreProviderBase members
//

public override void Dispose()
{
}

//
// SessionStateProviderBase.SetItemExpireCallback
//

public override bool SetItemExpireCallback(SessionStateItemExpireCallback expireCallback)
{
return false;
}

//
// SessionStateProviderBase.SetAndReleaseItemExclusive
//

public override void SetAndReleaseItemExclusive(HttpContext context,
string id,
SessionStateStoreData item,
object lockId,
bool newItem)
{
// Serialize the SessionStateItemCollection as a string.
string sessItems = Serialize((SessionStateItemCollection)item.Items);

#region odbc代码
//MySqlConnection conn = new MySqlConnection(connectionString);
//MySqlCommand cmd;
//MySqlCommand deleteCmd = null;
#endregion

MySqlConnection conn = new MySqlConnection(connectionString);
MySqlCommand cmd;
MySqlCommand deleteCmd = null;

if (newItem)
{
// MySqlCommand to clear an existing expired session if it exists.
deleteCmd = new MySqlCommand("DELETE FROM Sessions " +
"WHERE SessionId = ? AND ApplicationName = ? AND Expires < ?", conn);
deleteCmd.Parameters.Add("@SessionId",MySqlDbType.VarChar, 80).Value = id;
deleteCmd.Parameters.Add
("@ApplicationName", MySqlDbType.VarChar, 255).Value = ApplicationName;
deleteCmd.Parameters.Add
("@Expires", MySqlDbType.DateTime).Value = DateTime.Now;

// MySqlCommand to insert the new session item.
cmd = new MySqlCommand("INSERT INTO Sessions " +
" (SessionId, ApplicationName, Created, Expires, " +
"  LockDate, LockId, Timeout, Locked, SessionItems, Flags) " +
" Values(?, ?, ?, ?, ?, ? , ?, ?, ?, ?)", conn);
cmd.Parameters.Add("@SessionId", MySqlDbType.VarChar, 80).Value = id;
cmd.Parameters.Add
("@ApplicationName", MySqlDbType.VarChar, 255).Value = ApplicationName;
cmd.Parameters.Add
("@Created", MySqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters.Add
("@Expires", MySqlDbType.DateTime).Value = DateTime.Now.AddMinutes((Double)item.Timeout);
cmd.Parameters.Add
("@LockDate", MySqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters.AddWithValue("@LockId", MySqlDbType.Int32).Value = 0;
cmd.Parameters.Add
("@Timeout", MySqlDbType.Int32).Value = item.Timeout;
cmd.Parameters.AddWithValue("@Locked", MySqlDbType.Bit).Value = false;
cmd.Parameters.Add
("@SessionItems", MySqlDbType.VarChar, sessItems.Length).Value = sessItems;
cmd.Parameters.Add("@Flags", MySqlDbType.Int32).Value = 0;
}
else
{
// MySqlCommand to update the existing session item.
cmd = new MySqlCommand(
"UPDATE Sessions SET Expires = ?, SessionItems = ?, Locked = ? " +
" WHERE SessionId = ? AND ApplicationName = ? AND LockId = ?", conn);
cmd.Parameters.Add("@Expires", MySqlDbType.DateTime).Value =DateTime.Now.AddMinutes((Double)item.Timeout);
cmd.Parameters.Add("@SessionItems", MySqlDbType.VarChar, sessItems.Length).Value = sessItems;
cmd.Parameters.Add("@Locked", MySqlDbType.Bit).Value = false;
cmd.Parameters.Add("@SessionId", MySqlDbType.VarChar, 80).Value = id;
cmd.Parameters.Add("@ApplicationName", MySqlDbType.VarChar, 255).Value = ApplicationName;
cmd.Parameters.Add("@LockId", MySqlDbType.Int32 ).Value = lockId;
}

try
{
conn.Open();

if (deleteCmd != null)
deleteCmd.ExecuteNonQuery();

cmd.ExecuteNonQuery();
}
catch (MySqlException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "SetAndReleaseItemExclusive");
throw new ProviderException(exceptionMessage);
}
else
throw e;
}
finally
{
conn.Close();
}
}

//
// SessionStateProviderBase.GetItem
//

public override SessionStateStoreData GetItem(HttpContext context,
string id,
out bool locked,
out TimeSpan lockAge,
out object lockId,
out SessionStateActions actionFlags)
{
return GetSessionStoreItem(false, context, id, out locked,
out lockAge, out lockId, out actionFlags);
}

//
// SessionStateProviderBase.GetItemExclusive
//

public override SessionStateStoreData GetItemExclusive(HttpContext context,
string id,
out bool locked,
out TimeSpan lockAge,
out object lockId,
out SessionStateActions actionFlags)
{
return GetSessionStoreItem(true, context, id, out locked,
out lockAge, out lockId, out actionFlags);
}

//
// GetSessionStoreItem is called by both the GetItem and
// GetItemExclusive methods. GetSessionStoreItem retrieves the
// session data from the data source. If the lockRecord parameter
// is true (in the case of GetItemExclusive), then GetSessionStoreItem
// locks the record and sets a new LockId and LockDate.
//

private SessionStateStoreData GetSessionStoreItem(bool lockRecord,
HttpContext context,
string id,
out bool locked,
out TimeSpan lockAge,
out object lockId,
out SessionStateActions actionFlags)
{
// Initial values for return value and out parameters.
SessionStateStoreData item = null;
lockAge = TimeSpan.Zero;
lockId = null;
locked = false;
actionFlags = 0;

// ODBC database connection.
MySqlConnection conn = new MySqlConnection(connectionString);
// MySqlCommand for database commands.
MySqlCommand cmd = null;
// DataReader to read database record.
MySqlDataReader reader = null;

// DateTime to check if current session item is expired.
DateTime expires;
// String to hold serialized SessionStateItemCollection.
string serializedItems = "";
// True if a record is found in the database.
bool foundRecord = false;
// True if the returned session item is expired and needs to be deleted.
bool deleteData = false;
// Timeout value from the data store.
int timeout = 0;

try
{
conn.Open();

// lockRecord is true when called from GetItemExclusive and
// false when called from GetItem.
// Obtain a lock if possible. Ignore the record if it is expired.
if (lockRecord)
{
cmd = new MySqlCommand(
"UPDATE Sessions SET" +
" Locked = ?, LockDate = ? " +
" WHERE SessionId = ? AND ApplicationName = ? AND Locked = ? AND Expires > ?", conn);
cmd.Parameters.Add("@Locked", MySqlDbType.Bit).Value = true;
cmd.Parameters.Add("@LockDate", MySqlDbType.DateTime).Value= DateTime.Now;
cmd.Parameters.Add("@SessionId", MySqlDbType.VarChar, 80).Value = id;
cmd.Parameters.Add("@ApplicationName", MySqlDbType.VarChar, 255).Value = ApplicationName;
cmd.Parameters.Add("@Lockid", MySqlDbType.Int32).Value = 0;
cmd.Parameters.Add("@Expires", MySqlDbType.DateTime).Value = DateTime.Now;

if (cmd.ExecuteNonQuery() == 0)
// No record was updated because the record was locked or not found.
locked = true;
else
// The record was updated.

locked = false;
}

// Retrieve the current session item information.
cmd = new MySqlCommand(
"SELECT Expires, SessionItems, LockId, LockDate, Flags, Timeout " +
"  FROM Sessions " +
"  WHERE SessionId = ? AND ApplicationName = ?", conn);
cmd.Parameters.Add("@SessionId", MySqlDbType.VarChar, 80).Value = id;
cmd.Parameters.Add("@ApplicationName", MySqlDbType.VarChar,
255).Value = ApplicationName;

// Retrieve session item data from the data source.
reader = cmd.ExecuteReader(CommandBehavior.SingleRow);
while (reader.Read())
{
expires = reader.GetDateTime(0);

if (expires < DateTime.Now)
{
// The record was expired. Mark it as not locked.
locked = false;
// The session was expired. Mark the data for deletion.
deleteData = true;
}
else
foundRecord = true;

serializedItems = reader.GetString(1);
lockId = reader.GetInt32(2);
lockAge = DateTime.Now.Subtract(reader.GetDateTime(3));
actionFlags = (SessionStateActions)reader.GetInt32(4);
timeout = reader.GetInt32(5);
}
reader.Close();

// If the returned session item is expired,
// delete the record from the data source.
if (deleteData)
{
cmd = new MySqlCommand("DELETE FROM Sessions " +
"WHERE SessionId = ? AND ApplicationName = ?", conn);
cmd.Parameters.Add("@SessionId", MySqlDbType.VarChar, 80).Value = id;
cmd.Parameters.Add("@ApplicationName", MySqlDbType.VarChar,
255).Value = ApplicationName;

cmd.ExecuteNonQuery();
}

// The record was not found. Ensure that locked is false.
if (!foundRecord)
locked = false;

// If the record was found and you obtained a lock, then set
// the lockId, clear the actionFlags,
// and create the SessionStateStoreItem to return.
if (foundRecord && !locked)
{
lockId = (int)lockId + 1;

cmd = new MySqlCommand("UPDATE Sessions SET" +
" LockId = ?, Flags = 0 " +
" WHERE SessionId = ? AND ApplicationName = ?", conn);
cmd.Parameters.Add("@LockId", MySqlDbType.Int32).Value = lockId;
cmd.Parameters.Add("@SessionId", MySqlDbType.VarChar, 80).Value = id;
cmd.Parameters.Add("@ApplicationName", MySqlDbType.VarChar, 255).Value = ApplicationName;

cmd.ExecuteNonQuery();

// If the actionFlags parameter is not InitializeItem,
// deserialize the stored SessionStateItemCollection.
if (actionFlags == SessionStateActions.InitializeItem)
item = CreateNewStoreData(context, pConfig.Timeout.Minutes);
else
item = Deserialize(context, serializedItems, timeout);
}
}
catch (MySqlException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "GetSessionStoreItem");
throw new ProviderException(exceptionMessage);
}
else
throw e;
}
finally
{
if (reader != null) { reader.Close(); }
conn.Close();
}

return item;
}

//
// Serialize is called by the SetAndReleaseItemExclusive method to
// convert the SessionStateItemCollection into a Base64 string to
// be stored in an Access Memo field.
//

private string Serialize(SessionStateItemCollection items)
{

items["LastName"] = "Wilson";
items["FirstName"] = "Dan";

string ret = "";
for (int i = 0; i < items.Count;i++ )
{
string str = "";
if (items[i] != null)
{
str = items.Keys[i] + "|s:" + items[i].ToString().Length + ":\"" + items[i].ToString() + "\";";
}
else
{
str = items.Keys[i] + "|N;";
}
ret += str;
}
return ret;
}

#region base64 序列化session
//
// DeSerialize is called by the GetSessionStoreItem method to
// convert the Base64 string stored in the Access Memo field to a
// SessionStateItemCollection.
//

//private SessionStateStoreData Deserialize(HttpContext context,
//  string serializedItems, int timeout)
//{
//    MemoryStream ms =
//      new MemoryStream(Convert.FromBase64String(serializedItems));

//    SessionStateItemCollection sessionItems =
//      new SessionStateItemCollection();

//    if (ms.Length > 0)
//    {
//        BinaryReader reader = new BinaryReader(ms);
//        sessionItems = SessionStateItemCollection.Deserialize(reader);

//    }

//    return new SessionStateStoreData(sessionItems,
//      SessionStateUtility.GetSessionStaticObjects(context),
//      timeout);
//}

#endregion

/// <summary>
/// 自定义获取session项
/// </summary>
/// <param name="context"></param>
/// <param name="serializedItems"></param>
/// <param name="timeout"></param>
/// <returns></returns>
private SessionStateStoreData Deserialize(HttpContext context,
string serializedItems, int timeout)
{

SessionStateItemCollection sessionItems = new SessionStateItemCollection();

string[] arry = serializedItems.Split(';');
foreach (string item in arry)
{
if (!string.IsNullOrEmpty(item))
{
string strKey = item.Split('|')[0];
string other = item.Split('|')[1];
string strValue = "";
if (other == "N")
{
sessionItems[strKey]=null;
}
else if (other.Split(':').Count() > 2)
{//s:1:"1"
strValue = other.Split(':')[2];
sessionItems[strKey] = strValue.Replace("\"", "");
}
else
{
sessionItems[strKey] = null;
}
}
}

return new SessionStateStoreData(sessionItems,
SessionStateUtility.GetSessionStaticObjects(context),
timeout);
}

public override void ReleaseItemExclusive(HttpContext context,
string id,
object lockId)
{
MySqlConnection conn = new MySqlConnection(connectionString);
MySqlCommand cmd =
new MySqlCommand("UPDATE Sessions SET Locked = 0, Expires = ? " +
"WHERE SessionId = ? AND ApplicationName = ? AND LockId = ?", conn);
cmd.Parameters.Add("@Expires", MySqlDbType.DateTime).Value =
DateTime.Now.AddMinutes(pConfig.Timeout.Minutes);
cmd.Parameters.Add("@SessionId", MySqlDbType.VarChar, 80).Value = id;
cmd.Parameters.Add("@ApplicationName", MySqlDbType.VarChar,
255).Value = ApplicationName;
cmd.Parameters.Add("@LockId", MySqlDbType.Int32).Value = lockId;

try
{
conn.Open();

cmd.ExecuteNonQuery();
}
catch (MySqlException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "ReleaseItemExclusive");
throw new ProviderException(exceptionMessage);
}
else
throw e;
}
finally
{
conn.Close();
}
}

//
// SessionStateProviderBase.RemoveItem
//

public override void RemoveItem(HttpContext context,
string id,
object lockId,
SessionStateStoreData item)
{
MySqlConnection conn = new MySqlConnection(connectionString);
MySqlCommand cmd = new MySqlCommand("DELETE * FROM Sessions " +
"WHERE SessionId = ? AND ApplicationName = ? AND LockId = ?", conn);
cmd.Parameters.Add("@SessionId", MySqlDbType.VarChar, 80).Value = id;
cmd.Parameters.Add("@ApplicationName", MySqlDbType.VarChar,
255).Value = ApplicationName;
cmd.Parameters.Add("@LockId", MySqlDbType.Int32).Value = lockId;

try
{
conn.Open();

cmd.ExecuteNonQuery();
}
catch (MySqlException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "RemoveItem");
throw new ProviderException(exceptionMessage);
}
else
throw e;
}
finally
{
conn.Close();
}
}

//
// SessionStateProviderBase.CreateUninitializedItem
//

public override void CreateUninitializedItem(HttpContext context,
string id,
int timeout)
{
//MySqlConnection conn = new MySqlConnection(connectionString);

MySqlConnection conn = new MySqlConnection(connectionString);

MySqlCommand cmd = new MySqlCommand("INSERT INTO Sessions " +
" (SessionId, ApplicationName, Created, Expires, " +
"  LockDate, LockId, Timeout, Locked, SessionItems, Flags) " +
" Values(?, ?, ?, ?, ?, ? , ?, ?, ?, ?)", conn);
cmd.Parameters.Add("@SessionId", MySqlDbType.VarChar, 80).Value = id;
cmd.Parameters.Add("@ApplicationName", MySqlDbType.VarChar,
255).Value = ApplicationName;
cmd.Parameters.Add("@Created", MySqlDbType.DateTime).Value
= DateTime.Now;
cmd.Parameters.Add("@Expires", MySqlDbType.DateTime).Value
= DateTime.Now.AddMinutes((Double)timeout);
cmd.Parameters.Add("@LockDate", MySqlDbType.DateTime).Value
= DateTime.Now;
cmd.Parameters.Add("@LockId", MySqlDbType.Int32).Value = 0;
cmd.Parameters.Add("@Timeout", MySqlDbType.Int32).Value = timeout;
cmd.Parameters.Add("@Locked", MySqlDbType.Bit).Value = false;
cmd.Parameters.Add("@SessionItems", MySqlDbType.VarChar, 0).Value = "";
cmd.Parameters.Add("@Flags", MySqlDbType.Int32).Value = 1;

try
{
conn.Open();

cmd.ExecuteNonQuery();
}
catch (MySqlException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "CreateUninitializedItem");
throw new ProviderException(exceptionMessage);
}
else
throw e;
}
finally
{
conn.Close();
}
}

//
// SessionStateProviderBase.CreateNewStoreData
//

public override SessionStateStoreData CreateNewStoreData(
HttpContext context,
int timeout)
{
return new SessionStateStoreData(new SessionStateItemCollection(),
SessionStateUtility.GetSessionStaticObjects(context),
timeout);
}

//
// SessionStateProviderBase.ResetItemTimeout
//

public override void ResetItemTimeout(HttpContext context,
string id)
{
MySqlConnection conn = new MySqlConnection(connectionString);
MySqlCommand cmd =
new MySqlCommand("UPDATE Sessions SET Expires = ? " +
"WHERE SessionId = ? AND ApplicationName = ?", conn);
cmd.Parameters.Add("@Expires", MySqlDbType.DateTime).Value
= DateTime.Now.AddMinutes(pConfig.Timeout.Minutes);
cmd.Parameters.Add("@SessionId", MySqlDbType.VarChar, 80).Value = id;
cmd.Parameters.Add("@ApplicationName", MySqlDbType.VarChar,
255).Value = ApplicationName;

try
{
conn.Open();

cmd.ExecuteNonQuery();
}
catch (MySqlException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "ResetItemTimeout");
throw new ProviderException(exceptionMessage);
}
else
throw e;
}
finally
{
conn.Close();
}
}

public override void InitializeRequest(HttpContext context)
{
}
public override void EndRequest(HttpContext context)
{
}

private void WriteToEventLog(Exception e, string action)
{
EventLog log = new EventLog();
log.Source = eventSource;
log.Log = eventLog;

string message =
"An exception occurred communicating with the data source.\n\n";
message += "Action: " + action + "\n\n";
message += "Exception: " + e.ToString();

log.WriteEntry(message);
}
}


  Php Session 提供程序代码

function sess_open($save_path, $session_name) {
global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;

if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
echo "<li>Can't connect to $SESS_DBHOST as $SESS_DBUSER";
echo "<li>MySQL Error: " . mysql_error();
die;
}

if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
echo "<li>Unable to select database $SESS_DBNAME";
die;
}

return true;
}

function sess_close() {
return true;
}

function sess_read($key) {
global $SESS_DBH, $SESS_LIFE;

$qry = "SELECT SessionItems FROM sessions WHERE SessionId = '$key' and ApplicationName='/'   AND Expires > '" .date("Y-m-d H:i:s")."'";
$qid = mysql_query($qry, $SESS_DBH);

if (list($value) = mysql_fetch_row($qid)) {
return $value;
}
//else
//{
//    sess_write($key,'');
//    return '';
//}
return false;
}

function sess_write($key, $val) {
global $SESS_DBH, $SESS_LIFE;

$Tnow=date("Y-m-d H:i:s");//当前时间
$expiry =date("Y-m-d H:i:s", time() + $SESS_LIFE); //过期时间
$value = addslashes($val);

$qry = "INSERT INTO sessions (SessionId, ApplicationName, Created, Expires, ".
"  LockDate, LockId, Timeout, Locked, SessionItems, Flags) ".
"  VALUES ('$key','/', '$Tnow' ,'$expiry','$Tnow', 0, 20,0, '$value',0 )";
$qid = mysql_query($qry, $SESS_DBH);

if (! $qid) {
$qry = "UPDATE sessions SET Expires = '$expiry', SessionItems = '$value' WHERE SessionId = '$key' AND Expires > '" . date("Y-m-d H:i:s")."'";
$qid = mysql_query($qry, $SESS_DBH);
}

return $qid;
}

function sess_destroy($key) {
global $SESS_DBH;

$qry = "DELETE FROM sessions WHERE SessionId = '$key'";
$qid = mysql_query($qry, $SESS_DBH);

return $qid;
}

function sess_gc($maxlifetime) {
global $SESS_DBH;

$qry = "DELETE FROM sessions WHERE Expires < '" . date("Y-m-d H:i:s")."'";
$qid = mysql_query($qry, $SESS_DBH);

return mysql_affected_rows($SESS_DBH);
}

session_set_save_handler(
"sess_open",
"sess_close",
"sess_read",
"sess_write",
"sess_destroy",
"sess_gc");

session_start();


  

至于修改作用域 直接在php网站的配置里修改就行,其他的php.ini的修改网上多的是。

后续产生的问题

Asp.net 创建的session信息 ,php能读能写。Php创建的session ASP.NET 在没有创建过Session 的时候不能读取。仅当Asp.Net的程序创建过 Session后,Php 修改过的内容才会生效。

这个问题产生的原因 是ASP.Net 的Session产生机制的问题,页面请求Asp.net并不会马上创建Session和读取Cookie 的SessionID去查找Session

解决这个问题又有多种方案,而我选用的是 最简单的一种 只用 Asp.net的登陆程序做入口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: