Php 停止while循环

Php 停止while循环,php,comet,long-integer,long-polling,Php,Comet,Long Integer,Long Polling,对这个问题感兴趣-如何正确地停止一个在里面睡觉的while循环。 事实上,我实施了“long poll”来快速更新网站上的信息(警告,其他信息) 剧本的精髓 1。我们将向脚本所在的PHP页面发送GET请求 2.脚本在时运行循环 3.在这个系列中,有2个条件和睡眠(1)在结尾,这将暂停循环的执行 -如果循环运行超过30秒,则分别停止循环和脚本的执行 -如果您的站点有新信息,请说“警报”-向用户导出结果并停止循环 问题 如果用户关闭浏览器窗口或重新加载页面,则会在脚本上执行一个新的查询,这将再次开始

对这个问题感兴趣-如何正确地停止一个在里面睡觉的while循环。 事实上,我实施了“long poll”来快速更新网站上的信息(警告,其他信息)

剧本的精髓

1。我们将向脚本所在的PHP页面发送GET请求

2.脚本在时运行循环

3.在这个系列中,有2个条件和睡眠(1)在结尾,这将暂停循环的执行

-如果循环运行超过30秒,则分别停止循环和脚本的执行

-如果您的站点有新信息,请说“警报”-向用户导出结果并停止循环

问题 如果用户关闭浏览器窗口或重新加载页面,则会在脚本上执行一个新的查询,这将再次开始循环。但是在这种情况下,while循环的前一次执行将不会停止,直到它们在循环中至少工作一个条件。如果用户向页面发送大量请求,服务器的内存将开始启动,因此所有挂起直到all不会停止执行

问题 当您运行重新加载的页面或客户端时,如何停止整个循环和脚本? 而此时此刻,我做了以下几件事。 当您运行我们生成的脚本时,我们将接收分配给变量的随机数,会话也是如此。当执行一个条件时,变量必须是会话的值。如果错误-停止循环。 如果我们在新的服务器上运行脚本,会话的值会发生变化,并且在停止时会相应地改变所有先前的性能。 我可以用那个选项吗?多少是安全的

UPDATE.PHP

 // Initialize the user's session
 $session = Session::instance();

        $rand = rand();
        $session->set('user_update_key', $rand);
        $key = $rand;

        $limit = 20;
        $seconds = 0;

        set_time_limit($limit + 1);

        while (TRUE) {
            if (Session::instance()->get('user_update_key') == $key) {

                if (there are updates. if there is - output) {
                    echo 'update information';
                    flush();
                    exit;
                }
                if ($seconds == $limit) { // complete the loop at the expiration of the time.
                    echo 'Close';
                    flush();
                    exit;
                }
                $seconds++;
            } else {
                unset($session, $rand, $key, $notice, $mysession, $last_notice, $limit, $notise_return, $seconds);
                flush();
                exit;
            }
            session_write_close();
            sleep(1);
            session_start();

}您的while条件是不变的,而实际上并非如此。 如果成功,函数sleep()将返回0,因此如果您重写了while条件对sleep()返回值的更改的反应,那么它可能会按设计工作,请参阅:

对于线程和其他函数,了解您在哪个操作系统上工作总是很重要的。我有Ubuntu,它的反应与文档中所述的不同

function interruptedSleep(){
  $cond = true;
  while($cond){
   $i = sleep(10);
   if($i == 0){
     $cond = false;
   }
  }
 }

当您通过关闭浏览器中断睡眠时,睡眠功能将返回0,while循环将中止,程序将在while之后直接继续。它不会抛出异常。

请注意,一般来说,PHP和Apache不适合长时间轮询。我不知道使用nginx时情况如何,但几个月前我不得不在Apache上做一些长时间的轮询工作。在我们开始生产之前,一切看起来都很好。事实证明,Apache的局限性使您无法保持持久的连接

在允许大约20名用户登录并打开3-4张网页卡后,服务器挂起并拒绝接受任何新请求。还有一些浏览器限制,阻止您维护到一台主机的太多http连接。不过,还有一个变通办法——使用子域

我试图找出如何解决id问题,在这里问了十几个关于StackOverflow的问题,最后都使用了node.js+socket.io,这是一种轻量级的方法,可以轻松处理数千个并发连接


我知道这篇文章并不能回答您最初的问题,但在我花了几周时间开发一些不可行的东西之后,我希望这些信息对您有所帮助。

为什么您不使用cronjob定期在后台运行流程呢,然后将AJAX放在网页上,这些网页会拉数据库检查您的警报。否则您将遇到性能问题。

而(TRUE)
您可以使用continue;用于终止循环内部循环的关键字。是否确实需要会话_write _close();/会话_start()?更新过程是如何启动的,是否可以简单地在那里设置30秒的超时时间?如何使用
setInterval
在javascript中执行循环,并将脚本简化为只执行
Session::instance()->get('user\u update\u key')==$key
没有循环?如果用户手动开始对脚本执行大量请求,它将同时启动大量“while”,即加载服务器。您的意思是,将为在后台运行的每个用户cronjob创建。已经发出了一个ajax请求​​渴望他?意思是你有一个在后台运行的工作,唯一的工作就是发送电子邮件。您仍然可以使用PHP脚本,它从数据库中获取所有需要发送的记录,然后发送这些记录。在网站/应用程序端,ajax只需每隔X秒运行一次,以检查数据库中是否有需要显示的警报,是否会弹出警报或执行您希望它执行的操作。使用此技术可以立即通知您?是的!AJAX可以在您的页面上连续运行,并在数据库中的某些条件适用时更新您的屏幕,或者无论输入是什么?这就是用户身份的设置方式?如你所说。所有时间显示为假:(在这种情况下,页面处于打开状态。