我们有一个经过多年开发的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,你会遇到像你一样的"小"问题。