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 相关文章推荐
PHP的开发框架的现状和展望
Mar 16 PHP
php discuz 主题表和回帖表的设计
Mar 13 PHP
PHP基础学习之流程控制的实现分析
Apr 28 PHP
解析dedecms空间迁移步骤详解
May 15 PHP
php调用nginx的mod_zip模块打包ZIP文件
Jun 11 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
详解PHP匿名函数与注意事项
Mar 29 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 PHP
php服务器的系统详解
Oct 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/05/15 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
php 多个变量指向同一个引用($b = &$a)用法分析
2019/11/13 PHP
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
小程序实现五星点评效果
2018/11/03 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
Moment.js实现多个同时倒计时
2019/08/26 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
vue实现五子棋游戏
2020/05/28 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
Python实现图片转字符画的示例代码
2017/08/21 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
如何打开WebSphere远程debug
2014/10/10 面试题
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
函授本科毕业生自我鉴定
2013/10/16 职场文书
学生学习总结的自我评价
2013/10/22 职场文书
法制演讲稿
2014/09/10 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
python中使用redis用法详解
2022/12/24 Redis