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
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
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
你可以尝试在循环里加connection_status()来判断用户是否已中断。
这是因为sleep期间php没有输出,其后用循环测试不成功也是因为其中没有输出
php只在输出时才检查用户连接状态,这个在手册里说的很明白了。
php只在输出时才检查用户连接状态,这个在手册里说的很明白了。---------
唠叨兄,您能不能给个例子?
echo "xxxx";
flush();
sleep(10);
echo "xxxx";
flush();
sleep(10);没用。这或许真是windows下php的严重bug吧
这是可能的!因为linux是时分多路的操作系统,当php进程重入的时候可能会提供php一些环境参数,不是很清楚,需要分析linux源码才知道windows是带优先级的消息驱动系统,sleep只暂时挂起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
注: 以下内容对 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 将会检测到连接已被中断,并调用关闭触发函数。”只在“脚本再次尝试输出数据时”!!!
*********************
将循环次数减少为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就让浏览器承受不住了?