免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123456
最近访问板块 发新帖
楼主: spiceboy
打印 上一主题 下一主题

忘了,问一下:如何在用户中止了浏览器之后,让php程序继续运行? [复制链接]

论坛徽章:
0
51 [报告]
发表于 2006-04-20 00:54 |只看该作者
顶啊

论坛徽章:
0
52 [报告]
发表于 2006-04-21 14:52 |只看该作者
到底有没有在输出的同时能够关闭浏览器让程序继续运行的方法?
ignore_user_abort参数似乎无效。

论坛徽章:
0
53 [报告]
发表于 2006-09-17 02:39 |只看该作者
无语了,大家在讨论些什么?


HTTP协议基于标准的TCP/IP协议,如果没有设置ignore_user_abort,那么当客户端关闭浏览器或者点击停止按钮时,就会断开同服务器的连接,这个时候web服务器是知道客户端关闭连接了,但php不知道,当php尝试输出内容时,这个时候才会发现客户端已经中止了连接,php才会停止运行。

楼上某些人的试验:sleep(10),write_file... 这个在浏览器关闭之后也运行了,是因为php这个时候还不知道客户端已经关闭了连接,所以他会继续运行。

反之,如果设置了ignore_user_abort (true),那么php会忽略用户的退出,配合set_time_limit(0),可以达到楼主的要求。但鉴于其他原因(webserver等),不能保证这个脚本永远运行。

论坛徽章:
0
54 [报告]
发表于 2006-09-17 10:29 |只看该作者
原帖由 saccount 于 2006-9-17 02:39 发表
无语了,大家在讨论些什么?


HTTP协议基于标准的TCP/IP协议,如果没有设置ignore_user_abort,那么当客户端关闭浏览器或者点击停止按钮时,就会断开同服务器的连接,这个时候web服务器是知道客户端关闭连接了 ...



既然停止或者关闭浏览器,那就意味着不需要web输出,,换句话说不要和web server交互了,,

论坛徽章:
0
55 [报告]
发表于 2006-09-17 11:40 |只看该作者
大家讨论的这个!
我以前也想过,并做过,用户中止了浏览器之后,让php程序继续运行本来就是默认行为。
反之用户中止了浏览器之后停止PHP的运行才是难点,
我以前没有找到理论依据,不过看了大家的帖子后,好像感觉有一些可能,
那我想说,那位朋友能提出一种验证手段来说明这个功能实现了。
给个验证方法现,然后在做程序。

论坛徽章:
0
56 [报告]
发表于 2006-09-18 11:45 |只看该作者
章 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。

论坛徽章:
0
57 [报告]
发表于 2006-09-21 12:27 |只看该作者
野狼好心,你们这样对他,有点过分,一点都不谦虚

请求发送过去,服务端总要处理完的,不管客户端是否接收返回信息

这个与http协议有关

我发这个好像也是多于的...  好久没来了 凑下热闹
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP