在经典 ASP 和 PHP 之间共享会话,而不是使用数据库


share session between classic ASP and PHP over than using database

我们有一个经过多年开发的ASP Intranet Web应用程序,该应用程序在IIS6上运行。如今,我们想使用 PHP 语言添加一些新功能。PHP 在同一台服务器上运行良好。会话变量需要在 ASP 和 PHP 之间共享。

我问是否有其他替代方法可以在经典ASP和PHP之间共享会话,而不是使用数据库作为网关(对我们来说消耗的资源太多)?双方都需要读取/编辑会话变量。

通过稍微调整一下,我注意到每次用户登录ASP Web应用程序时,PHP端都会生成PHPSESSID和ASPSESSIONID。这些在ASP端也可见,存储在服务器变量HTTP_COOKIE中,因此我认为ASP会话和IIS核心的PHP会话变量之间可能存在相关性。

所以

--.ASP--

<% Response.write ('HTTP_COOKIE') %> 

给:

__utma=...; __utmz=...; computer%5Fid=AAA; lan=fre;ASPSESSIONIDXXXXXXXX=BBBBBBBBBBBBBBBBBBBBBBBB; user_login=cccc

--.PHP--

    echo '<pre>';
    var_dump($_COOKIE) ?>
    echo '</pre>';

给:

Array
(
    [__utma] => ...
    [__utmz] => ...
    [computer_id] => AAA
    [lan] => fre
    [ASPSESSIONIDXXXXXXXX] => BBBBBBBBBBBBBBBBBBBBBBBB
    [user_login] => cccc
)

在ASP方面,如果我写:

<% Request.Cookies(strCookie)(strKey) %>

在一个循环中,它给了我一堆存储的键/值会话 cookie 列表。

但是在PHP方面,我找不到获取这些键/值列表的方法。也许这是去寻找更多的方式?真正的现有实现将提供更多帮助,但欢迎任何答案。

我以前从未在 PHP 中使用过会话变量,所以在这里我假设您已经为 $var 1 和 $var 2 分配了要传递给 ASP 文件的会话变量的值。

<iframe height="0" width="0" scrolling="No" src="setsession.asp?var1=<?php echo $var1; ?>&var2=<?php echo $var2; ?>"></iframe>

那么你的设置会话.asp文件将只是

<%
Session("var1") = Request.Querystring("var1")
Session("var2") = Request.Querystring("var2")
%>

显然,你可以反过来做这件事,你只需要了解如何处理两种语言的查询字符串和会话变量

您可以通过

从PHP脚本调用session.asp来执行此操作。

PHP部分:

$link = "$http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$url=explode("/",$link);
array_pop($url);
$urlp=implode("/",$url)."/";
//here we get the url path
$ck=array_keys($_COOKIE);
for ($i=0;$i<count($ck);++$i) {
  if (strpos($ck[$i],"ASPSESSIONID")===0) {
    $cook .=$ck[$i]."=".$_COOKIE["$ck[$i]"].";"."<br>";
  }//we need to pass ASPSESSIONID cookies to ASP script
}
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Cookie: ".$cook
  )
);
//function for reading/writing ASP session values
function aspsession() {
  global $urlp,$opts;
  $n=urlencode(func_get_arg(0));
  if (func_num_args()==2) {
    $v=urlencode(func_get_arg(1));
    return file_get_contents("$urlp../session.asp?n=$n&v=$v",NULL,stream_context_create($opts));
  } else {
    return file_get_contents("$urlp../session.asp?w=$n",NULL,stream_context_create($opts));
  }//put the right relative URL for session.asp
  //make sure it's in the same application as your other ASP scripts,
  //so it has the same session
}
//to test if it works
aspsession("a","test");
echo aspsession("a");

。和会议.asp

<% @Language = "VBScript" 
     ENABLESESSIONSTATE = True%>
<% Response.ContentType="text/plain" %>
<% Response.Expires=-1 %>
<%
n=Request.QueryString("n")
v=Request.QueryString("v")
if n<>"" then
  session(n)=v
else
  Response.Clear
  Response.Write session(Request.QueryString("w"))
end if
%>

ASP.Net 中的会话和 PHP 中的 GLOBAL 存储在进程中(除非更改),它们都有自己的进程。 您要问的是,这两个过程以某种方式相互通信并共享数据而无需进行重大更改,这是不可能的。 ASP.Net 可以配置为将状态存储在数据库中,然后你可以让PHP读取和操作,但你明确表示你不希望这样做,因为"资源太多"。

也许你不应该改变语言,用另一种语言构建一半的软件。 当有人加入时,你通常会看到这一点,他比 ASP.Net 更了解PHP,并说服人们所有新的开发都应该使用他们更熟悉的语言。 一旦你有了某种语言的代码库,就坚持下去。 疣等等。 现在,当你雇用人员而不是他们只需要 ASP.Net 经验时,他们还需要了解PHP,你会遇到像你一样的"小"问题。