大家可以看到,我已经特别在文件开头注明了。Ignore_User_Abort(False);,这个语句是我后来加上的,重起服务器,情况照旧。set_time_limit("0");
Ignore_User_Abort(False);

解决方案 »

  1.   

    phpinfo html_errors On On 
    ignore_repeated_errors Off Off 
    ignore_repeated_source Off Off 
    ignore_user_abort On Off 
    implicit_flush Off Off 于是我在php.ini里ignore_repeated_source = Off下面加了一行。
    ignore_repeated_source = Off
    ignore_user_abort  = Off 结果没有任何变化。靠。于是修改为
    ignore_repeated_source = On
    ignore_user_abort  = Off 结果起变化了,说明配置文件的位置没有问题。
    ignore_repeated_source On Off 
    ignore_user_abort On Off 
      

  2.   

    window下的确不会自动退出。
    你可以尝试在循环里加connection_status()来判断用户是否已中断。
      

  3.   

    sleep(10);大概3秒钟,我按了浏览器的stop按钮,服务器端脚本应该停止执行了才对阿 。然而,sleep并没有停止,10秒后,后续的脚本写了文件。您可以看到三个检测状态的函数都返回normal.没有aborted.
    这是因为sleep期间php没有输出,其后用循环测试不成功也是因为其中没有输出
    php只在输出时才检查用户连接状态,这个在手册里说的很明白了。
      

  4.   

    不是的。我用echo输出也一样不会断开。所以现在只好用connection_status()来判断。不知道是不是window版才这样。
      

  5.   

    echo输出也一样。这难道是windows下的问题?linux则不存在这个问题?你们没有遇到过?不知道是不是配置的问题。
      

  6.   

    这是因为sleep期间php没有输出,其后用循环测试不成功也是因为其中没有输出
    php只在输出时才检查用户连接状态,这个在手册里说的很明白了。---------
    唠叨兄,您能不能给个例子?
      

  7.   

    用flush试试看
    echo "xxxx";
    flush();
    sleep(10);
      

  8.   

    用flush试试看
    echo "xxxx";
    flush();
    sleep(10);没用。这或许真是windows下php的严重bug吧
      

  9.   

    linux则不存在这个问题
    这是可能的!因为linux是时分多路的操作系统,当php进程重入的时候可能会提供php一些环境参数,不是很清楚,需要分析linux源码才知道windows是带优先级的消息驱动系统,sleep只暂时挂起php进程而并不能使优先级提高,并且也不是重入
      

  10.   

    我不知道是否能通过配置文件来解决这个问题,如果这真是bug,那么这说明windows+php+apache作为服务器的情况下,php不能检测客户端的连接状态。ignore_user_abort,connection_status()connection_aborted等函数都形同虚设
      

  11.   

    linux服务器下也同样出现这个问题,检测结果和windows下面的结果一样。检查log.txt,您可以看到,服务器并没有正确反应客户端的stop状态。如此只能怀疑我的测试代码有问题了,然而,我并不能看出哪里有问题。
      

  12.   

    linux下的php的配置不一样。
    phpinfo查到的ignore_user_abort 为Off Off html_errors On On 
    ignore_repeated_errors Off Off 
    ignore_repeated_source Off Off 
    ignore_user_abort Off Off 
    implicit_flush Off Off
      

  13.   

    章 40. 连接处理
    注: 以下内容对 PHP 3.0.7 及更高版本适用。 在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况: 
    0 - NORMAL(正常)1 - ABORTED(异常退出)2 - TIMEOUT(超时)
    当 PHP 脚本正常地运行 NORMAL 状态时,连接为有效。当远程客户端中断连接时,ABORTED 状态的标记将会被打开。远程客户端连接的中断通常是由用户点击 STOP 按钮导致的。当连接时间超过 PHP 的时限(请参阅 set_time_limit() 函数)时,TIMEOUT 状态的标记将被打开。 可以决定脚本是否需要在客户端中断连接时退出。有时候让脚本完整地运行会带来很多方便,即使没有远程浏览器接受脚本的输出。默认的情况是当远程客户端连接中断时脚本将会退出。该处理过程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 设置中对应的“php_value ignore_user_abort”以及 ignore_user_abort() 函数来控制。如果没有告诉 PHP 忽略用户的中断,脚本将会被中断,除非通过 register_shutdown_function() 设置了关闭触发函数。通过该关闭触发函数,当远程用户点击 STOP 按钮后,脚本再次尝试输出数据时,PHP 将会检测到连接已被中断,并调用关闭触发函数。 脚本也有可能被内置的脚本计时器中断。默认的超时限制为 30 秒。这个值可以通过设置 php.ini 的 max_execution_time 或 Apache .conf 设置中对应的“php_value max_execution_time”参数或者 set_time_limit() 函数来更改。当计数器超时的时候,脚本将会类似于以上连接中断的情况退出,先前被注册过的关闭触发函数也将在这时被执行。在该关闭触发函数中,可以通过调用 connection_status() 函数来检查超时是否导致关闭触发函数被调用。如果超时导致了关闭触发函数的调用,该函数将返回 2。 需要注意的一点是 ABORTED 和 TIMEOUT 状态可以同时有效。这在告诉 PHP 忽略用户的退出操作时是可能的。PHP 将仍然注意用户已经中断了连接但脚本仍然在运行的情况。如果到了运行的时间限制,脚本将被退出,设置过的关闭触发函数也将被执行。在这时会发现函数 connection_status() 返回 3。 
    ******注意其中的“当远程用户点击 STOP 按钮后,脚本再次尝试输出数据时,PHP 将会检测到连接已被中断,并调用关闭触发函数。”只在“脚本再次尝试输出数据时”!!!
         *********************
      

  14.   

    我已经测试得出正确结果了。的确要输出到浏览器才会中断。加上ob_flush()就断了。
      

  15.   

    可能是我的IE有问题吧。开始我的output_buffer设为on.所以关闭函数不工作。现在设为off,register_shutdown_function可以工作了,循环次数设为1000*5000次,每次输出一个\n,IE开始狂暴地刷新,cpu占用99%。日志不停地长,connection_status和connection_aborted得到的都是1。
    将循环次数减少为1000*500,ie还是不行,减少为1000*50还是不行,减少为1000*5,这下行了。
    日志都正确地写上去了。connection_status和connection_aborted得到的都是0。点stop按钮?
    来不及点,由于循环次数太少,根本来不及点stop.
    ---------------换firefox。没有不停地刷新了。1000*5000次循环firefox的内存占用迅速提到了231MB,cpu99%。apache没什么动静。等执行结束(没有按stop),查看日志:connection_status和connection_aborted得到的都是1。---------------------
    由此得出结论,浏览器对客户端的缓冲是有大小限制的,如果服务器端发送的内容超过了限度,浏览器就会自动stop,然后ie是重新请求,firefox则停止请求。firefox的缓冲大小比ie的要大的多。1000*5kb = 5MB,我怎么都想不通,5MB就让浏览器承受不住了?
      

  16.   

    5M对ie来说等于500M。?有什么依据?
      

  17.   

    微软的习惯是这样的呀。每一个字,要用100倍的空间用来描述这个字当前的状态、历史记录什么的。xp后好了一点。2000年代如果用记事本打开一个64k以上的文本你就会发现你机器死了。
      

  18.   

    igonre_user_abort会让PHP独立在后台运作。即时关闭浏览器也是如此。除非重启服务器