php守護程序

2021-06-09 20:41:44 字數 3528 閱讀 1056

<?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...