如何解决一段时间真正的循环,因为它昂贵且危险

时间:2009-06-30 22:54:49

标签: php security performance oauth

我发出一个AJAX请求,看看是否设置了sesion变量。我向这个脚本发出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请求

5 个答案:

答案 0 :(得分:4)

这是一个PHP脚本?是否有任何条件可能会改变页面刷新/新民意调查以外的$_SESSION['screen_name']状态,即首先重新启动剧本

$_SESSION变量取决于请求。除非脚本更改,否则在脚本运行时不会更改。如果满足条件,则所有此脚本都返回true,或者直到超时被命中循环。条件在第一次尝试时是真的,或者永远不会。

答案 1 :(得分:4)

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

我的建议是这样的:

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

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

答案 2 :(得分:1)

我可能会在这里说一些非常愚蠢的事情,但是你不会更好地取出while循环并将轮询留给javascript吗?

答案 3 :(得分:1)

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

这将允许您基本上进行长轮询,而不必链接一堆等待结果的xmlhttprequests。

答案 4 :(得分: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>