Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.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
Javascript 关闭php上的窗口后,关闭所有打开的资源_Javascript_Php - Fatal编程技术网

Javascript 关闭php上的窗口后,关闭所有打开的资源

Javascript 关闭php上的窗口后,关闭所有打开的资源,javascript,php,Javascript,Php,我有一个使用一些资源的对象,比如 class UseResources { protected $proc_open; public function __construct() { $this->proc_open = proc_open( ... ); } public function cleanup() { proc_close($this->proc_open); } }; 我

我有一个使用一些资源的对象,比如

class UseResources {

    protected $proc_open;

    public function __construct()
    {
        $this->proc_open = proc_open( ... );
    }

    public function cleanup()
    {
        proc_close($this->proc_open);
    } 
};
我试图在
.unload
事件上发送一个ajax请求,但这不是我想要的


我想在用户关闭窗口或浏览器后,或者连接丢失后,能够调用cleanup方法?

当窗口关闭时,以及当用户刷新页面或导航到新页面时(即使新页面在您的站点中),会触发
卸载
事件。在这种情况下,我建议不要使用
unload
。(
unload
更好地用于提示用户在离开表单之前保存或丢失更改等操作。)

此外,如果您实现了一个javascript解决方案,您可能希望(1)要求javascript使用该站点(并向禁用JS的用户显示
元素),或者(2)编写代码,使您不单单依靠窗口关闭/清理检测例程来释放资源

我通常实施的策略是使用ping过程来完成类似的事情。基本上:客户端向服务器发送常规ping,服务器在收到ping时将连接/会话的
idle
计数器重置为
0
。根据需要,ping每隔一分钟左右发生一次。然后,一个长时间运行的循环线程(会话管理器,如果您愿意的话)检查空闲时间超过空闲阈值(比如3分钟,但由您决定)的所有客户端,如果超过该阈值,则释放与该连接/会话相关的资源。然后,站点中的每个页面(在适当的情况下)都会添加此ping代码,以便只要页面在浏览器中打开,客户端就会开始ping

好处

  • 跟踪用户查看您的站点的时间(对于度量非常有用,尤其是与跟踪请求数量的度量结合使用时)
  • 当浏览器关闭时,以及当用户离开您的站点时,关闭所有与连接相关的资源
  • 如果用户在您的站点上导航到不同的页面[有ping代码],他们的连接资源将不会被清除,因为
    idle
    计数器将在下一页重置
缺点

  • 需要javascript(例如,
    setTimeout
    setInterval
    XMLHttpRequest
  • 除非服务器上还有类似“身份验证超时”的情况,否则如果用户离开打开的web浏览器一段时间,客户端可能会让您的服务器(和资源)保持长时间的连接(您可以通过使用其他ping触发器(如鼠标移动、将焦点设置为表单字段、单击、滚动等)来解决此问题。)
客户端页面的粗略示例代码:

函数pingServer(){
var-req;
if(window.XMLHttpRequest){
req=新的XMLHttpRequest();
}否则{
req=新的ActiveXObject(“Microsoft.XMLHTTP”);
}
req.onreadystatechange=函数(){
如果(req.readyState==4&&req.status==200){
警报(“服务器上的空闲计时器重置”);
}
}
var url='ping.php';//调用将重置此客户端空闲计时器的php代码
请求打开(“获取”,url,true);
请求发送();
}
var pingFrequencyMs=5*1000;//每5秒ping一次
设置间隔(pingServer、pingFrequencyMs);
抱歉,此网站需要JavaScript。