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 字符串替换的方法
Jan 10 PHP
基于empty函数的输出详解
Jun 17 PHP
php 不使用js实现页面跳转
Feb 11 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 PHP
PHP中的静态变量及static静态变量使用详解
Nov 05 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
PHP中使用OpenSSL生成证书及加密解密
Feb 05 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
PHP实现对图片的反色处理功能【测试可用】
Feb 01 PHP
thinkPHP框架RBAC实现原理分析
Feb 01 PHP
laravel-admin 中列表筛选方法
Oct 03 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
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
php中smarty实现多模版网站的方法
2015/06/11 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
JavaScript DOM基础
2015/04/13 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
如何让微信小程序页面之间的通信不再变困难
2019/06/03 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
Python中字符串的修改及传参详解
2016/11/30 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
使用Python防止SQL注入攻击的实现示例
2020/05/21 Python
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
如何保障Web服务器安全
2014/05/05 面试题
一年级班主任寄语
2014/01/19 职场文书
公司寄语大全
2014/04/10 职场文书
股权转让协议书
2014/04/12 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
车辆委托书范本
2014/10/05 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
基于redis+lua进行限流的方法
2022/07/23 Redis
TS 类型兼容教程示例详解
2022/09/23 Javascript