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 相关文章推荐
GD输出汉字的函数的分析
Oct 09 PHP
打造计数器DIY三步曲(中)
Oct 09 PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 PHP
ThinkPHP关联模型操作实例分析
Sep 23 PHP
PHP跳转页面的几种实现方法详解
Jun 08 PHP
PHP使用range协议实现输出文件断点续传代码实例
Jul 04 PHP
使用图灵api创建微信聊天机器人
Jul 23 PHP
PHP函数func_num_args用法实例分析
Dec 07 PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
Apr 02 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
Mar 04 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 $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
从零开始学习jQuery (六) jquery中的AJAX使用
2011/02/23 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
使用js画图之饼图
2015/01/12 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
浅谈Webpack打包优化技巧
2018/06/12 Javascript
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
Python程序中的观察者模式结构编写示例
2016/05/27 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
2018/06/22 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
详解python metaclass(元类)
2020/08/13 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
计算机学生求职信范文
2014/01/30 职场文书
接待员岗位责任制
2014/02/10 职场文书
如何写好建议书
2014/03/13 职场文书
小学教师师德师风个人整改措施
2014/09/18 职场文书
国际政治学专业推荐信
2014/09/26 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
nginx设置资源请求目录的方式详解
2022/05/30 Servers