当前位置 : 主页 > 网络编程 > PHP >

php守护进程带start/stop/restart/stat功能

来源:互联网 收集:自由互联 发布时间:2021-06-30
php守护进程带start/stop/restart/stat功能 1. [代码] [PHP]代码 ?php/** * User: * Date: 15-7-19 * Time: 下午3:41 */ini_set('default_socket_timeout', -1);/** * Class Demon */class Demon { /* config */ /** * */ const HOST = '127.0.0
php守护进程带start/stop/restart/stat功能

1. [代码][PHP]代码    

<?php
/**
 * User:
 * Date: 15-7-19
 * Time: 下午3:41
 */
ini_set('default_socket_timeout', -1);
/**
 * Class Demon
 */
class Demon {
    /* config */
    /**
     *
     */
    const HOST = '127.0.0.1';
    /**
     *
     */
    const PROCESS_NAME = 'php_task';
    /**
     *
     */
    const PORT = 6379;
    /**
     *
     */
    const MAXCONN = 2048;
    /**
     *
     */
    const PIDNAME = __CLASS__;
    /**
     *
     */
    const uid = 80;
    /**
     *
     */
    const gid = 80;
    /**
     * @var null
     */
    protected $pool = NULL;
    public $pidfile;
    public $stop = false;
    /**
     * Demon constructor.
     */
    public function __construct() {
        $this->pidfile = __DIR__ . '/' . self::PIDNAME . '.pid';
    }
    /**
     * @return int
     */
    private function daemon() {
        if (file_exists($this->pidfile)) {
            echo "The file $this->pidfile exists.\n";
            exit();
        }
        $pid = pcntl_fork();
        if ($pid == -1) {
            die('could not fork');
        } else if ($pid) {
            // we are the parent
            exit($pid);
        } else {
            // we are the child
            file_put_contents($this->pidfile, getmypid());
            posix_setuid(self::uid);
            posix_setgid(self::gid);
            cli_set_process_title(self::PROCESS_NAME);
            pcntl_signal(SIGHUP, [$this, 'signoH']);
            pcntl_signal(SIGTERM, [$this, 'signoH']);
            pcntl_signal(SIGCHLD, [$this, 'signoH']);
            pcntl_signal(SIGQUIT, [$this, 'signoH']);
            pcntl_signal(SIGINT, [$this, 'signoH']);
            pcntl_signal(SIGUSR1, [$this, 'signoH']);
            return (getmypid());
        }
    }
    /**
     *
     */
    private function run() {
        do {
            pcntl_signal_dispatch();
            if ($this->stop) {
                break;
            }
            echo "I am alive" . mt_rand(0,20) . "...\n";
            sleep(5);
        } while (true);
        echo ("进程退出\n");
    }
    public function restart() {
        $this->stop();
        $this->start();
        print "重启成功!\n";
    }
    /**
     *
     */
    private function start() {
        $pid = $this->daemon();
        $this->run();
    }
    /**
     *
     */
    private function stop() {
        if (file_exists($this->pidfile)) {
            $pid = file_get_contents($this->pidfile);
            posix_kill($pid, SIGKILL);
            unlink($this->pidfile);
        }
    }
    /**
     * @param $proc
     */
    private function help($proc) {
        printf("%s start | stop | restart | stat | help \n", $proc);
    }
    /**
     * @param $argv
     */
    public function main($argv) {
        if (count($argv) < 2) {
            printf("please input help parameter\n");
            exit();
        }
        if ($argv[1] === 'stop') {
            $this->stop();
        } else if ($argv[1] === 'start') {
            $this->start();
        } else if ($argv[1] === 'restart') {
            $this->restart();
        } else if ($argv[1] === 'stat') {
            if (is_file($this->pidfile)) {
                posix_kill(file_get_contents($this->pidfile), SIGHUP);
            } else {
                print "\n_______程序没有启动________\n";
            }
        } else {
            $this->help("command list :");
        }
    }
    /**
     * @param $instance
     * @param $channelName
     * @param $message
     */
    public function handle($instance, $channelName, $message) {
        file_put_contents(__DIR__ . "/$channelName.txt", $message . "\n", FILE_APPEND);
    }
    /**
     * @param $signo
     */
    public function signoH($signo) {
        switch ($signo) {
            case SIGHUP :
                print "\n___________运行状态___________\n";
                print "HOST :" . self::HOST . "\n";
                print "PORT :" . self::PORT . "\n";
                print "NAME : " . self::PROCESS_NAME . "\n";
                print "PID : " . file_get_contents($this->pidfile) . "\n";
                print "________________________________\n";
                break;
            case SIGTERM:
                posix_kill(file_get_contents($this->pidfile), 9);
                break;
            default :
                print "\n________________________________\n";
                print "呀!~有人想杀掉我!\n";
                print "________________________________\n";
        }
    }
}
网友评论