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中文本数据翻页(留言本翻页)
Oct 09 PHP
PHP insert语法详解
Jun 07 PHP
php模板中出现空行解决方法
Mar 08 PHP
php定时计划任务与fsockopen持续进程实例
May 23 PHP
php调用nginx的mod_zip模块打包ZIP文件
Jun 11 PHP
制作安全性高的PHP网站的几个实用要点
Dec 30 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
iOS10推送通知开发教程
Sep 19 PHP
php版微信自动登录并获取昵称的方法
Sep 23 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
Dec 02 PHP
通过PHP设置BugFree获取邮箱通知
Apr 25 PHP
php实例化一个类的具体方法
Sep 19 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中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
清除输入框内的空格
2016/12/21 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
Python selenium 三种等待方式解读
2016/09/15 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
python实现控制台打印的方法
2019/01/12 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
浅析matlab中imadjust函数
2020/02/27 Python
Django-imagekit的使用详解
2020/07/06 Python
教师年终个人自我评价
2013/10/04 职场文书
出纳员岗位职责
2014/03/13 职场文书
优秀党支部申报材料
2014/12/24 职场文书
表扬稿格式范文
2015/01/16 职场文书
最新的离婚协议书范本!
2019/07/02 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python