客户端可能会突然切断与服务器的连接,因而客户端进程无法告知网络正确关闭连接。这可能由于许多原因而发生,包括客户端的电源故障。Microsoft® SQL Server™ 2000 并不事先探测客户端连接的状态。而是依赖 Microsoft Windows NT® 在某连接需要终止或关闭时通知它。Windows NT 在 TCP/IP 的 KeepAliveTime 或 NetBios 的 SessionKeepAlive 持续时间内,监视连接并持续向 SQL Server 报告连接为活动的,该操作将影响命名管道客户端。SQL Server 继续令客户端拥有的锁保持活动,直到取消这些锁,或 Windows NT 终止或关闭该连接。当客户端在终止时无法释放自己控制的网络连接时发生孤立会话。当客户端干净地终止时,Windows NT 关闭连接并通知 SQL Server。如果 SQL Server 正在处理客户端命令,它将在结束该会话时检测已关闭的连接。崩溃的或终止自己的进程(例如从任务管理器)的客户端应用程序立即由 Windows NT 清除,很少会导致孤立会话。当客户端计算机意外断电或在未执行正常关机的情况下关闭时,是出现孤立会话的一个常见起因。孤立会话还会由于挂起的应用程序而发生,此应用程序从未完全终止,从而导致死连接。Windows NT 不知道该连接已死并继续向 SQL Server 报告其操作为活动的。而 SQL Server 则保持会话打开并继续等待来自客户端的命令。打开的会话占据一个 SQL Server 网络连接。连接的最大数目由服务器客户端访问许可证 (CAL) 的数量限制,因此孤立会话可能阻止其它客户端的连接。通常,更重要的问题是打开的会话使用服务器资源,并可能拥有打开的游标、临时表或锁。这些锁可能阻塞其它连接执行有用的工作,有时会导致锁的大量"堆积"。在严重的情况下,可能出现 SQL Server 停止工作的现象。
但实践证明,在浏览器关掉后,服务器仍在运行,查询仍占用很大的系统资源
to:helloyou0(你好!)
我看了php手册,说是让在php.ini中设置 ignore_user_abort,但打开php.ini,却没找到ignore_user_abort
可以决定脚本是否需要在客户端中断连接时退出。有时候让脚本完整地运行会带来很多方便,即使没有远程浏览器接受脚本的输出。默认的情况是当远程客户端连接中断时脚本将会退出。该处理过程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 设置中对应的“php_value ignore_user_abort”以及 ignore_user_abort() 函数来控制。如果没有告诉 PHP 忽略用户的中断,脚本将会被中断,除非通过 register_shutdown_function() 设置了关闭触发函数。通过该关闭触发函数,当远程用户点击 STOP 按钮后,脚本再次尝试输出数据时,PHP 将会检测到连接已被中断,并调用关闭触发函数。 可是刚才有时间就实测了一下。没有中断,还是执行了。还得研究研究。
————————————————————————————————
其实我也试了,在程序顶加ignore_user_abort(false);还是不行。用这种方法不能终止服务器端sql server的查询
这个应该只在windows下才会出现。windows下apache+php会发生一些奇怪的故障。比如这个。服务器忽略用户的浏览器中断,而是继续执行,这是由于windows下服务器的ignore_user_abort默认是on。你可以查看phpinfo的输出得到。由于默认是忽略,所以用户的中断就不起作用了。而且,如果你的php.ini中output_buffer=on
那么,由于服务器在输出过程中要讲所有输出到缓冲,最后输出到浏览器,此间,客户中断时,由于服务器并不输出数据,所以,用register_shutdown_function注册的函数不会被调用。服务器不能检测到客户端的正确状态,所以php代码继续执行。