php 守护历程

首先需要注释的是什么是守护历程。守护历程就是在后台一直运行的历程。好比我们启动的httpd,mysqld等历程都是常驻内存内运行的程序。针对需求举行剖析: 需求:有一个常驻行列messageQueue(假...

首先需要注释的是什么是守护历程。守护历程就是在后台一直运行的历程。好比我们启动的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()是一个原子操作


思源资源网:分类流动

1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各种产物的最新流动,优惠券领取点击进入

3.广告同盟: 整理了现在主流的广告同盟平台,若是你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/1548

  • 发表于 2021-04-03 14:32
  • 阅读 ( 202 )
  • 分类:互联网

0 条评论

请先 登录 后评论
青蛙
青蛙

710 篇文章

你可能感兴趣的文章

相关问题