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

时间:2013-09-05 08:31:25

标签: php session iis asp-classic

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

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

稍微调整一下,我注意到每次用户登录ASP Web应用程序时都会在PHP端生成PHPSESSID和ASPSESSIONID。这些也可以在ASP端看到,它们存储在服务器变量HTTP_COOKIE中,所以我认为在IIS的核心ASP会话和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方面,我找不到获取这些键/值列表的方法。可能是它的方式去寻找更多?一个真正存在的实现将有所帮助,但欢迎任何答案。

3 个答案:

答案 0 :(得分:1)

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

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

然后你的setsession.asp文件只是

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

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

答案 1 :(得分:0)

我之前使用过这个目的是为了同一个目的。试试这个链接http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=9028&lngWId=4

答案 2 :(得分:0)

您可以通过从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");

...和 session.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
%>