Linux下的PHP ignore_user_abort() 函数, ignore_user_abort(true); php关闭浏览器还能运行函数,及把数据顺利的通过ignore_user_abort和Curl传入测试环境的办法。
常常是这样的一对儿:
有同事问,浏览器关闭,但我PHP的程序需要在浏览器执行很长时间,怎么弄,那小子估计是想回家了,想关电脑,但又执行了,关不掉,于是有这个需求。So,有没有这样的函数,或者方法也好,实现也就是说无论客户端是否关闭浏览器,下面的程序都会执行呢.
当然有,如下:
函数:ignore_user_abort()
ignore_user_abort
连接中断后程序是否执行
本 函数配置或取得使用端连接中断后,PHP 程序是否仍继续执行。默认值为中断连接后就停止执行。在 PHP 配置文件中 (php3.ini/php.ini) 的 ignore_user_abort 选项就是配置处。本功能在 PHP 3.0.7 版之后才开始提供。
ignore_user_abort
(PHP 3>= 3.0.7, PHP 4 )
ignore_user_abort -- Set whether a client disconnect should abort script execution
Description
int ignore_user_abort ( [bool setting])
This function sets whether a client disconnect should cause a script to be aborted. It will return the previous setting and can be called without an argument to not change the current setting and only return the current setting. See the Connection Handling section in the Features chapter for a complete description of connection handling in PHP.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
在 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。
---------http://wenku.baidu.com/link?url=yOvKvvr9Dt0_0IH2rJF3ZJKb--VJnfOsCDX1MoCfazFSfwWRPGKFFUSwpJPjtNZi5cMhC14e-kTYhMPBr4JQfDXcWKESnr5FxpM4FEVoNBm-------
采用curl库在PHP程序之间传递数组[原创],里面写道:
最近在工作中遇到一个问题:a.php程序需要将接收到的数据同时写到“线上运行的正式数据库”和“进行开发调试的测试数据库”。而测试数据库可能经常会面临对表结构、字段、配置信息做调整等问题,很不稳定,发生错误的概率很高,如果用a.php程序同时写“正式数据库”和“测试数据库”,势必影响到线上运行的正式服务。
——————————————这里的b.php就用到了ignore_user_abort() 函数——————————————
于是,我想到用PHP curl扩展库将生成的$data数组post传递一份给b.php程序,然后a.php程序继续往下执行写“正式数据库”的代码。a.php程序将$data数组传递给b.php程序就完事了,至于b.php如何处理,就不关a.php的事了,b.php程序即使写“测试数据库”失败,也不会对a.php程序造成影响。
——————————————原文:http://blog.s135.com/post/285/——————————————
按照这种思路,我写了a.php和b.php的代码:
a.php程序源代码:
b.php程序源代码:
备注:这两段代码需要php curl扩展库的支持,查看phpinfo(),如果cURL support enabled则表示支持curl库。
1、Windows下的PHP开启curl库支持:
打开php.ini,将extension=php_curl.dll前的;号去掉。
2、Linux下的PHP开启curl库支持:
编译PHP时在./configure后加上 --with-curl
这一句 $get_data = file_get_contents("php://input"); 中的"php://input "是?
PHP 输入/输出流,php://input 允许读取 POST 的原始数据。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Last:linux下的php的配置不一样。
ignore_user_abort(true); php关闭浏览器还能运行函数,怎么让那个关闭浏览器还在,这块需要检查一下那个Php.ini的参数:
ignore_user_abort Off Off
群讨论:
回忆未来(372647693) 17:07:34
我想问下这个file_get_contents超时或者curl超时,那个被访问的Url在超时后但这个发起调用的程序推出后,这个被访问的Url还会一直执行完么?
我发现会报一个警告。
jayli□<knuth.fan@qq.com> 17:07:54
会
jianbinxiao - Comsenz(244683) 17:09:07
nginx会有一个499
云存储-大鹏飞(1492034266) 17:11:24
同问fgets超时
回忆未来(372647693) 17:12:06
为什么会?请告诉我原理。
主进程退出,相当于浏览器关闭,如无特殊设置,程序会停止执行,为何这个PHP主进程退出,仍然会执行完呢?
jayli□<knuth.fan@qq.com> 17:16:53
客户端退出了,服务端如何做,是依赖服务端的程序决定的,他可以退出也可以不退出,我看你说的场景,是退出的……
是不退出的……
jasperkang - 广告<i@mail.bnu.edu.cn> 17:23:33
一般情况是停止运行的,php 有个函数ignore_user_abort,可以设置执行完
chunhaoyan-频道(836019) 17:24:17
那个没用的。只有后台向前台输出内容时才会检查。
前台断线了。后台会一直运行到有echo,或是set_time_limit的时限。
jasperkang - 广告<i@mail.bnu.edu.cn> 17:25:49
ignore_user_abort(true);
set_time_limit(0);
无敌了
chunhaoyan-频道(836019) 17:26:12
加这个只能中断不了
他是想要跟着前台一起中断吧
jayli□<knuth.fan@qq.com> 17:27:26
要跟着前台一起中断,该怎么做?
chunhaoyan-频道(836019) 17:27:45
隔一会echo一下
jayli□<knuth.fan@qq.com> 17:28:22
chunhaoyan-频道(836019) 17:29:32
或是用connection_aborted判断是不是断了。
然后自己停掉
jayli□<knuth.fan@qq.com> 17:31:20
隔一会检查一下?这个比echo好……
回忆未来(372647693) 17:34:08
jasperkang - 广告<i@mail.bnu.edu.cn> 17:23:33
一般情况是停止运行的,php 有个函数ignore_user_abort,可以设置执行完
那就是说,如果用Php的file_get_contents里加入超时,而在超时内没有执行完毕,调用程序退出,而该主程序发出的请求的那个PHP也随之退出了,而也许任务并没有执行完,也就是没有达到真正异步的效果了?
Bluex-微博<bluex.c@163.com> 17:37:26
虽然PHP不支持多线程, 模拟个多线程来实现, 哈,
回忆未来(372647693) 17:38:27
请正面回答我的问题?各位兄弟。
SuperMan - SOSO(16732305) 17:38:47
你说的对。。
回忆未来(372647693) 17:38:56
不加:ignore_user_abort 和set_time_limit(0);
ika(社区开发组)(809456664) 17:39:10
为啥不加逻辑层来做呢。。。
chunhaoyan-频道(836019) 17:39:42
已经答过了。后台不会去主动检查client是否断线。只有在输出内容到client时才会检查。
或是用connection_aborted判断是不是断了??
请教,如何调试connection_aborted()和connection_status()
写了个简单的,只是都是0,什么时候可以得到真?
function abc() {
$x=connection_status()."||".connection_aborted();
//把x写到数据库去。但每次都为0
}
register_shutdown_function("abc");//申明中断函数
sleep(10);//暂停。暂停过程中,手动按浏览器的停止,或者关掉浏览器
exit;
connection_aborted — Check whether if client disconnected
说明
int connection_aborted ( void )
Checks whether if the client disconnected.
返回值
Returns 1 if client disconnected, 0 otherwise.
有同事问,浏览器关闭,但我PHP的程序需要在浏览器执行很长时间,怎么弄,那小子估计是想回家了,想关电脑,但又执行了,关不掉,于是有这个需求。So,有没有这样的函数,或者方法也好,实现也就是说无论客户端是否关闭浏览器,下面的程序都会执行呢.
当然有,如下:
函数:ignore_user_abort()
ignore_user_abort
连接中断后程序是否执行
本 函数配置或取得使用端连接中断后,PHP 程序是否仍继续执行。默认值为中断连接后就停止执行。在 PHP 配置文件中 (php3.ini/php.ini) 的 ignore_user_abort 选项就是配置处。本功能在 PHP 3.0.7 版之后才开始提供。
ignore_user_abort
(PHP 3>= 3.0.7, PHP 4 )
ignore_user_abort -- Set whether a client disconnect should abort script execution
Description
int ignore_user_abort ( [bool setting])
This function sets whether a client disconnect should cause a script to be aborted. It will return the previous setting and can be called without an argument to not change the current setting and only return the current setting. See the Connection Handling section in the Features chapter for a complete description of connection handling in PHP.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
在 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。
---------http://wenku.baidu.com/link?url=yOvKvvr9Dt0_0IH2rJF3ZJKb--VJnfOsCDX1MoCfazFSfwWRPGKFFUSwpJPjtNZi5cMhC14e-kTYhMPBr4JQfDXcWKESnr5FxpM4FEVoNBm-------
采用curl库在PHP程序之间传递数组[原创],里面写道:
最近在工作中遇到一个问题:a.php程序需要将接收到的数据同时写到“线上运行的正式数据库”和“进行开发调试的测试数据库”。而测试数据库可能经常会面临对表结构、字段、配置信息做调整等问题,很不稳定,发生错误的概率很高,如果用a.php程序同时写“正式数据库”和“测试数据库”,势必影响到线上运行的正式服务。
——————————————这里的b.php就用到了ignore_user_abort() 函数——————————————
于是,我想到用PHP curl扩展库将生成的$data数组post传递一份给b.php程序,然后a.php程序继续往下执行写“正式数据库”的代码。a.php程序将$data数组传递给b.php程序就完事了,至于b.php如何处理,就不关a.php的事了,b.php程序即使写“测试数据库”失败,也不会对a.php程序造成影响。
——————————————原文:http://blog.s135.com/post/285/——————————————
按照这种思路,我写了a.php和b.php的代码:
a.php程序源代码:
b.php程序源代码:
备注:这两段代码需要php curl扩展库的支持,查看phpinfo(),如果cURL support enabled则表示支持curl库。
1、Windows下的PHP开启curl库支持:
打开php.ini,将extension=php_curl.dll前的;号去掉。
2、Linux下的PHP开启curl库支持:
编译PHP时在./configure后加上 --with-curl
这一句 $get_data = file_get_contents("php://input"); 中的"php://input "是?
PHP 输入/输出流,php://input 允许读取 POST 的原始数据。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Last:linux下的php的配置不一样。
ignore_user_abort(true); php关闭浏览器还能运行函数,怎么让那个关闭浏览器还在,这块需要检查一下那个Php.ini的参数:
ignore_user_abort Off Off
群讨论:
回忆未来(372647693) 17:07:34
我想问下这个file_get_contents超时或者curl超时,那个被访问的Url在超时后但这个发起调用的程序推出后,这个被访问的Url还会一直执行完么?
我发现会报一个警告。
jayli□<knuth.fan@qq.com> 17:07:54
会
jianbinxiao - Comsenz(244683) 17:09:07
nginx会有一个499
云存储-大鹏飞(1492034266) 17:11:24
同问fgets超时
回忆未来(372647693) 17:12:06
为什么会?请告诉我原理。
主进程退出,相当于浏览器关闭,如无特殊设置,程序会停止执行,为何这个PHP主进程退出,仍然会执行完呢?
jayli□<knuth.fan@qq.com> 17:16:53
客户端退出了,服务端如何做,是依赖服务端的程序决定的,他可以退出也可以不退出,我看你说的场景,是退出的……
是不退出的……
jasperkang - 广告<i@mail.bnu.edu.cn> 17:23:33
一般情况是停止运行的,php 有个函数ignore_user_abort,可以设置执行完
chunhaoyan-频道(836019) 17:24:17
那个没用的。只有后台向前台输出内容时才会检查。
前台断线了。后台会一直运行到有echo,或是set_time_limit的时限。
jasperkang - 广告<i@mail.bnu.edu.cn> 17:25:49
ignore_user_abort(true);
set_time_limit(0);
无敌了
chunhaoyan-频道(836019) 17:26:12
加这个只能中断不了
他是想要跟着前台一起中断吧
jayli□<knuth.fan@qq.com> 17:27:26
要跟着前台一起中断,该怎么做?
chunhaoyan-频道(836019) 17:27:45
隔一会echo一下
jayli□<knuth.fan@qq.com> 17:28:22
chunhaoyan-频道(836019) 17:29:32
或是用connection_aborted判断是不是断了。
然后自己停掉
jayli□<knuth.fan@qq.com> 17:31:20
隔一会检查一下?这个比echo好……
回忆未来(372647693) 17:34:08
jasperkang - 广告<i@mail.bnu.edu.cn> 17:23:33
一般情况是停止运行的,php 有个函数ignore_user_abort,可以设置执行完
那就是说,如果用Php的file_get_contents里加入超时,而在超时内没有执行完毕,调用程序退出,而该主程序发出的请求的那个PHP也随之退出了,而也许任务并没有执行完,也就是没有达到真正异步的效果了?
Bluex-微博<bluex.c@163.com> 17:37:26
虽然PHP不支持多线程, 模拟个多线程来实现, 哈,
回忆未来(372647693) 17:38:27
请正面回答我的问题?各位兄弟。
SuperMan - SOSO(16732305) 17:38:47
你说的对。。
回忆未来(372647693) 17:38:56
不加:ignore_user_abort 和set_time_limit(0);
ika(社区开发组)(809456664) 17:39:10
为啥不加逻辑层来做呢。。。
chunhaoyan-频道(836019) 17:39:42
已经答过了。后台不会去主动检查client是否断线。只有在输出内容到client时才会检查。
或是用connection_aborted判断是不是断了??
请教,如何调试connection_aborted()和connection_status()
写了个简单的,只是都是0,什么时候可以得到真?
function abc() {
$x=connection_status()."||".connection_aborted();
//把x写到数据库去。但每次都为0
}
register_shutdown_function("abc");//申明中断函数
sleep(10);//暂停。暂停过程中,手动按浏览器的停止,或者关掉浏览器
exit;
connection_aborted — Check whether if client disconnected
说明
int connection_aborted ( void )
Checks whether if the client disconnected.
返回值
Returns 1 if client disconnected, 0 otherwise.
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/4904/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2013-12-21 23:42
评论列表
2012-1-7 19:12 | gamesiwuliu
太好了!!!谢谢分享啊!!!顶顶!!
分页: 1/1 1