对这个问题感兴趣 - 如何正确停止带有 sleep 的 while 循环。我实施“长轮询”以快速更新网站上的信息(警告,其他信息)的事实。
剧本的本质
1.我们将GET-request发送到脚本所在的PHP-page。
2.脚本运行循环while。
3.在这个系列中,有2 个条件和最后的 sleep(1),它暂停了循环的执行。
-如果循环运行更多秒30 - 分别停止循环和脚本的执行。
-如果您的站点有新信息,请说“警告” - 将结果提供给用户并停止循环。
问题 如果用户关闭浏览器窗口或重新加载页面 - 将在脚本上执行新查询,这将再次开始循环。但是在这种情况下,循环while的先前执行将不会停止,直到它们在其中至少工作了一个条件。如果用户向页面发送大量请求 - 服务器的内存开始启动,结果全部挂起,直到 all while不会停止执行。
QUESTION 如何停止循环和脚本作为一个整体,当您运行页面时重新加载或客户端?此刻我做了以下事情。当您运行我们生成的脚本时,我们会收到一个分配给变量的随机数,并且与会话相同。进一步内陆同时做一个条件,其中变量必须是会话的值。如果为假 - 停止循环。如果我们在 new 上运行脚本 - 会话的值会发生变化,因此所有先前的性能都会在停止时发生变化。我可以使用那个选项吗?多少是安全的?
更新.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();
}