0

我发出 AJAX 请求以查看是否已设置会话变量。我对此脚本发出 GET 请求:

<?php session_start();

while(true){
    if(isset($_SESSION['screen_name'])){
        return true;
        break;
    }
}

?>

显然这个脚本存在问题,我想解决这些问题,例如不断检查和资源浪费。

场景:我正在尝试实现 twitgoo 使用的 oAuth方法。您单击“登录”,然后会弹出一个窗口供您登录 Twitter。如果你成功了,twitter 会重定向到一个回调 URL(我猜它设置会话信息)并且窗口关闭。完成此操作后,您的消息将发布到 Twitter。我正在努力实现这一目标,我快到了,但我不确定上面的脚本。

如果您有更好的实现,我将不胜感激任何帮助,使这个脚本不那么浪费,我很想听听。

谢谢大家

更新

我已经给出了两个不错的选择,您认为它们之间的效率更高:

1) 使用 JS 每隔几秒轮询一次服务器,而不是使用 while 循环占用 CPU 周期

2) 保持 while 循环,但在检查级别上“放松”,这意味着不会浪费更多的 http 请求

4

5 回答 5

4

这是一个PHP脚本?除了页面刷新/新轮询之外,是否有任何条件可以改变状态$_SESSION['screen_name'],即首先重新启动脚本

$_SESSION变量取决于请求。脚本运行时它不会改变,除非被脚本改变。这个脚本所做的只是true在满足条件时返回,或者循环直到超时。条件要么在第一次尝试时为真,要么永远不会。

于 2009-06-30T23:00:10.920 回答
4

不幸的是,您在这里创建的只是一个无限循环。如果$_SESSION['screen_name']第一次没有设置,它永远不会被设置。一旦你加载了一个 PHP 脚本,环境变量就不会改变。您将永远不会收到另一个会话 cookie,也不会修改任何 $_GET、$_POST、$_SESSION 等,除非您在脚本中明确执行此操作,或者脚本结束并且您发出另一个请求。

我的建议是这样的:

if(isset($_SESSION['screen_name'])){
    return true;
    break;
}
else {
  //output JSON encoded error message
}

如果在所需的会话变量未设置时退出脚本并将响应发送回浏览器,则浏览器可以决定要做什么。也许发出另一个请求,也许等待十秒钟,也许加载一个登录对话框。

于 2009-06-30T23:01:26.503 回答
1

我在这里可能会说一些非常愚蠢的事情,但是您最好还是去掉while循环并将轮询留给javascript进行吗?

于 2009-06-30T22:58:17.350 回答
1

将结果存储在 memcache 中,然后在迭代之间使用带有 usleep() 的 while 循环检查 memcache 中的变量。

这将使您基本上可以进行长时间的轮询,而不必链接一堆等待结果的 xmlhttprequest。

于 2009-07-01T01:41:03.467 回答
0

这个怎么样:

screen_name_check.php

<?php session_start();
if (isset($_SESSION['screen_name']))
    return "1";
return "0";
?>

page.html

<script type="text/javascript">
    check_screen_name_interval = window.setIterval(function(){
        // AJAX call screen_name_check.php
        if (data=="1") {
        window.clearInterval(check_screen_name_interval);
        // do whatever JS needs with that session set
        // or AJAX call a different PHP page like screen_name_is_set.php
        }
    }, 2000);
</script>
于 2009-06-30T23:19:49.383 回答