Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当用户关闭浏览器时,保持与数据库mysql的通信_Mysql_Linux_Php - Fatal编程技术网

当用户关闭浏览器时,保持与数据库mysql的通信

当用户关闭浏览器时,保持与数据库mysql的通信,mysql,linux,php,Mysql,Linux,Php,我现在需要同志们的帮助。我正在基于php进行应用程序开发,应用程序是quesionaire系统,当用户已经启动时,该系统有60分钟的倒计时(单击开始按钮)。 到目前为止,当用户在会话登录时,我可以将计时器推送到数据库,我每秒更新数据库。当前系统是当用户注销时,倒计时计时器将停止,例如,当30分钟后倒计时时,用户注销。所以当用户重新登录时,仍然可以得到30分钟 但我的客户不喜欢。我的客户希望如果用户已经单击开始按钮,那么倒计时将持续到60分钟,即使用户在60分钟之前没有注销,或者用户在60分钟之前

我现在需要同志们的帮助。我正在基于php进行应用程序开发,应用程序是quesionaire系统,当用户已经启动时,该系统有60分钟的倒计时(单击开始按钮)。 到目前为止,当用户在会话登录时,我可以将计时器推送到数据库,我每秒更新数据库。当前系统是当用户注销时,倒计时计时器将停止,例如,当30分钟后倒计时时,用户注销。所以当用户重新登录时,仍然可以得到30分钟

但我的客户不喜欢。我的客户希望如果用户已经单击开始按钮,那么倒计时将持续到60分钟,即使用户在60分钟之前没有注销,或者用户在60分钟之前关闭浏览器

那么我的问题是如何实施它?当用户单击“开始”按钮时,我必须做什么? 我想当用户点击开始按钮时,会将倒计时按到数据库mysql,尽管用户关闭浏览器,倒计时总是按到数据库

数据库表的结构是:

- id (int) auto_increment;
- user_id (int);
- residual_time (int); <--I push it per second, so per second will update it until 0.
-id(int)自动递增;
-用户id(int);

-剩余时间(int) 我会按照@Joachim的建议做,并遵循以下流程:

  • 剩余时间
    替换为
    开始时间
    ,类型为datetime
  • 添加
    last\u update
    类型为datetime
  • 当用户单击开始时,使用
    NOW()
    MySQL函数设置
    start\u time
    last\u update
  • 每30分钟编写一个函数并使用AJAX运行一次?第二步检查
    last\u update
    是否超过
    start\u time
    60分钟,如果是,则停止问卷并清除
    start\u time
    last\u update
现在,让我们假设一个用户在分配的中间时间退出并注销,然后重新登录以继续:

//sudo code example
//check if start_time is set
if(isset(start_time)){
    //check if last_update time is set
    if(isset(last_update)){
        //calculate the time difference in minutes from previous start_time and last_update time
        time_diff = last_update - start_time;
        //if time difference is less than alloted time example 60 minutes
        if(time_diff < 60 minutes){
            //update start_time with current time less time difference for already used time
            start_time = NOW() - time_diff minutes
        //if time difference is greater than the allotted time
        } else {
            //kill the page with the time expired message
            die(Your time has expired);
        }
    //if last_update time is not set
    } else {
        //set start_time to NOW()
        start_time = NOW();
    }
//if start_time is not set
} else {
    //set start_time to NOW()
    start_time = NOW();
}
//sudo代码示例
//检查是否设置了启动时间
if(isset(开始时间)){
//检查是否设置了上次更新时间
if(isset(上次更新)){
//计算上一次开始\u时间和上一次更新\u时间之间的时间差(以分钟为单位)
time_diff=上次更新-开始时间;
//如果时差小于分配的时间,例如60分钟
如果(时间差<60分钟){
//用当前时间减去已用时间的时差更新开始时间
开始时间=现在()
//如果时差大于分配的时间
}否则{
//使用过期消息终止页面
死亡(你的时间已经过了);
}
//如果未设置上次更新时间
}否则{
//将开始时间设置为现在()
开始时间=现在();
}
//如果未设置开始时间
}否则{
//将开始时间设置为现在()
开始时间=现在();
}

只需将开始时间保存一次,然后计算与当前时间的差值即可显示。无需在数据库内进行倒计时。Hello@JoachimIsaksson感谢您的回复,但如果没有倒计时并保存到数据库系统,则无法知道用户最长为60分钟。当用户单击开始时,请保存时间。在以后的任何时候,当你需要知道还有多少时间时,只要取当前时间减去开始时间,如果差值超过一小时,他的时间就到了。我的意思是,你只需要保存一次开始时间,而不是数据库中的每一秒。Hello@JoachimIsaksson,如果不是每一秒,如果电源故障导致计算机/笔记本电脑用户死亡,该怎么办?我会小心不要每秒钟更新一次时间,只会每15-30秒更新一次,除非必须超时到第二秒,因为这会给服务器增加额外负载。我们将聊天脚本设置为每3秒更新一次,当我们将其更改为每15秒时,您会惊讶于服务器的运行速度有多快。