校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > PHP 多進程與信號中斷實現多任務常駐內存管理實例方法

PHP 多進程與信號中斷實現多任務常駐內存管理實例方法

熱門標簽:智能電話機器人好公司門薩維 青白江地圖標注 AI電話機器人OEM貼牌 辦理重慶400電話 江蘇電商外呼系統運營商 沛縣400電話辦理 德陽中江如何申請400開頭電話 聊城電話外呼系統公司 銅川電話機器人價格

本文章基于 pcntl 擴展做的多進程測試。

進程調度策略

父子進程的調度由操作系統來負責,具體先調度子進程還是父進程由系統的調度算法決定,當然可以在父進程加上延時或是調用進程回收函數 pcntl_wait 可以先讓子進程先運行,進程回收的目的是釋放進程創建時占用的內存空間,防止變成僵尸進程。

信號:

信號稱為軟中斷系統或是叫軟中斷,功能是向進程發送異步事件通知。

信號編號: 【源碼基于 SIGINT,SIGTERM,SIGUSR1 信號,含義請自行查看 kill 命令手冊,不在描述】

linux 支持 64 個,有一半為實時信號,一半為非時實信號,這些信號都有自己的編號和對應的整數值。每個信號的編號含義讀者可以參閱 linux 相關手冊【man 手冊看看就知道了】

信號處理函數:

信號一般會綁定相應的功能,有的是默認動作如 SIGKILL,SIGTERM,SIGINT 操作默認操作就是干掉進程,當然我們可以重寫覆蓋掉,就是通過 pcntl_signal 來覆蓋掉。

信號的概念:與硬件中斷一個道理,請讀者自行參考本人前面擼過的文章或是查看芯片硬件中斷原理。

信號的發送:

kill 信號編號 進程 或是按鍵產品的中斷信號或是在源碼里可以使用 posix_kill 等函數。

進程是相互隔離的,擁有自己的堆棧空間,除了一些公用的正文【代碼區】,同時也有自己的可執行代碼,進程運行時,將占用 cpu 的資源,其它進程將無權運行,此時其它進程將為阻塞狀態【比如前面擼過的 tcp 服務】,當進程運行結束后【運行到代碼的最后一句或是遇到 return 或是遇到 exit 退出進程函數或是遇到信號事件時將會退出】讓出權限并釋放掉內存,其它進程就有機會運行了。

進程擁有的自己進程描述符,其中比較常用的是進程號 PID,進程運行時會在系統 /proc/PID 下生成相應的進程文件,用戶可以自行查看。

每個進程都擁有所屬的進程組【進程的集合】,多個進程組集合則是一個會話,創建一個會話是通過一個進程進行創建的,并且此進程不可以為組長進程,此進程將成為會話期的會話首進程,也會成為進程組的進程組長,同時將會脫離控制終端,即使之前的進程綁定了控制終端也會脫離【守護進程的創建】。

文件描述權限掩碼【權限屏蔽字】:

umask () 你可以在 linux 運行這個命令,然后創建文件,并查看它的權限【如果你跑完啥也沒有發現,說明你還是訓練不夠 ^_^】

?php

/**

 * Created by PhpStorm.

 * User: 1655664358@qq.com

 * Date: 2018/3/26

 * Time: 14:19

 */

namespace Chen\Worker;

class Server

{

 public $workerPids = [];

 public $workerJob = [];

 public $master_pid_file = "master_pid";

 public $state_file = "state_file.txt";

 function run()

 {

  $this->daemon();

  $this->worker();

  $this->setMasterPid();

  $this->installSignal();

  $this->showState();

  $this->wait();

 }

 function wait()

 {

  while (1){

   pcntl_signal_dispatch();

   $pid = pcntl_wait($status);

   if ($pid>0){

    unset($this->workerPids[$pid]);

   }else{

    if (count($this->workerPids)==0){

     exit();

    }

   }

   usleep(100000);

  }

 }

 function showState()

 {

  $state = "\nMaster 信息\n";

  $state.=str_pad("master pid",25);

  $state.=str_pad("worker num",25);

  $state.=str_pad("job pid list",10)."\n";

  $state.=str_pad($this->getMasterPid(),25);

  $state.=str_pad(count($this->workerPids),25);

  $state.=str_pad(implode(",",array_keys($this->workerPids)),10);

  echo $state.PHP_EOL;

 }

 function getMasterPid()

 {

  if (file_exists($this->master_pid_file)){

   return file_get_contents($this->master_pid_file);

  }else{

   exit("服務未運行\n");

  }

 }

 function setMasterPid()

 {

  $fp = fopen($this->master_pid_file,"w");

  @fwrite($fp,posix_getpid());

  @fclose($fp);

 }

 function daemon()

 {

  $pid = pcntl_fork();

  if ($pid0){

   exit("fork進程失敗\n");

  }else if ($pid >0){

   exit(0);

  }else{

   umask(0);

   $sid = posix_setsid();

   if ($sid0){

    exit("創建會話失敗\n");

   }

   $pid = pcntl_fork();

   if ($pid0){

    exit("進程創建失敗\n");

   }else if ($pid >0){

    exit(0);

   }

   //可以關閉標準輸入輸出錯誤文件描述符【守護進程不需要】

  }

 }

 function worker()

 {

  if (count($this->workerJob)==0)exit("沒有工作任務\n");

  foreach($this->workerJob as $job){

   $pid = pcntl_fork();

   if ($pid0){

    exit("工作進程創建失敗\n");

   }else if ($pid==0){

    /***************子進程工作范圍**********************/

    //給子進程安裝信號處理程序

    $this->workerInstallSignal();

    $start_time = time();

    while (1){

     pcntl_signal_dispatch();

     if ((time()-$start_time)>=$job->job_run_time){

      break;

     }

     $job->run(posix_getpid());

    }

    exit(0);//子進程運行完成后退出

    /***************子進程工作范圍**********************/

   }else{

    $this->workerPids[$pid] = $job;

   }

  }

 }

 function workerInstallSignal()

 {

  pcntl_signal(SIGUSR1,[__CLASS__,'workerHandleSignal'],false);

 }

 function workerHandleSignal($signal)

 {

  switch ($signal){

   case SIGUSR1:

    $state = "worker pid=".posix_getpid()."接受了父進程發來的自定義信號\n";

    file_put_contents($this->state_file,$state,FILE_APPEND);

    break;

  }

 }

 function installSignal()

 {

  pcntl_signal(SIGINT,[__CLASS__,'handleMasterSignal'],false);

  pcntl_signal(SIGTERM,[__CLASS__,'handleMasterSignal'],false);

  pcntl_signal(SIGUSR1,[__CLASS__,'handleMasterSignal'],false);

 }

 function handleMasterSignal($signal)

 {

  switch ($signal){

   case SIGINT:

    //主進程接受到中斷信號ctrl+c

    foreach ($this->workerPids as $pid=>$worker){

     posix_kill($pid,SIGINT);//向所有的子進程發出

    }

    exit("服務平滑停止\n");

    break;

   case SIGTERM://ctrl+z

    foreach ($this->workerPids as $pid=>$worker){

     posix_kill($pid,SIGKILL);//向所有的子進程發出

    }

    exit("服務停止\n");

    break;

   case SIGUSR1://用戶自定義信號

    if (file_exists($this->state_file)){

     unlink($this->state_file);

    }

    foreach ($this->workerPids as $pid=>$worker){

     posix_kill($pid,SIGUSR1);

    }

    $state = "master pid\n".$this->getMasterPid()."\n";

    while(!file_exists($this->state_file)){

     sleep(1);

    }

    $state.= file_get_contents($this->state_file);

    echo $state.PHP_EOL;

    break;

  }

 }

} 

?php

/**\


 * Created by PhpStorm.\ * User: 1655664358@qq.com

 * Date: 2018/3/26\ * Time: 14:37\ */\namespace Chen\Worker;

class Job

{

 public $job_run_time = 3600;

 function run($pid)

 {\sleep(3);

 echo "worker pid = $pid job 沒事干,就在這里job\n";

 }

} 

?php

/**

 * Created by PhpStorm.\ * User: 1655664358@qq.com

 * Date: 2018/3/26\ * Time: 14:37\ */\namespace Chen\Worker;

class Talk

{

 public $job_run_time = 3600;

 function run($pid)

 {\sleep(3);

 echo "worker pid = $pid job 沒事干,就在這里talk\n";

 }

}

?php

/**

 * Created by PhpStorm.\ * User: 1655664358@qq.com

 * Date: 2018/3/26\ * Time: 15:45\ */

require_once 'vendor/autoload.php';

$process = new \Chen\Worker\Server();

$process->workerJob = [new \Chen\Worker\Talk(),new \Chen\Worker\Job()];

$process->run();

以上就是PHP 多進程與信號中斷實現多任務常駐內存管理【Master/Worker 模型】的詳細內容,感謝大家的學習和對腳本之家的支持。

您可能感興趣的文章:
  • php多進程中的阻塞與非阻塞操作實例分析
  • php多進程并發編程防止出現僵尸進程的方法分析
  • php 的多進程操作實踐案例分析
  • php 多進程編程父進程的阻塞與非阻塞實例分析
  • php實現的簡單多進程服務器類完整示例
  • PHP多進程簡單實例小結
  • php swoole多進程/多線程用法示例【基于php7nts版】
  • PHP基于swoole多進程操作示例
  • 詳解PHP多進程消費隊列

標簽:山南 南寧 三亞 濟寧 鷹潭 赤峰 迪慶 烏魯木齊

巨人網絡通訊聲明:本文標題《PHP 多進程與信號中斷實現多任務常駐內存管理實例方法》,本文關鍵詞  PHP,多,進程,與,信號,中斷,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP 多進程與信號中斷實現多任務常駐內存管理實例方法》相關的同類信息!
  • 本頁收集關于PHP 多進程與信號中斷實現多任務常駐內存管理實例方法的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美综合欧美视频| 风流少妇一区二区| 欧美日韩精品一区视频| 1024亚洲合集| 菠萝蜜视频在线观看一区| 欧美激情综合网| 国产在线观看免费一区| 欧美成人性战久久| 蜜臀久久99精品久久久久久9| 欧美肥胖老妇做爰| 日韩不卡手机在线v区| 欧美男人的天堂一二区| 五月天网站亚洲| 欧美精品日韩综合在线| 2021久久国产精品不只是精品| 欧美日韩三级一区| 亚洲国产aⅴ天堂久久| 欧美日韩免费电影| 日韩精品视频网| 欧美一区二区免费| 久久精品国产99| 久久综合久久综合久久| 国产成人综合在线观看| 国产精品丝袜在线| 91无套直看片红桃| 夜夜嗨av一区二区三区中文字幕 | 亚洲成人动漫在线观看| 欧美日韩精品一二三区| 日产精品久久久久久久性色 | 色婷婷综合五月| 亚洲一级不卡视频| 制服丝袜亚洲精品中文字幕| 蜜臀va亚洲va欧美va天堂| 精品噜噜噜噜久久久久久久久试看 | 国产成人av电影免费在线观看| 国产午夜一区二区三区| av亚洲产国偷v产偷v自拍| 亚洲激情图片qvod| 3atv一区二区三区| 韩国v欧美v亚洲v日本v| 国产目拍亚洲精品99久久精品| 91麻豆蜜桃一区二区三区| 亚洲国产一区二区在线播放| 欧美一级高清大全免费观看| 国产一区不卡在线| 亚洲欧洲国产日本综合| 欧美日韩一区二区三区视频| 久久精品久久精品| 中文字幕的久久| 欧美性大战久久| 精品一区二区三区在线观看| 国产精品美女久久久久久2018| 欧洲国内综合视频| 久国产精品韩国三级视频| 欧美激情综合网| 欧美日韩成人在线| 国产在线日韩欧美| 亚洲欧美日韩电影| 日韩三级电影网址| 成人激情免费视频| 水蜜桃久久夜色精品一区的特点| 2021久久国产精品不只是精品| 91免费看`日韩一区二区| 91精品国产手机| 麻豆91在线观看| 中文字幕一区二区三区乱码在线| 欧美日韩一区在线观看| 久久99国产精品久久99果冻传媒| 亚洲日本一区二区三区| 日韩免费观看高清完整版在线观看| 成人动漫av在线| 婷婷夜色潮精品综合在线| 国产欧美日产一区| 欧美精品一二三区| 99久久国产免费看| 久久国产人妖系列| 一区二区三区 在线观看视频 | 91丝袜国产在线播放| 奇米色一区二区| 亚洲色图在线播放| 久久综合久久综合久久| 欧美日韩国产精选| 成人av手机在线观看| 看电影不卡的网站| 亚洲午夜羞羞片| 国产精品女同互慰在线看| 日韩欧美一区二区久久婷婷| 91免费国产在线观看| 国产成人自拍网| 免费欧美高清视频| 一区二区在线观看视频| 日本一区二区在线不卡| 欧美一区二区三区四区视频| 91麻豆免费观看| 顶级嫩模精品视频在线看| 美女一区二区三区| 亚洲一区二区免费视频| 国产精品国产馆在线真实露脸| 日韩欧美在线网站| 欧美体内she精视频| av电影在线观看一区| 国产一区二区三区精品视频| 日韩精品欧美成人高清一区二区| 亚洲日本在线a| 国产精品色婷婷久久58| 久久影院视频免费| 欧美一区二区免费| 欧美日韩精品是欧美日韩精品| 91亚洲国产成人精品一区二三| 国产成人综合精品三级| 久久99精品国产91久久来源| 婷婷久久综合九色国产成人| 亚洲欧美色图小说| 国产精品久久久久久久久久久免费看 | 亚洲不卡在线观看| 中文字幕免费一区| 久久夜色精品国产噜噜av| 91精品国产综合久久久久久| 欧美在线看片a免费观看| 97se亚洲国产综合自在线| 成人综合在线观看| 国产酒店精品激情| 国内国产精品久久| 久久99精品国产麻豆婷婷洗澡| 日韩精品成人一区二区三区| 香蕉久久一区二区不卡无毒影院| 一区二区三区四区中文字幕| 亚洲欧洲综合另类| 亚洲日本青草视频在线怡红院| 国产精品三级视频| 最近中文字幕一区二区三区| 国产精品国产三级国产三级人妇| 亚洲国产成人午夜在线一区| 日本一区二区三区在线不卡| 国产欧美一区二区精品忘忧草| 久久久久9999亚洲精品| 久久久噜噜噜久噜久久综合| 国产午夜精品福利| 国产欧美日本一区视频| 日本一区二区高清| 中文字幕一区二区不卡| 亚洲视频中文字幕| 亚洲精品视频一区| 亚洲国产成人高清精品| 亚洲gay无套男同| 日韩激情视频在线观看| 免费在线观看精品| 久久精品国产网站| 国产精品亚洲一区二区三区在线| 国产精品亚洲专一区二区三区| 成人精品国产免费网站| 一本色道久久综合狠狠躁的推荐| 色综合久久久网| 欧美日韩中字一区| 欧美一级二级在线观看| 久久蜜桃av一区精品变态类天堂| 国产网站一区二区| 亚洲色图.com| 香蕉影视欧美成人| 国产综合色视频| 波多野结衣一区二区三区| 色94色欧美sute亚洲线路一ni| 欧美视频一区二区三区四区 | 亚洲激情一二三区| 婷婷综合另类小说色区| 久久成人av少妇免费| 国产高清不卡二三区| 91视频观看视频| 欧美精品第1页| 久久久亚洲高清| 亚洲另类中文字| 日本欧美肥老太交大片| 国产一区二区三区在线观看免费| 成人黄色片在线观看| 成人黄色片在线观看| 久久99国产乱子伦精品免费| 成人综合婷婷国产精品久久免费| 色一情一伦一子一伦一区| 日韩一区二区在线观看| 国产日产欧美精品一区二区三区| 亚洲乱码一区二区三区在线观看| 欧美aaaaa成人免费观看视频| 国产电影一区二区三区| 欧美日韩在线播放| 国产亚洲欧美日韩在线一区| 亚洲精品福利视频网站| 久久精品久久99精品久久| 99精品视频在线观看| 91精品国产综合久久蜜臀| 久久精品综合网| 亚洲第一二三四区| 国产成人在线观看| 欧美日韩精品欧美日韩精品一 | 99精品视频在线免费观看| 欧美一卡二卡三卡四卡| 国产精品国产三级国产aⅴ入口| 日韩国产高清在线| av亚洲精华国产精华| 日韩欧美国产wwwww| 亚洲欧美成人一区二区三区|