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中ADODB类详解
Mar 25 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
Sep 11 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
Oct 31 PHP
PHP获取php,mysql,apche的版本信息示例代码
Jan 16 PHP
ThinkPHP文件上传实例教程
Aug 22 PHP
php采集内容中带有图片地址的远程图片并保存的方法
Jan 03 PHP
php结合md5实现的加密解密方法
Jan 25 PHP
php解析base64数据生成图片的方法
Dec 06 PHP
php加密之discuz内容经典加密方式实例详解
Feb 04 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
PHP常见的几种攻击方式实例小结
Apr 29 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
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
JavaScript学习教程之cookie与webstorage
2019/06/23 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
vue遍历对象中的数组取值示例
2019/11/07 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
DataFrame中的object转换成float的方法
2018/04/10 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
Django权限设置及验证方式
2020/05/13 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
10 套华丽的CSS3 按钮小结
2012/10/03 HTML / CSS
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
大四学生毕业自荐信
2013/11/07 职场文书
小学生元旦感言
2014/02/26 职场文书
个人批评与自我批评
2014/10/15 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python
为Centos安装指定版本的Docker
2022/04/01 Servers