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写入WRITE编码为UTF8的文件的实现代码
Jul 07 PHP
php获取目录所有文件并将结果保存到数组(实例)
Oct 25 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
Aug 25 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
Yii框架form表单用法实例
Dec 04 PHP
php读取远程gzip压缩网页的方法
Dec 29 PHP
PHP获取一段文本显示点阵宽度和高度的方法
Mar 12 PHP
php输出图像的方法实例分析
Feb 16 PHP
php中的异常和错误浅析
May 03 PHP
PDO::inTransaction讲解
Jan 28 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
Oct 16 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 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
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
php自定义错误处理用法实例
2015/03/20 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
深入讲解PHP的对象注入(Object Injection)
2017/03/01 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
用javascript获取textarea中的光标位置
2008/05/06 Javascript
javascript加号"+"的二义性说明
2013/03/04 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
Firefox中使用outerHTML的2种解决方法
2014/06/07 Javascript
javascript 动态创建表格
2015/01/08 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
跟老齐学Python之编写类之三子类
2014/10/11 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
Python 硬币兑换问题
2019/07/29 Python
Python2与Python3的区别详解
2020/02/09 Python
Python模块相关知识点小结
2020/03/09 Python
美国批发零售网站:GearXS
2016/07/26 全球购物
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
出纳岗位职责
2013/11/09 职场文书
后勤部长岗位职责
2013/12/14 职场文书
优秀教师工作感言
2014/02/16 职场文书
开门红主持词
2014/04/02 职场文书