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实现分页的一个示例
Oct 09 PHP
在Windows版的PHP中使用ADO
Oct 09 PHP
php生成文件
Jan 15 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
yii框架源码分析之创建controller代码
Jun 28 PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 PHP
php实现的Timer页面运行时间监测类
Sep 24 PHP
一个非常完美的读写ini格式的PHP配置类分享
Feb 12 PHP
php内嵌函数用法实例
Mar 20 PHP
PHP实现多文件上传的方法
Jul 08 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
Nov 14 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 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判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
jquery ajax 登录验证实现代码
2009/09/23 Javascript
为javascript添加String.Format方法
2020/08/11 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
[49:07]VGJ.T vs Optic Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
用Python给文本创立向量空间模型的教程
2015/04/23 Python
python xml解析实例详解
2016/11/14 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
飞越疯人院观后感
2015/06/09 职场文书
举起手来观后感
2015/06/09 职场文书