3

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

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

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

所以,

-- 平均售价 --

<% 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 方面,我找不到获取这些键/值列表的方法。也许这是寻找更多的方法?一个真正的现有实现会有所帮助,但欢迎任何答案。

4

2 回答 2

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")
%>

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

于 2013-09-06T09:28:32.030 回答
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
%>
于 2017-02-13T12:22:48.517 回答