我发出一个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请求
答案 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>