PHP程序级守护进程的实现与优化的使用概述
php  /  管理员 发布于 7年前   157
首先需要解释的是什么是守护进程。 守护进程就是在后台一直运行的进程。比如我们启动的httpd,mysqld等进程都是常驻内存内运行的程序。 针对需求进行分析: 需求:有一个常驻队列messageQueue(假设在redis内存中),这个队列会有可能有请求不定期的往队列中增加元素。同时我们要求在队列中有元素的时候,按照队列顺序将元素pop出来,并进行处理(假设这个处理只是echo ‘test'); 解决方法: 现在假设已经有了两个函数 function oPopMessageQueue(){ …} //获取队列最后一个元素; function vDealElement($element) { …} 处理元素; 要求写出一个守护程序,完成上面的需求。 程序: 好了,这个程序很容易想到,可以使用while循环来做 但是考虑到:1 用php进程跑有可能会由于各种情况(比如运行时间过长),进程挂了,这样程序就无法自动重连了. 方法:使用cron 我们在定时脚本中每10分钟起一个进程跑这个程序。 然后设置这个程序的运行时间为10分钟,10分钟后自动取消,于是代码变成 $timeStart = 0; if(time() - $timeStart > 60*10) 于是考虑使用文件来增加暂停功能 这个只要把cron的10分钟起一个进程的限制改成每1分钟起一个进程就好了 这样能保证有10个线程在运行程序 但是有一个基本要求是:oPopMessageQueue()是一个原子操作
while(true)
{
if( $element = oPopMessageQueue())
{
vDealElement($element);
}
}
考虑1 : 这个程序如果一直跑的话已经可以满足上面的需求了.
while(true)
{
if($element = oPopMessageQueue())
{
vCheckTimeLimit();
vDealElement($elemnt);
}
}
function vCheckTimeLimit()
{
global $timeStart;
if(empty($timeStart))
{
$timeStart = time();
}
{
exit;
}
}
考虑2,可能会有这种需求: 需要有随时让脚本暂停的功能:
while(true)
{
if($element = oPopMessageQueue())
{
vCheckTimeLimit();
vCheckEnd();
vDealElement($elemnt);
}
}
function vCheckEnd()
{
if(file_exists("/home/JesephYe/end"))
{
exit;
}
}
考虑3, 是否可以改成多线程的程序,让运行的效率更高?您可能感兴趣的文章:
上一条:
基于php验证码函数的使用示例
下一条:
PHP静态调用非静态方法的应用分析
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号