有N个网站,假设域名如下a.test.com,b.test.com,c.test.com,d.test.com......N个网站都存在session['e'],现在有一需求,在网站b中执行操作,通知a清除session['e'],a收到命令后,再通知其他服务器清除session['e'],我不想用ajax做,因为涉及到不能用js的情况,我想要的是后台之间的交互,请问各位有什么好方法

解决方案 »

  1.   

    用cURL在后台发送请求给各个网站。
      

  2.   


    crul清不了吧,我试过,socket也不行
      

  3.   

    cURL是清除不了,只是"通知a清除session['e']",清除操作在a那里做。
      

  4.   

    yes , 跨域清除session不知道怎么弄,也不知道能不能,我们说的是通知或者说是表示,a那面才是真正清除的地方,a那面只需判断标识来决定是否清楚
      

  5.   

    你可以设定那个地方进行判断,获知你可以决定判断几次,如果判断的次数够了,在session中放个标识,标识已经清除过了session,以后不再清除(这里的以后不是说一辈子啊,呵呵)
      

  6.   


    能举一个简单的例子吗?不太明白,假设我在a用crul访问c,在c中怎样清除呢?我试过不行啊?可能我理解有误?代码如下,仅供参考,并不能直接运行:
    a:
    $url = "http://c.test.com/index.php?r=site/logout";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);  
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);      
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);      
    $content = curl_exec($ch);
    if(curl_errno($ch)){
    print curl_error($ch);
    }
    curl_close($ch);c:
    session_start();
    session_unset();
      

  7.   

    http://c.test.com/index.php?r=site/logout你传个参访问指定的方法,方法判断这个参是不是要求清除session就行了 
      

  8.   

    这个参数你自己随便设定就行了,比如我就想传个clssess=yes,在对应的文件程序中用$_GET['clssess']获取变量,看这个变量是否是yes如果是,那么执行清除,当然了,传参的格式你自己应该知道吧,这个都是随便的,就想火星上只有我一个人,那么我说那个是石头那么他就是石头,我说他是鸡蛋它就是鸡蛋,只是个名字而已
      

  9.   


    用get方式传,那是怎么调用这个地址?用header?因为我试过,只有用header跳转到那里,才能删除这个session,其他都删不了。我的问题不是怎么去判断删,而是怎样过去删
      

  10.   

    这个说法没有意义啊,呵呵,不判断的话,你直接在header访问页面新建个方法,这个方法就直接是清楚session的就行了,楼主还有什么要问的就尽管问吧,现在正好闲着没事做
      

  11.   


    谢谢,我的方法确实没有必要传参数,只需要删除session就行,但我不想用header(用这个其实我也实现出来了),因为我可能有多个这样的请求,太费效率了。我想做到http_request这样的调用效果,但无奈crul或是socket都无法直接删除session,我想要的是一个更有效率的算法
      

  12.   

    既然是通知,那么对方就应该有接收
    假定接收程序为 unsession.php,则只需 fopen("http://x.test.com?var=e"); 即可但这不是问题的所在!
    你是要删除谁的 session['e']?
    如果是某一个用户的,那么你如何得知该用户在那个网站的 sessionid
    如果是全部的,那你就得遍历全部的session数据文件(假定session以php默认方式保存)。去完成:读取、反序列化、修改、序列化、保存等一些列动作,而不管某个session已经失效了况且 session 变量是程序产生的,你没有修改程序,又如何能删去session变量呢?
      

  13.   


    这个方法可以试试,我应该如何获取该网站上指定的某个sessionid?
      

  14.   

    很简单的
    <img src="http://otherdomain/api.php" width="0" height="0">
    在api.php里,做相应的操作就好了,多个域名,就多个0*0图片或者 <script type="text/javascript" src="http://otherdomain/api.php"></script>……也可以
      

  15.   

    我搞错了,,,,一定要A知道B完成了,再通知C,B知道C完成了,再通知D……么?
      

  16.   

    判断sessionid我认为没有必要,因为要清理的是当前与域名的session,程序也是在当前域名先有相应的清理程序,那么要sessionid又有何用呢?不知道唠叨老大认为我说的对么
      

  17.   

    一激动错字就多了,去掉上面的通假字,如下:判断sessionid我认为没有必要,因为要清理的是当前域名下的session,程序也是在当前域名下有相应的清理程序,那么要sessionid又有何用呢?不知道唠叨老大认为我说的对么?
      

  18.   


    晕,我也看错了,整个流程应该是这样。首先B通知A去清除A的session['e'],A完成后再分别通知C,D......这些清除自己的session['e'],这时A不需要等待C,D等是否操作完成才通知下一个
      

  19.   

    是吗?
    我访问a站,于是a站上有一个我的session;同时你访问a站,于是a站上有一个你的session
    那么清理程序是清理我的session,还是清理你的session?
      

  20.   

    B站点<iframe id="iframe" src="" width="0" height="0"></iframe>需要的时候,js设置src值,访问 a.test.com/api.php?para……//通知清楚相应的sessionA站点的api.php页面,输出<img src="http://c.test.com/api.php" width="0" height="0"><img src="http://d.test.com/api.php" width="0" height="0">……相应的api文件,清除相应的session=========================================================
    效果,我没测试过……
      

  21.   

    始终还是未明白,在a使用crul访问c后,c怎样清空session代码
    a
    $url = "http://c.test.com/index.php?r=api/lo";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);      
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);      
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);      
    $content = curl_exec($ch);
    var_dump($content);
    if(curl_errno($ch)){
    print curl_error($ch);
    }
    curl_close($ch);c
    session_id("0iako1eum32vpv3511gjdcdn63");
    session_start();
    var_dump($_SESSION);我看到的输出结果,是array(0) { }啊,这样如何清除session
      

  22.   


    sessionid可以通过数据库记录在a,a根据其他应用发来的参数就可以搜索得到,问题是拿到这个sessionid后如何删除session,注意:a是被某应用访问,就是用户真正访问的是某应用,某应用通过crul或fsopen等访问a
      

  23.   

    再补充,a与c在不同域名下,不能用js或header跳转
      

  24.   


    js当然可以用,我用ajax的方法也实现了我要的功能,但现在出现一种情况,就是被限制不能用js(例如手机)
      

  25.   

    在 a 访问 c 后,c 怎样清空 session
    首先 a 可以通过任何有效的途径发起对 c 的访问:fopen、fsockopen、curl甚至include
    但一定要保证将 sessionid 作为参数传递过去,注意这个 sessionid 是在 c 中的 sessionid,而不是在 a 中的。除非你的那些网站都通过同一数据库保存 session 信息,并在各网站中维持同一用户的 sessionid 唯一。然后在 c 网站清理程序中
    session_id(传入的sessionid);
    session_start();
    对 session 的相应操作
      

  26.   


    是的,我就是这样做的,但依然无法访问到session,就如我26楼的代码,其中的0iako1eum32vpv3511gjdcdn63就是C中的"PHPSESSID=0iako1eum32vpv3511gjdcdn63; path=/; domain=pass.local.dayoo.com",我只不过贪测试方便,先把ID那出来测试
      

  27.   

    补充,a与c的地址,a.test.com与c.test.com,两者是跨域的,难道是因为这个原因?