Heim  >  Artikel  >  php教程  >  使用php开发一个守护进程

使用php开发一个守护进程

WBOY
WBOYOriginal
2016-06-06 20:11:49938Durchsuche

php除了编写WEB服务程序以外,也可以编写一些后台脚本程序来处理后台任务,利用crontab来定时调用执行。但是如果需要一些相对实时的任务处理,就不适合用crontab了。本文主要讲下使用php来开发守护进程。 为什么使用php?个人认为主要是方便,丰富的工具库支

php除了编写WEB服务程序以外,也可以编写一些后台脚本程序来处理后台任务,利用crontab来定时调用执行。但是如果需要一些相对实时的任务处理,就不适合用crontab了。本文主要讲下使用php来开发守护进程。

为什么使用php?个人认为主要是方便,丰富的工具库支持,几行代码便能处理一些后台数据。对于一些对性能要求不是特别苛刻的,使用php来编写一个daemon还是可以的,可以满足大部分需求。

思路 & 方法: 使用php编写守护首先要防止内存问题,写WEB逻辑,一个请求处理结束,那么被执行的php脚本所使用内存都会被回收,而后台程序需要一直运行,需要注意内存问题。简单的解决方案是master进程主要负责获取任务,然后分配子进程处理,子进程处理完成结束退出,资源被回收。

运行: 使用nohup或者screen来执行,这样便可以一直后台运行。PS: master进程还需要注意一些异常处理,不然可能会中断退出。

例:

<?php declare(ticks = 1);

$num_of_child = 0;

function sigchld_handler($signo)
{
    global $num_of_child;
    //回收子进程
    while(($pid = pcntl_waitpid(-1, $status, WNOHANG)) > 0) {
        echo "pcntl_waitpid pid: " . $pid . PHP_EOL;
        $num_of_child--;
    }
}

pcntl_signal(SIGCHLD, 'sigchld_handler');

while (true) {
    //获取任务数据(如从db或者redis队列中读取),同时可以根据$num_of_child控制下子进程数量
    echo "parent: number of child is " . $num_of_child . PHP_EOL;
    $job_info = 'hello world';
    sleep(1);
    $pid = pcntl_fork();
    if ($pid > 0) {
        $num_of_child++;
    } else if ($pid == 0) {
        //子进程,做一些任务处理
        sleep(1);
        echo "child: get job \"" . $job_info . "\"" . PHP_EOL;
        exit(0);
    } else {
        echo "pcntl_fork error" . PHP_EOL;
    }
}
?>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn