注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

早衰男的巢

大音希声 道隐无名

 
 
 

日志

 
 

php:ignore_user_abort() 根!本!停!不!下!来!!被玩坏了啊魂淡!  

2014-02-26 15:18:02|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
寻找 cron的替代方案定时执行php脚本。看到一篇可以在后台继续运行的文章,试了一下,脚本果然运行在后台...然后
然后就——  关!不!掉!了!!!! 还卡死了apache,所有页面都不能访问了,浏览器一直在转菊花。

出现上述现象还是因为我手残混合了一些其他的内容。如下

//危险脚本,会导致堵塞注意!!
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0);// 让程序无执行时间限制
session_id("globalShareSession");//指定ID全局共享
session_start();
while($_SESSION["run"]){
//定时执行的内容
//.....
sleep(300); //每隔5分钟持续执行
}


天真的以为,指定为同一个session_id 因而共享同一个服务器端的session文件,就可以达到无论是什么客户端都可以通过设置 $_SESSION["run"]=false ; 让这个无限循环终止的目的。

但事实是因为第一次运行的脚本依然在后台中,它把session文件独占且锁定了。又因为脚本一直在循环中没有退出的意思。当其他浏览器其他终端再去请求的时候,尝试访问同一个session文件,结果是 等到屎为止(坑被第一次运行的那个后台脚本占着)。

这下玩大了,任意打开过这个脚本的浏览器都被指向一个拿不到的session id ,都去排同一条队。关了浏览器再访问也没用,phpsessionId被写入cookies了。重启httpd 也没有用!猥琐地修改服务器上的session文件(/tmp/sess_globalShareSession 把run值改为false也不行!(while判定估计是从内存取,没有再读session文件)  最后解决办法:不得不一个个地把php进程全kill掉……终于停下来了。

以下是相关的一些备忘,以后注意。
上面的脚本如果要跑也不是没有办法 while部分修改为:

while($_SESSION["run"]){
//定时执行的内容
//.....

session_commit(); //睡眠前关闭和释放session,虽然一般的使用情况下并不需要这么做,因为脚本运行完毕就会释放
sleep(300); //每隔5分钟持续执行

session_id("globalShareSession");

session_start();//重新打开这样sleep期间就不会占死session文件了
}

再有需要注意的问题是即使取消了执行的时限和定义ignore_user_abort(TRUE);在用户关闭浏览器后,脚本涉及到 echo 要往浏览器输出内容的,会遇挫终止运行。可以通过 output buffer 的cache 和flush 控制来避免。

不过...我决定,还是放弃。用cron就好了。。。
  评论这张
 
阅读(1289)| 评论(4)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018