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 防止单引号,双引号在接受页面转义
Jul 10 PHP
php fckeditor 调用的函数
Jun 21 PHP
php ss7.5的数据调用 (笔记)
Mar 08 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
php获取通过http协议post提交过来xml数据及解析xml
Dec 16 PHP
关于js与php互相传值的介绍
Jun 25 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
YII中assets的使用示例
Jul 31 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
Jan 14 PHP
遍历echsop的region表形成缓存的程序实例代码
Nov 01 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
PHP SFTP实现上传下载功能
Jul 26 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网上商城购物车设计代码分享
2012/02/15 PHP
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
PHP中上传文件打印错误错误类型分析
2019/04/14 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
Python数据类型之List列表实例详解
2019/05/08 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
python实现登录与注册系统
2020/11/30 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
W Concept美国:精选全球独立设计师
2017/02/22 全球购物
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
护士个人自我鉴定
2014/03/24 职场文书
高考寄语大全
2014/04/08 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang