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 相关文章推荐
linux系统上支持php的 iconv()函数的方法
Oct 01 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
Jun 19 PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
Jun 23 PHP
php+ajax实现文章自动保存的方法
Dec 30 PHP
php堆排序实现原理与应用方法
Jan 03 PHP
php实现递归与无限分类的方法
Feb 16 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
Jan 07 PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 PHP
php判断是否为ajax请求的方法
Nov 29 PHP
PHP会话控制实例分析
Dec 24 PHP
php中各种定义变量的方法小结
Oct 18 PHP
PhpStorm+xdebug+postman调试技巧分享
Sep 15 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
《Re:从零开始的异世界生活》剧情体验,手游新作定名
2020/04/09 日漫
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
2015/01/04 PHP
PHP实现WebService的简单示例和实现步骤
2015/03/27 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
PHP分享图片的生成方法
2018/04/25 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
js实现简单的验证码
2015/12/25 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
angular 内存溢出的问题解决
2018/07/12 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
2020/09/11 Javascript
python中的错误处理
2016/04/10 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
Python 互换字典的键值对实例
2019/02/12 Python
Python爬虫——爬取豆瓣电影Top250代码实例
2019/04/17 Python
python如何保证输入键入数字的方法
2019/08/23 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
司机工作自我鉴定
2014/09/19 职场文书
2014年底个人工作总结
2015/03/10 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
Java中API的使用方法详情
2022/04/06 Java/Android