zoukankan      html  css  js  c++  java
  • 拿什么守护你PHP程序级守护进程的实现与优化

    首先需要解释的是什么是守护进程。

    守护进程就是在后台一直运行的进程。比如我们启动的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()是一个原子操作

      ----------------------

    作者:yjf512(轩脉刃)

    出处:http://www.cnblogs.com/yjf512/

    本文版权归yjf512和cnBlog共有,欢迎转载,但未经作者同意必须保留此段声明

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    链表面试题Java实现【重要】
    数据结构Java实现05----栈:顺序栈和链式堆栈
    数据结构Java实现06----中缀表达式转换为后缀表达式
    数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
    栈和队列的面试题Java实现,Stack类继承于Vector这两个类都不推荐使用
    MySQL多表查询之外键、表连接、子查询、索引
    MySQL字符串函数、日期时间函数
    sqlplus登录、连接命令
    LeetCode 68 Text Justification
    cocos2d触摸事件处理机制(2.x和3.x变化)
  • 原文地址:https://www.cnblogs.com/yjf512/p/2378783.html
Copyright © 2011-2022 走看看