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. [代码][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";
}
}
}
