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 相关文章推荐
在线短消息收发的程序,不用数据库
Oct 09 PHP
PHP 木马攻击防御技巧
Jun 13 PHP
PHP Session变量不能传送到下一页的解决方法
Nov 27 PHP
php中通过Ajax如何实现异步文件上传的代码实例
May 07 PHP
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
Jul 03 PHP
php 模拟post_验证页面的返回状态(实例讲解)
Oct 28 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
Oct 16 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
May 09 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
php-app开发接口加密详解
Apr 18 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
Oct 02 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
请离开include_once和require_once
2013/07/18 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
2019/06/17 PHP
php函数式编程简单示例
2019/08/08 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
2015/07/15 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
JQuery遍历元素的后代和同胞实现方法
2016/09/18 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
2018/07/02 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
Python获取任意xml节点值的方法
2015/05/05 Python
Python的IDEL增加清屏功能实例
2017/06/19 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
python 字典中文key处理,读取,比较方法
2018/07/06 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
Django框架视图函数设计示例
2019/07/29 Python
python使用多线程+socket实现端口扫描
2020/05/28 Python
python 装饰器的基本使用
2021/01/13 Python
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
英国DIY汽车维修配件网站:DIY Car Service Parts
2019/08/30 全球购物
韩国乐天网上商城:Lotte iMall
2021/02/03 全球购物
戒毒悔改检讨书
2014/09/21 职场文书
欢迎新生标语
2014/10/06 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
党小组鉴定意见
2015/06/02 职场文书
毕业生学校组织意见
2015/06/04 职场文书