<?php
class daemon
/*** 啟動程序
** @return bool
*/public function main()
$this->_logmessage('running...');
$this->_isrunning = true;
while ($this->_isrunning)
return true;
}/**
* 停止程序
** @return void
*/public function stop()
/*** do task
** @return void
*/protected function _dotask()
/*** _logmessage
* 記錄日誌
** @param string 訊息
* @param integer 級別
* @return void
*/protected function _logmessage($msg, $level = self::dlog_notice)
/*** daemonize
** several rules or characteristics that most daemons possess:
* 1) check is daemon already running
* 2) fork child process
* 3) sets identity
* 4) make current process a session laeder
* 5) write process id to file
* 6) change home path
* 7) umask(0)
** @access private
* @since 1.0
* @return void
*/private function _daemonize()
if (!$this->_fork())
if (!$this->_setidentity() && $this->requiresetidentity)
if (!posix_setsid())
if (!$fp = fopen($this->pidfilelocation, 'w')) else
// 寫入監控日誌
$this->writeprocess();
chdir($this->homepath);
umask(0);
declare(ticks = 1);
pcntl_signal(sigchld, array(&$this, 'sighandler'));
pcntl_signal(sigterm, array(&$this, 'sighandler'));
pcntl_signal(sigusr1, array(&$this, 'sighandler'));
pcntl_signal(sigusr2, array(&$this, 'sighandler'));
return true;
}/**
* cheks is daemon already running
** @return bool
*/private function _isdaemonrunning()
else
}/**
* forks process
** @return bool
*/private function _fork() elseif ($pid) else
}/**
* sets identity of a daemon and returns result
** @return bool
*/private function _setidentity()
else
}/**
* signals handler
** @access public
* @since 1.0
* @return void
*/public function sighandler($signo)
}/**
* signals handler: usr1
* 主要用於定時清理每個程序裡被快取的網域名稱dns解析記錄
** @return void
*/protected function _sighandleruser1()
/*** signals handler: usr2
* 用於寫入心跳包檔案
** @return void
*/protected function _sighandleruser2()
/*** releases daemon pid file
* this method is called on exit (destructor like)
** @return void
*/public function releasedaemon()
}/**
* writeprocess
* 將當前程序資訊寫入監控日誌,另外的指令碼會掃瞄監控日誌的資料傳送訊號,如果沒有響應則重啟程序
** @return void
*/public function writeprocess()
// 查詢重複的程序記錄
$pdirobject = dir($this->processlocation);
while ($pdirobject && (($pid = $pdirobject->read()) !== false))
$pdir = $this->processlocation . '/' . $pid;
$pcmdfile = $pdir . '/cmd';
$ppwdfile = $pdir . '/pwd';
$pheartfile = $pdir . '/heart';
// 根據cmd檢查啟動相同引數的程序
if (is_file($pcmdfile) && trim(file_get_contents($pcmdfile)) == $command)
}// 新程序目錄
if (!is_dir($processdir))
// 寫入命令引數
file_put_contents($processcmdfile, $command);
file_put_contents($processpwdfile, $_server['pwd']);
// 寫檔案有快取
usleep(1000);
return true;
}/**
* _initprocesslocation
* 初始化
** @return void
*/protected function _initprocesslocation()
}
PHP守護程序
php也是可以直接進行守護程序的啟動與終止的,相對於shell來說會簡單很多,理解更方便,當然了php的守護程序要實現自動重啟還是要依賴於shell的crontab日程表,每隔一段時間去執行一次指令碼看指令碼是否需要重啟,如果需要則殺掉程序刪除runfile檔案,重新啟動並在runfile檔案中寫入...
PHP守護程序化
乙個守護程序通常補認為是乙個不對終端進行控制的後台任務。它有三個很顯著的特徵 在後台執行,與啟動他的程序脫離,無須控制終端。常用的實現方式是fork setsid fork 在glibc裡有乙個函式daemon。呼叫此函式,就可使當前程序脫離終端變成乙個守護程序,具體內容參見man daemon。p...
PHP守護程序化
什麼是守護程序?乙個守護程序通常補認為是乙個不對終端進行控制的後台任務。它有三個很顯著的特徵 在後台執行,與啟動他的程序脫離,無須控制終端。常用的實現方式是fork setsid fork 根據 語言的實現思路即可。因為需要關閉 標準io,所以這裡使用redis方便測試。php 實現守護程序 fun...