亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP高級編程實例:編寫守護進程

2024-05-04 23:25:30
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP高級編程實例:編寫守護進程,守護進程是脫離于終端并且在后臺運行的進程,本文講解使用PHP編寫守護進程,并給出了代碼實例,需要的朋友可以參考下
 
 

1.什么是守護進程

守護進程是脫離于終端并且在后臺運行的進程。守護進程脫離于終端是為了避免進程在執行過程中的信息在任何終端上顯示并且進程也不會被任何終端所產生的終端信息所打斷。

例如 apache, nginx, mysql 都是守護進程

2.為什么開發守護進程

很多程序以服務形式存在,他沒有終端或UI交互,它可能采用其他方式與其他程序交互,如TCP/UDP Socket, UNIX Socket, fifo。程序一旦啟動便進入后臺,直到滿足條件他便開始處理任務。

3.何時采用守護進程開發應用程序

以我當前的需求為例,我需要運行一個程序,然后監聽某端口,持續接受服務端發起的數據,然后對數據分析處理,再將結果寫入到數據庫中; 我采用ZeroMQ實現數據收發。

如果我不采用守護進程方式開發該程序,程序一旦運行就會占用當前終端窗框,還有受到當前終端鍵盤輸入影響,有可能程序誤退出。

4.守護進程的安全問題

我們希望程序在非超級用戶運行,這樣一旦由于程序出現漏洞被駭客控制,攻擊者只能繼承運行權限,而無法獲得超級用戶權限。

我們希望程序只能運行一個實例,不運行同事開啟兩個以上的程序,因為會出現端口沖突等等問題。

5.怎樣開發守護進程

例 1. 守護進程例示

<?phpclass ExampleWorker extends Worker { #public function __construct(Logging $logger) { # $this->logger = $logger; #} #protected $logger; protected static $dbh; public function __construct() { } public function run(){  $dbhost = '192.168.2.1';  // 數據庫服務器  $dbport = 3306;   $dbuser = 'www';  // 數據庫用戶名 $dbpass = 'qwer123';    // 數據庫密碼  $dbname = 'example';  // 數據庫名  self::$dbh = new PDO("mysql:host=$dbhost;port=$dbport;dbname=$dbname", $dbuser, $dbpass, array(   /* PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES /'UTF8/'', */   PDO::MYSQL_ATTR_COMPRESS => true,   PDO::ATTR_PERSISTENT => true   )  ); } protected function getInstance(){ return self::$dbh;  }}/* the collectable class implements machinery for Pool::collect */class Fee extends Stackable { public function __construct($msg) {  $trades = explode(",", $msg);  $this->data = $trades;  print_r($trades); } public function run() {  #$this->worker->logger->log("%s executing in Thread #%lu", __CLASS__, $this->worker->getThreadId() );  try {   $dbh = $this->worker->getInstance();      $insert = "INSERT INTO fee(ticket, login, volume, `status`) VALUES(:ticket, :login, :volume,'N')";   $sth = $dbh->prepare($insert);   $sth->bindValue(':ticket', $this->data[0]);   $sth->bindValue(':login', $this->data[1]);   $sth->bindValue(':volume', $this->data[2]);   $sth->execute();   $sth = null;      /* ...... */      $update = "UPDATE fee SET `status` = 'Y' WHERE ticket = :ticket and `status` = 'N'";   $sth = $dbh->prepare($update);   $sth->bindValue(':ticket', $this->data[0]);   $sth->execute();   //echo $sth->queryString;   //$dbh = null;  }  catch(PDOException $e) {   $error = sprintf("%s,%s/n", $mobile, $id );   file_put_contents("mobile_error.log", $error, FILE_APPEND);  } }}class Example { /* config */ const LISTEN = "tcp://192.168.2.15:5555"; const MAXCONN = 100; const pidfile = __CLASS__; const uid = 80; const gid = 80;  protected $pool = NULL; protected $zmq = NULL; public function __construct() {  $this->pidfile = '/var/run/'.self::pidfile.'.pid'; } 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    //pcntl_wait($status); //Protect against Zombie children   exit($pid);  } else {   // we are the child   file_put_contents($this->pidfile, getmypid());   posix_setuid(self::uid);   posix_setgid(self::gid);   return(getmypid());  } } private function start(){  $pid = $this->daemon();  $this->pool = new Pool(self::MAXCONN, /ExampleWorker::class, []);  $this->zmq = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REP);  $this->zmq->bind(self::LISTEN);    /* Loop receiving and echoing back */  while ($message = $this->zmq->recv()) {   //print_r($message);   //if($trades){     $this->pool->submit(new Fee($message));     $this->zmq->send('TRUE');    //}else{   // $this->zmq->send('FALSE');    //}  }  $pool->shutdown();  } private function stop(){  if (file_exists($this->pidfile)) {   $pid = file_get_contents($this->pidfile);   posix_kill($pid, 9);    unlink($this->pidfile);  } } private function help($proc){  printf("%s start | stop | help /n", $proc); } 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{   $this->help($argv[0]);  } }}$cgse = new Example();$cgse->main($argv);

5.1. 程序啟動

下面是程序啟動后進入后臺的代碼

通過進程ID文件來判斷,當前進程狀態,如果進程ID文件存在表示程序在運行中,通過代碼file_exists($this->pidfile)實現,但而后進程被kill需要手工刪除該文件才能運行

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   //pcntl_wait($status); //Protect against Zombie children   exit($pid);  } else {   // we are the child   file_put_contents($this->pidfile, getmypid());   posix_setuid(self::uid);   posix_setgid(self::gid);   return(getmypid());  } }

程序啟動后,父進程會推出,子進程會在后臺運行,子進程權限從root切換到指定用戶,同時將pid寫入進程ID文件。

5.2. 程序停止

程序停止,只需讀取pid文件,然后調用posix_kill($pid, 9); 最后將該文件刪除。

private function stop(){  if (file_exists($this->pidfile)) {   $pid = file_get_contents($this->pidfile);   posix_kill($pid, 9);    unlink($this->pidfile);  } }
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲综合日韩中文字幕v在线| 精品性高朝久久久久久久| 精品五月天久久| 性色av香蕉一区二区| 亚洲最新av网址| 尤物yw午夜国产精品视频明星| 欧美精品九九久久| 美女精品久久久| 成人欧美一区二区三区黑人| 亚洲日本成人女熟在线观看| 俺去啦;欧美日韩| 亚洲国产高清自拍| 亚洲精品在线观看www| 国产精品99久久久久久久久| 久久久www成人免费精品| 日本午夜精品理论片a级appf发布| 亚洲老板91色精品久久| 国产精品视频自在线| 国产欧美日韩综合精品| 国内精品视频久久| 狠狠久久亚洲欧美专区| 国产日本欧美在线观看| 日韩欧美在线免费观看| xxx成人少妇69| 国内精品一区二区三区四区| 成人做爽爽免费视频| 亚洲视频一区二区| 国产精品高清在线| 国产专区精品视频| 久久久午夜视频| 国产欧美日韩精品丝袜高跟鞋| 成人精品网站在线观看| 国产精品久久久久不卡| 亚洲精品日韩av| 欧美日韩成人在线观看| 亚洲成人久久网| 九九久久国产精品| 日韩精品欧美国产精品忘忧草| 91精品免费久久久久久久久| 精品高清一区二区三区| 九九久久精品一区| 在线国产精品视频| 亚洲香蕉成人av网站在线观看| 青青草精品毛片| 欧美一级淫片aaaaaaa视频| 国产精品视频网址| 亚洲精品www久久久| 中文字幕亚洲欧美一区二区三区| 久久久久久久999| 国产精品99蜜臀久久不卡二区| 亚洲bt欧美bt日本bt| 成人啪啪免费看| 欧美色视频日本版| 亚洲一区二区三区乱码aⅴ| 久久精品视频播放| y97精品国产97久久久久久| 久久久女人电视剧免费播放下载| 国产精品久久久久不卡| 国产精品久久二区| 国产精品夜间视频香蕉| 91午夜在线播放| 国产精品久久久久久久久久久不卡| 日韩欧美一区二区三区久久| 日本亚洲欧洲色| www高清在线视频日韩欧美| 欧美片一区二区三区| 国产在线播放不卡| 中国日韩欧美久久久久久久久| 欧美电影免费观看电视剧大全| 久久久久久久久久久久av| 992tv成人免费影院| 日韩人体视频一二区| 精品久久久精品| 国产精品久久久久久影视| 九九热r在线视频精品| 欧美一区三区三区高中清蜜桃| 91成品人片a无限观看| 亚洲国产日韩欧美在线图片| 91精品久久久久久久久久久| 久热精品视频在线| 亚洲欧洲成视频免费观看| 国产精品第1页| 欧美极品在线视频| 欧美日韩在线另类| 欧美午夜精品久久久久久人妖| 久久精品精品电影网| 中文字幕欧美日韩在线| 欧美性videos高清精品| 国产一区二区久久精品| 精品久久久久久久久久久| 国产精品久久一| 亚洲欧美另类中文字幕| 国产精品久久色| 亚洲一区第一页| 亚洲电影免费在线观看| 国产亚洲成av人片在线观看桃| 欧美国产第一页| 欧美日韩一区二区三区在线免费观看| 日韩免费在线免费观看| 最近2019中文字幕一页二页| 国产在线日韩在线| 亚洲免费人成在线视频观看| 国产99在线|中文| 久久精品国产久精国产思思| 国产精品成人免费电影| 萌白酱国产一区二区| 亚洲缚视频在线观看| 亚洲高清色综合| 亚洲成人激情视频| 久久久久久久色| 国产成人在线视频| 国产成人福利夜色影视| 九九热最新视频//这里只有精品| 亚洲乱码av中文一区二区| 亚洲电影第1页| 亚洲精品久久久久中文字幕二区| 日韩免费看的电影电视剧大全| 国产欧美一区二区三区久久| 欧美精品成人在线| 亚洲欧美在线一区| 国产欧美精品va在线观看| 亚洲欧美综合区自拍另类| 97超碰国产精品女人人人爽| www.欧美精品一二三区| 亚洲电影中文字幕| 久久99国产精品久久久久久久久| 久久久久女教师免费一区| 久久久人成影片一区二区三区观看| 亚洲人成欧美中文字幕| 亚洲午夜av久久乱码| 亚洲精品大尺度| 国产综合在线观看视频| 国产精品一区二区电影| 国产精品精品久久久| 亚洲国产天堂网精品网站| 久久手机免费视频| 亚洲成人精品久久| 欧美激情亚洲视频| 亚洲a成v人在线观看| 国产日韩欧美成人| 国产成人精品在线观看| 777777777亚洲妇女| 97久久精品人搡人人玩| 国产成人av网| 国产精品久久久久久久久久久久| 国产精品黄视频| 国产成人精品视频在线观看| 欧美俄罗斯性视频| 国产精品wwwwww| 亚洲视频一区二区| 国产精品jvid在线观看蜜臀| 亚洲精品乱码久久久久久金桔影视| 日日骚av一区| 国产精品久久久久久久久粉嫩av| 久久久久久久激情视频| 91精品国产高清自在线看超| 欧美日韩国产中文精品字幕自在自线| 欧美成人h版在线观看| 欧美综合国产精品久久丁香| 日韩美女视频在线观看| 国产69精品久久久久久| 91精品久久久久久久久久久| 亚洲国产中文字幕在线观看| 在线国产精品视频|