最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP 多進(jìn)程與信號(hào)中斷實(shí)現(xiàn)多任務(wù)常駐內(nèi)存管理實(shí)例方法

 更新時(shí)間:2019年10月04日 10:24:14   作者:藏色散人  
在本篇文章里小編給大家整理的是關(guān)于PHP 多進(jìn)程與信號(hào)中斷實(shí)現(xiàn)多任務(wù)常駐內(nèi)存管理的相關(guān)知識(shí)點(diǎn),有需要的朋友們學(xué)習(xí)下。

本文章基于 pcntl 擴(kuò)展做的多進(jìn)程測(cè)試。

進(jìn)程調(diào)度策略

父子進(jìn)程的調(diào)度由操作系統(tǒng)來負(fù)責(zé),具體先調(diào)度子進(jìn)程還是父進(jìn)程由系統(tǒng)的調(diào)度算法決定,當(dāng)然可以在父進(jìn)程加上延時(shí)或是調(diào)用進(jìn)程回收函數(shù) pcntl_wait 可以先讓子進(jìn)程先運(yùn)行,進(jìn)程回收的目的是釋放進(jìn)程創(chuàng)建時(shí)占用的內(nèi)存空間,防止變成僵尸進(jìn)程。

信號(hào):

信號(hào)稱為軟中斷系統(tǒng)或是叫軟中斷,功能是向進(jìn)程發(fā)送異步事件通知。

信號(hào)編號(hào): 【源碼基于 SIGINT,SIGTERM,SIGUSR1 信號(hào),含義請(qǐng)自行查看 kill 命令手冊(cè),不在描述】

linux 支持 64 個(gè),有一半為實(shí)時(shí)信號(hào),一半為非時(shí)實(shí)信號(hào),這些信號(hào)都有自己的編號(hào)和對(duì)應(yīng)的整數(shù)值。每個(gè)信號(hào)的編號(hào)含義讀者可以參閱 linux 相關(guān)手冊(cè)【man 手冊(cè)看看就知道了】

信號(hào)處理函數(shù):

信號(hào)一般會(huì)綁定相應(yīng)的功能,有的是默認(rèn)動(dòng)作如 SIGKILL,SIGTERM,SIGINT 操作默認(rèn)操作就是干掉進(jìn)程,當(dāng)然我們可以重寫覆蓋掉,就是通過 pcntl_signal 來覆蓋掉。

信號(hào)的概念:與硬件中斷一個(gè)道理,請(qǐng)讀者自行參考本人前面擼過的文章或是查看芯片硬件中斷原理。

信號(hào)的發(fā)送:

kill 信號(hào)編號(hào) 進(jìn)程 或是按鍵產(chǎn)品的中斷信號(hào)或是在源碼里可以使用 posix_kill 等函數(shù)。

進(jìn)程是相互隔離的,擁有自己的堆??臻g,除了一些公用的正文【代碼區(qū)】,同時(shí)也有自己的可執(zhí)行代碼,進(jìn)程運(yùn)行時(shí),將占用 cpu 的資源,其它進(jìn)程將無權(quán)運(yùn)行,此時(shí)其它進(jìn)程將為阻塞狀態(tài)【比如前面擼過的 tcp 服務(wù)】,當(dāng)進(jìn)程運(yùn)行結(jié)束后【運(yùn)行到代碼的最后一句或是遇到 return 或是遇到 exit 退出進(jìn)程函數(shù)或是遇到信號(hào)事件時(shí)將會(huì)退出】讓出權(quán)限并釋放掉內(nèi)存,其它進(jìn)程就有機(jī)會(huì)運(yùn)行了。

進(jìn)程擁有的自己進(jìn)程描述符,其中比較常用的是進(jìn)程號(hào) PID,進(jìn)程運(yùn)行時(shí)會(huì)在系統(tǒng) /proc/PID 下生成相應(yīng)的進(jìn)程文件,用戶可以自行查看。

每個(gè)進(jìn)程都擁有所屬的進(jìn)程組【進(jìn)程的集合】,多個(gè)進(jìn)程組集合則是一個(gè)會(huì)話,創(chuàng)建一個(gè)會(huì)話是通過一個(gè)進(jìn)程進(jìn)行創(chuàng)建的,并且此進(jìn)程不可以為組長(zhǎng)進(jìn)程,此進(jìn)程將成為會(huì)話期的會(huì)話首進(jìn)程,也會(huì)成為進(jìn)程組的進(jìn)程組長(zhǎng),同時(shí)將會(huì)脫離控制終端,即使之前的進(jìn)程綁定了控制終端也會(huì)脫離【守護(hù)進(jìn)程的創(chuàng)建】。

文件描述權(quán)限掩碼【權(quán)限屏蔽字】:

umask () 你可以在 linux 運(yùn)行這個(gè)命令,然后創(chuàng)建文件,并查看它的權(quán)限【如果你跑完啥也沒有發(fā)現(xiàn),說明你還是訓(xùn)練不夠 ^_^】

<?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("服務(wù)未運(yùn)行\(zhòng)n");

  }

 }

 function setMasterPid()

 {

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

  @fwrite($fp,posix_getpid());

  @fclose($fp);

 }

 function daemon()

 {

  $pid = pcntl_fork();

  if ($pid<0){

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

  }else if ($pid >0){

   exit(0);

  }else{

   umask(0);

   $sid = posix_setsid();

   if ($sid<0){

    exit("創(chuàng)建會(huì)話失敗\n");

   }

   $pid = pcntl_fork();

   if ($pid<0){

    exit("進(jìn)程創(chuàng)建失敗\n");

   }else if ($pid >0){

    exit(0);

   }

   //可以關(guān)閉標(biāo)準(zhǔn)輸入輸出錯(cuò)誤文件描述符【守護(hù)進(jìn)程不需要】

  }

 }

 function worker()

 {

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

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

   $pid = pcntl_fork();

   if ($pid<0){

    exit("工作進(jìn)程創(chuàng)建失敗\n");

   }else if ($pid==0){

    /***************子進(jìn)程工作范圍**********************/

    //給子進(jìn)程安裝信號(hào)處理程序

    $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);//子進(jìn)程運(yùn)行完成后退出

    /***************子進(jìn)程工作范圍**********************/

   }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()."接受了父進(jìn)程發(fā)來的自定義信號(hào)\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:

    //主進(jìn)程接受到中斷信號(hào)ctrl+c

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

     posix_kill($pid,SIGINT);//向所有的子進(jìn)程發(fā)出

    }

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

    break;

   case SIGTERM://ctrl+z

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

     posix_kill($pid,SIGKILL);//向所有的子進(jìn)程發(fā)出

    }

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

    break;

   case SIGUSR1://用戶自定義信號(hào)

    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 多進(jìn)程與信號(hào)中斷實(shí)現(xiàn)多任務(wù)常駐內(nèi)存管理【Master/Worker 模型】的詳細(xì)內(nèi)容,感謝大家的學(xué)習(xí)和對(duì)腳本之家的支持。

相關(guān)文章

  • PHP使用文件鎖解決高并發(fā)問題示例

    PHP使用文件鎖解決高并發(fā)問題示例

    這篇文章主要介紹了PHP使用文件鎖解決高并發(fā)問題,結(jié)合實(shí)例形式分析了php阻塞模式與非阻塞模式文件鎖解決高并發(fā)的相關(guān)使用技巧,需要的朋友可以參考下
    2018-03-03
  • php mssql 時(shí)間格式問題

    php mssql 時(shí)間格式問題

    mssql默認(rèn)以系統(tǒng)時(shí)間格式輸出,你可以調(diào)整系統(tǒng)的時(shí)間格式來解決
    2009-01-01
  • php 多線程上下文中安全寫文件實(shí)現(xiàn)代碼

    php 多線程上下文中安全寫文件實(shí)現(xiàn)代碼

    提供一個(gè)php多線程上下文中安全寫文件的實(shí)現(xiàn)方法。這個(gè)實(shí)現(xiàn)沒有使用php 的file lock機(jī)制,使用的是臨時(shí)文件機(jī)制。多線程中的各個(gè)線程都是對(duì)各自(每個(gè)線程獨(dú)占一個(gè))的臨時(shí)文件寫,然后再同步到原文件中。
    2009-12-12
  • PHP如何使用array_unshift()在數(shù)組開頭插入元素

    PHP如何使用array_unshift()在數(shù)組開頭插入元素

    這篇文章主要介紹了PHP如何使用array_unshift()在數(shù)組開頭插入元素,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • PHP中cookie知識(shí)點(diǎn)學(xué)習(xí)

    PHP中cookie知識(shí)點(diǎn)學(xué)習(xí)

    我們給大家總結(jié)了PHP中cookie的詳細(xì)用法以及重要知識(shí)點(diǎn),對(duì)此有興趣的朋友可以參考學(xué)習(xí)下。
    2018-05-05
  • 分享php多功能圖片處理類

    分享php多功能圖片處理類

    這篇文章主要為大家分享php多功能圖片處理類,方便大家進(jìn)行學(xué)習(xí)研究,感興趣的小伙伴們可以參考一下
    2016-05-05
  • PHP7下協(xié)程的實(shí)現(xiàn)方法詳解

    PHP7下協(xié)程的實(shí)現(xiàn)方法詳解

    最近在學(xué)習(xí)中遇到了協(xié)程,發(fā)現(xiàn)這類文章介紹的較少,所以下面這篇文章主要給大家介紹了關(guān)于PHP7下協(xié)程的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • ucenter中詞語過濾原理分析

    ucenter中詞語過濾原理分析

    這篇文章主要介紹了ucenter中詞語過濾原理,結(jié)合實(shí)例形式分析了ucenter中詞語的相關(guān)sql字段定義與過濾功能的實(shí)現(xiàn)方法,涉及php正則替換及字符串與數(shù)組的相關(guān)操作技巧,需要的朋友可以參考下
    2016-07-07
  • PHP實(shí)現(xiàn)創(chuàng)建一個(gè)RPC服務(wù)操作示例

    PHP實(shí)現(xiàn)創(chuàng)建一個(gè)RPC服務(wù)操作示例

    這篇文章主要介紹了PHP實(shí)現(xiàn)創(chuàng)建一個(gè)RPC服務(wù)操作,結(jié)合實(shí)例形式分析了PHP基于socket擴(kuò)展通信實(shí)現(xiàn)的RPC遠(yuǎn)程調(diào)用相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • 利用PHP_XLSXWriter代替PHPExcel的方法示例

    利用PHP_XLSXWriter代替PHPExcel的方法示例

    PHPExcel是一個(gè)處理Excel,CVS文件的開源框架,但不幸的是PHPExcel官方已不再維護(hù)了這個(gè)項(xiàng)目了,官方團(tuán)隊(duì)在github上又起了一個(gè)新項(xiàng)目,叫PhpSpreadsheet。那么這篇文章主要給大家介紹了關(guān)于利用PHP_XLSXWriter代替PHPExcel的方法示例,需要的朋友可以參考下。
    2017-07-07

最新評(píng)論

岳西县| 洪江市| 泗水县| 繁昌县| 繁昌县| 松潘县| 重庆市| 永修县| 田林县| 永修县| 太仆寺旗| 阳山县| 石棉县| 马山县| 大邑县| 灵璧县| 张北县| 永康市| 永仁县| 漾濞| 沂南县| 即墨市| 荔浦县| 惠水县| 岳普湖县| 利川市| 平舆县| 南江县| 阿坝县| 诸城市| 河南省| 克拉玛依市| 本溪| 西乡县| 柞水县| 东明县| 拉萨市| 泰顺县| 莆田市| 教育| 德格县|