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 相关文章推荐
怎样在UNIX系统下安装php3
Oct 09 PHP
php str_replace的替换漏洞
Mar 15 PHP
PHP HTML代码串 截取实现代码
Jun 29 PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
Aug 25 PHP
thinkphp模板输出技巧汇总
Nov 24 PHP
PHP实现二维数组按某列进行排序的方法
Nov 18 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
Mar 14 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
php微信公众号开发之现金红包
Apr 16 PHP
PHP判断函数是否被定义的方法
Jun 21 PHP
php5与php7的区别点总结
Oct 11 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操作符与控制结构代码
2011/12/30 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
js查错流程归纳
2012/05/04 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
python编写微信远程控制电脑的程序
2018/01/05 Python
精彩的推荐信范文
2013/11/26 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
市场营销战略计划书
2014/05/06 职场文书
2015年共青团工作总结
2015/05/15 职场文书
民事代理词范文
2015/05/25 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers