今天遇到了一个问题,PHP在后台处理前台发送过来的一个txt文本,里面是论坛需要屏蔽的敏感字,大概有四万条。

在切割好向数据库里添加时,总是遇到链接超时的问题,我们的nginx设置超时时间是10s,php处理的超时时间是60s,发现在这样的时间里只能向数据库添加400多条数据,就中断了。


于是考虑让nginx给浏览器反馈成功,而PHP继续在后台处理的方式来解决。


大概的代码实现很简单:

//后台运行
ignore_user_abort(true); 
//取消脚本运行时间的超时上限
set_time_limit(0); 
//让浏览器回到前一页
header('location:'.$_SERVER['HTTP_REFERER']);
//使用的是FastCGI模式,用下面方法能马上结束会话
fastcgi_finish_request();
...//这里的代码会继续执行


相关函数说明


ignore_user_abort(setting)

setting:可选。如果设置为 true,则忽略与用户的断开,如果设置为 false,会导致脚本停止运行。

如果未设置该参数,会返回当前的设置。

注释:PHP 不会检测到用户是否已断开连接,直到尝试向客户机发送信息为止。简单地使用 echo 语句无法确保信息发送,参阅 flush() 函数。


set_time_limit($seconds)

$seconds为整型,最大执行时间,以秒计。如果设置为零,没有时间方面的限制。

set_time_limit设置允许脚本运行的时间,单位为秒。如果超过了此设置,脚本返回一个致命的错误。默认值为30秒,或者是在php.ini的max_execution_time被定义的值,如果此值存在。

当此函数被调用时,set_time_limit()会从零开始重新启动超时计数器。换句话说,如果超时默认是30秒,在脚本运行了了25秒时调用 set_time_limit(20),那么,脚本在超时之前可运行总时间为45秒。


fastcgi_finish_request()

此函数冲刷(flush)所有响应的数据给客户端并结束请求。 这使得客户端结束连接后,需要大量时间运行的任务能够继续运行。

成功时返回 TRUE,或者在失败时返回 FALSE。