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 date函数参数详解
Nov 27 PHP
解析php中array_merge与array+array的区别
Jun 21 PHP
php下获取http状态的实现代码
May 09 PHP
php foreach正序倒序输出示例代码
Jul 01 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
php最简单的删除目录与文件实现方法
Nov 28 PHP
php+mysqli数据库连接的两种方式
Jan 28 PHP
php格式化金额函数分享
Feb 02 PHP
常见的四种POST 提交数据方式(小总结)
Oct 08 PHP
php数组分页实现方法
Apr 30 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
PHP的mysqli_ssl_set()函数讲解
Jan 23 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生成图片缩略图的方法
2015/04/07 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
jQuery对象的length属性用法实例
2014/12/27 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
vue项目如何刷新当前页面的方法
2018/05/18 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
Python简明入门教程
2015/08/04 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
python tornado修改log输出方式
2019/11/18 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
美国礼品卡商城: Gift Card Mall
2017/08/25 全球购物
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
岗位聘任书范文
2014/03/29 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS
Python first-order-model实现让照片动起来
2022/06/25 Python