似乎和这个有关: ignore_user_abort

解决方案 »

  1.   

    to: Gdj(陈水.智商只有129.非卖品) 
    但实践证明,在浏览器关掉后,服务器仍在运行,查询仍占用很大的系统资源
    to:helloyou0(你好!) 
    我看了php手册,说是让在php.ini中设置 ignore_user_abort,但打开php.ini,却没找到ignore_user_abort
      

  2.   

    浏览器关掉后,php是会自动停止的。但是数据库可不会。我估计你是提交个了超长时间的查询。以至php无法返回,当然就结束不掉了。在程序顶加ignore_user_abort(true);可设为忽视用户中断。
      

  3.   

    你自己检查你程序里有没有用一些长时间不返回控制权给php的函数。
      

  4.   

    不……我也是看手册的,如下:
    可以决定脚本是否需要在客户端中断连接时退出。有时候让脚本完整地运行会带来很多方便,即使没有远程浏览器接受脚本的输出。默认的情况是当远程客户端连接中断时脚本将会退出。该处理过程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 设置中对应的“php_value ignore_user_abort”以及 ignore_user_abort() 函数来控制。如果没有告诉 PHP 忽略用户的中断,脚本将会被中断,除非通过 register_shutdown_function() 设置了关闭触发函数。通过该关闭触发函数,当远程用户点击 STOP 按钮后,脚本再次尝试输出数据时,PHP 将会检测到连接已被中断,并调用关闭触发函数。 可是刚才有时间就实测了一下。没有中断,还是执行了。还得研究研究。
      

  5.   

    客户端可能会突然切断与服务器的连接,因而客户端进程无法告知网络正确关闭连接。这可能由于许多原因而发生,包括客户端的电源故障。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 停止工作的现象。
      

  6.   

    可是刚才有时间就实测了一下。没有中断,还是执行了。还得研究研究。
    ————————————————————————————————
    其实我也试了,在程序顶加ignore_user_abort(false);还是不行。用这种方法不能终止服务器端sql server的查询
      

  7.   

    实践证明,在浏览器关掉后,服务器仍在运行,查询仍占用很大的系统资源--------------
    这个应该只在windows下才会出现。windows下apache+php会发生一些奇怪的故障。比如这个。服务器忽略用户的浏览器中断,而是继续执行,这是由于windows下服务器的ignore_user_abort默认是on。你可以查看phpinfo的输出得到。由于默认是忽略,所以用户的中断就不起作用了。而且,如果你的php.ini中output_buffer=on
    那么,由于服务器在输出过程中要讲所有输出到缓冲,最后输出到浏览器,此间,客户中断时,由于服务器并不输出数据,所以,用register_shutdown_function注册的函数不会被调用。服务器不能检测到客户端的正确状态,所以php代码继续执行。
      

  8.   

    但是我这客户端和服务器上的ignore_user_abort默认都为off,output_buffer都为off,怎么还会发生服务器忽略客户端呢?
      

  9.   

    我这边情况是客户端浏览器关闭后,很长时间后,再到服务器上查看windows任务管理器中的进程,发现php.exe占用的cpu有90%以上,甚至100%,必须结束这个进程,服务器才能正常运转.这是什么原因?
      

  10.   

    是的,这个问题应该是php的windows版本的bug.off也不行。linux下应该没有这个问题。我不知道解决的办法。