PHP程序级守护进程的实现与优化的使用概述


Posted in PHP onMay 02, 2013

首先需要解释的是什么是守护进程。

守护进程就是在后台一直运行的进程。比如我们启动的httpd,mysqld等进程都是常驻内存内运行的程序。

针对需求进行分析:

需求:有一个常驻队列messageQueue(假设在redis内存中),这个队列会有可能有请求不定期的往队列中增加元素。同时我们要求在队列中有元素的时候,按照队列顺序将元素pop出来,并进行处理(假设这个处理只是echo ‘test');

解决方法:

现在假设已经有了两个函数

function oPopMessageQueue(){ …} //获取队列最后一个元素;

function vDealElement($element) { …} 处理元素;

要求写出一个守护程序,完成上面的需求。

程序:

好了,这个程序很容易想到,可以使用while循环来做

while(true)
{
    if( $element  = oPopMessageQueue())
    {
        vDealElement($element);
    }  
}

考虑1 : 这个程序如果一直跑的话已经可以满足上面的需求了.

但是考虑到:1 用php进程跑有可能会由于各种情况(比如运行时间过长),进程挂了,这样程序就无法自动重连了.

方法:使用cron

我们在定时脚本中每10分钟起一个进程跑这个程序。

然后设置这个程序的运行时间为10分钟,10分钟后自动取消,于是代码变成

while(true)
{
    if($element = oPopMessageQueue())
    {
        vCheckTimeLimit();
        vDealElement($elemnt);
    }
}$timeStart = 0;
function vCheckTimeLimit()
{
    global $timeStart;
    if(empty($timeStart))
    {
        $timeStart = time();
    }  
    if(time() - $timeStart > 60*10)
    {
        exit;
    }
}

考虑2,可能会有这种需求: 需要有随时让脚本暂停的功能:

于是考虑使用文件来增加暂停功能

while(true)
{
    if($element = oPopMessageQueue())
    {
        vCheckTimeLimit();
        vCheckEnd();
        vDealElement($elemnt);
    }
} 
function vCheckEnd()
{
    if(file_exists("/home/JesephYe/end"))
    {
        exit;
    }
}

考虑3, 是否可以改成多线程的程序,让运行的效率更高?

这个只要把cron的10分钟起一个进程的限制改成每1分钟起一个进程就好了

这样能保证有10个线程在运行程序

但是有一个基本要求是:oPopMessageQueue()是一个原子操作

PHP 相关文章推荐
写一个用户在线显示的程序
Oct 09 PHP
支持oicq头像的留言簿(一)
Oct 09 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
Jun 09 PHP
php递归使用示例(php递归函数)
Feb 14 PHP
php 使用GD库为页面增加水印示例代码
Mar 24 PHP
PHP获取网页标题的3种实现方法代码实例
Apr 11 PHP
php操作csv文件代码实例汇总
Sep 22 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
May 11 PHP
CodeIgniter配置之config.php用法实例分析
Jan 19 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 PHP
PHP chunk_split()函数讲解
Feb 12 PHP
基于Zookeeper的使用详解
May 02 #PHP
关于尾递归的使用详解
May 02 #PHP
基于Zend的Config机制的应用分析
May 02 #PHP
Zend的Registry机制的使用说明
May 02 #PHP
Zend的MVC机制使用分析(二)
May 02 #PHP
Zend的MVC机制使用分析(一)
May 02 #PHP
基于Zend的Captcha机制的应用
May 02 #PHP
You might like
php 常用算法和时间复杂度
2013/07/01 PHP
php处理restful请求的路由类分享
2014/02/27 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
php中各种定义变量的方法小结
2017/10/18 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
jquery div 居中技巧应用介绍
2012/11/24 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
深入浅出es6模板字符串
2017/08/26 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
node express使用HTML模板的方法示例
2019/08/22 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
Python数据类型之String字符串实例详解
2019/05/08 Python
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
入党自我鉴定范文
2013/10/04 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
安全生产先进个人总结
2015/02/15 职场文书
2015年师德表现自我评价
2015/03/05 职场文书
趣味运动会赞词
2015/07/22 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书