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

首頁 > 開發 > PHP > 正文

php開啟多進程的方法

2024-05-04 23:31:47
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了php開啟多進程的方法,實例分析了php線程的使用技巧,需要的朋友可以參考下
 

本文實例講述了php開啟多進程的方法。分享給大家供大家參考。具體實現方法如下:

 

復制代碼代碼如下:

<?php 
 $IP='192.168.1.1';//Windows電腦的IP
 $Port='5900';        //VNC使用的Port
 $ServerPort='9999';//Linux Server對外使用的Port
 $RemoteSocket=false;//連線到VNC的Socket
 function SignalFunction($Signal){
  //這是主Process的訊息處理函數
 global $PID;//Child Process的PID
 switch ($Signal)
 {
  case SIGTRAP:
  case SIGTERM:
   //收到結束程式的Signal
   if($PID)
   {
    //送一個SIGTERM的訊號給Child告訴他趕快結束掉嘍
    posix_kill($PID,SIGTERM);
    //等待Child Process結束,避免zombie
    pcntl_wait($Status);
   }
   //關閉主Process開啟的Socket
   DestroySocket();
   exit(0); //結束主Process
   break;
  case SIGCHLD:
   /*
當Child Process結束掉時,Child會送一個SIGCHLD訊號給Parrent
當Parrent收到SIGCHLD,就知道Child Process已經結束嘍 ,該做一些
結束的動作*/
   unset($PID); //將$PID清空,表示Child Process已經結束
   pcntl_wait($Status); //避免Zombie
   break;
  default:
 }
 }
 function ChildSignalFunction($Signal){
//這是Child Process的訊息處理函數
 switch ($Signal)
 {
  case SIGTRAP:
  case SIGTERM:
//Child Process收到結束的訊息
   DestroySocket(); //關閉Socket
   exit(0); //結束Child Process
  default:
 }
 }
 function ProcessSocket($ConnectedServerSocket){
 //Child Process Socket處理函數
 //$ConnectedServerSocket -> 外部連進來的Socket
 global $ServerSocket,$RemoteSocket,$IP,$Port;
 $ServerSocket=$ConnectedServerSocket;
 declare(ticks = 1); //這一行一定要加,不然沒辦法設定訊息處理函數。
//設定訊息處理函數
 if(!pcntl_signal(SIGTERM, "ChildSignalFunction")) return;
 if(!pcntl_signal(SIGTRAP, "ChildSignalFunction")) return;
//建立一個連線到VNC的Socket
 $RemoteSocket=socket_create(AF_INET, SOCK_STREAM,SOL_TCP);
//連線到內部的VNC
 @$RemoteConnected=socket_connect($RemoteSocket,$IP,$Port);
 if(!$RemoteConnected) return; //無法連線到VNC 結束
//將Socket的處理設為Nonblock,避免程式被Block住
 if(!socket_set_nonblock($RemoteSocket)) return;
 if(!socket_set_nonblock($ServerSocket)) return;
 while(true)
 {
//這邊我們採用pooling的方式去取得資料
  $NoRecvData=false;   //這個變數用來判別外部的連線是否有讀到資料
  $NoRemoteRecvData=false;//這個變數用來判別VNC連線是否有讀到資料
  @$RecvData=socket_read($ServerSocket,4096,PHP_BINARY_READ);
//從外部連線讀取4096 bytes的資料
  @$RemoteRecvData=socket_read($RemoteSocket,4096,PHP_BINARY_READ);
//從vnc連線連線讀取4096 bytes的資料
  if($RemoteRecvData==='')
  {
//VNC連線中斷,該結束嘍
   echo"Remote Connection Close/n";
   return;   
  }
  if($RemoteRecvData===false)
  {
/*
由於我們是採用nonblobk模式
這裡的情況就是vnc連線沒有可供讀取的資料
*/
   $NoRemoteRecvData=true;
//清除掉Last Errror
   socket_clear_error($RemoteSocket);
  }
  if($RecvData==='')
  {
//外部連線中斷,該結束嘍
   echo"Client Connection Close/n";
   return;
  }
  if($RecvData===false)
  {
/*
由於我們是採用nonblobk模式
這裡的情況就是外部連線沒有可供讀取的資料
*/
   $NoRecvData=true;
//清除掉Last Errror
   socket_clear_error($ServerSocket);
  }
  if($NoRecvData&&$NoRemoteRecvData)
  {
//如果外部連線以及VNC連線都沒有資料可以讀取時,
//就讓程式睡個0.1秒,避免長期佔用CPU資源
   usleep(100000);
//睡醒後,繼續作pooling的動作讀取socket
   continue;
  }
  //Recv Data
  if(!$NoRecvData)
  {
//外部連線讀取到資料
   while(true)
   {
//把外部連線讀到的資料,轉送到VNC連線上
    @$WriteLen=socket_write($RemoteSocket,$RecvData);
    if($WriteLen===false)
    {
//由於網路傳輸的問題,目前暫時無法寫入資料
//先睡個0.1秒再繼續嘗試。
     usleep(100000);
     continue;
    }
    if($WriteLen===0)
    {
//遠端連線中斷,程式該結束了
     echo"Remote Write Connection Close/n";
     return;
    }
//從外部連線讀取的資料,已經完全送給VNC連線時,中斷這個迴圈。
    if($WriteLen==strlen($RecvData)) break;
//如果資料一次送不完就得拆成好幾次傳送,直到所有的資料全部送出為止
    $RecvData=substr($RecvData,$WriteLen);
   }
  }
  if(!$NoRemoteRecvData)
  {
//這邊是從VNC連線讀取到的資料,再轉送回外部的連線
//原理跟上面差不多不再贅述
   while(true)
   {
    @$WriteLen=socket_write($ServerSocket,$RemoteRecvData);
    if($WriteLen===false)
    {
     usleep(100000);
     continue;
    }
    if($WriteLen===0)
    {
     echo"Remote Write Connection Close/n";
     return;
    }
    if($WriteLen==strlen($RemoteRecvData)) break;
    $RemoteRecvData=substr($RemoteRecvData,$WriteLen);
   }
  }
 }
 }
 function DestroySocket(){
//用來關閉已經開啟的Socket
 global$ServerSocket,$RemoteSocket;
 if($RemoteSocket)
 {
//如果已經開啟VNC連線
//在Close Socket前必須將Socket shutdown不然對方不知到你已經關閉連線了
  @socket_shutdown($RemoteSocket,2);
  socket_clear_error($RemoteSocket);
//關閉Socket
  socket_close($RemoteSocket);   
 }
//關閉外部的連線
 @socket_shutdown($ServerSocket,2);
 socket_clear_error($ServerSocket);
 socket_close($ServerSocket);
 }
//這裡是整個程式的開頭,程式從這邊開始執行
//這裡首先執行一次fork
 $PID=pcntl_fork();
 if($PID==-1) die("could not fork");
//如果$PID不為0表示這是Parrent Process
//$PID就是Child Process
//這是Parrent Process 自己結束掉,讓Child成為一個Daemon。
 if($PID) die("Daemon PID:$PID/n");
//從這邊開始,就是Daemon模式在執行了
//將目前的Process跟終端機脫離成為daemon模式
 if(!posix_setsid()) die("could not detach from terminal/n");
//設定daemon 的訊息處理函數
 declare(ticks = 1);
 if(!pcntl_signal(SIGTERM, "SignalFunction")) die("Error!!!/n");
 if(!pcntl_signal(SIGTRAP, "SignalFunction")) die("Error!!!/n");
 if(!pcntl_signal(SIGCHLD, "SignalFunction")) die("Error!!!/n");
//建立外部連線的Socket
 $ServerSocket=socket_create(AF_INET, SOCK_STREAM,SOL_TCP);
//設定外部連線監聽的IP以及Port,IP欄位設0,表示經聽所有介面的IP
 if(!socket_bind($ServerSocket,0,$ServerPort)) die("Cannot Bind Socket!/n");
//開始監聽Port
 if(!socket_listen($ServerSocket)) die("Cannot Listen!/n");
//將Socket設為nonblock模式
 if(!socket_set_nonblock($ServerSocket)) die("Cannot Set Server Socket to Block!/n");
//清空$PID變數,表示目前沒有任何的Child Process
 unset($PID);
 while(true)
 {
//進入pooling模式,每隔1秒鐘就去檢查有沒有連線進來。
  sleep(1);
//檢查有沒有連線進來
  @$ConnectedServerSocket=socket_accept($ServerSocket);
  if($ConnectedServerSocket!==false)
  {
//有人連進來嘍
//起始一個Child Process用來處理連線
   $PID=pcntl_fork();
   if($PID==-1) die("could not fork");
   if($PID) continue;//這是daemon process,繼續回去監聽。
   //這裡是Child Process開始
   //執行Socket裡函數
   ProcessSocket($ConnectedServerSocket);
  //處理完Socket後,結束掉Socket
   DestroySocket();
  //結束Child Process
   exit(0);
  }
 }

 

希望本文所述對大家的php程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩另类视频| 欧美在线免费视频| 97久久伊人激情网| 国产精品久久久久久亚洲调教| 91在线|亚洲| 亚洲精品一区在线观看香蕉| 欧美日本中文字幕| 亚洲人成在线观看| 亚洲性生活视频在线观看| 日韩大片免费观看视频播放| 亚洲a区在线视频| 久久精品国产99国产精品澳门| 久久频这里精品99香蕉| 国产va免费精品高清在线观看| 国产成人极品视频| 97超碰国产精品女人人人爽| 久久伊人精品视频| 日韩欧美极品在线观看| 欧美激情精品久久久久久| 亚洲国产精品久久久久秋霞不卡| 欧美日韩国产中字| 国产精品99免视看9| 亚洲天堂视频在线观看| 91久久在线观看| 在线观看精品国产视频| 欧美精品成人91久久久久久久| 国产在线观看不卡| 精品国产一区二区三区久久狼黑人| 一区二区三区在线播放欧美| 成人www视频在线观看| 国产成人一区三区| 在线观看国产精品日韩av| 欧美日韩亚洲天堂| 91久久久亚洲精品| 成人福利网站在线观看| 亚洲性无码av在线| 日韩欧美999| 欧美国产极速在线| 国产精品久久久久久一区二区| 欧美性猛交xxx| 国产精品扒开腿做爽爽爽男男| 中文国产成人精品久久一| 日韩欧美精品中文字幕| 亚洲第五色综合网| 欧美性在线视频| 国产成人久久久精品一区| 亚洲黄一区二区| 精品久久久久久国产| 国产精品v片在线观看不卡| 亚洲免费高清视频| 欧美激情a在线| 亚洲sss综合天堂久久| 亚洲国产精品va在线看黑人| 国产精品一区电影| 久久久999国产精品| 欧美黑人一级爽快片淫片高清| 国产精品丝袜高跟| 亚洲欧美日韩一区在线| 欧美一级免费视频| 日韩亚洲欧美成人| 欧美特黄级在线| 日韩成人在线电影网| 国产精品第二页| 亚洲综合色激情五月| 日日狠狠久久偷偷四色综合免费| 精品成人69xx.xyz| 亚洲一区二区三区毛片| 亚洲男人天堂久| 性色av一区二区三区在线观看| 国产欧美一区二区三区在线看| 深夜精品寂寞黄网站在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品入口免费视| 亚洲第一福利视频| 亚洲午夜未删减在线观看| 久久亚洲综合国产精品99麻豆精品福利| 欧美中文在线免费| 国产综合视频在线观看| 久久亚洲精品毛片| 亚洲第一福利网站| 亚洲欧洲av一区二区| 日韩av影视在线| 日韩欧美成人区| 久热精品视频在线观看一区| 国产精品入口尤物| 91人成网站www| 国产在线高清精品| 欧美限制级电影在线观看| 亚洲www视频| 久久人人爽人人爽人人片亚洲| 精品性高朝久久久久久久| 日韩在线视频播放| 亚洲欧美日韩综合| 久久久久久97| 国产精品丝袜久久久久久不卡| 亚洲精品99999| 国产亚洲视频在线| 国内精品一区二区三区四区| 久久成人人人人精品欧| 2020欧美日韩在线视频| 91精品久久久久久久久中文字幕| 欧美老少配视频| 国产亚洲精品久久久久久777| 成人写真福利网| 中文字幕亚洲自拍| 亚洲美女av在线| 91精品国产九九九久久久亚洲| 久久精品久久精品亚洲人| 深夜成人在线观看| 日韩av电影手机在线| 亚洲精品日韩激情在线电影| 亚洲男人天天操| 日韩欧美高清在线视频| 国产精品一区二区久久久| 亚洲精品自拍第一页| 欧美激情一级欧美精品| 日韩视频第一页| 欧美理论电影在线播放| 久99久在线视频| 亚洲一区二区中文| 久久av中文字幕| 91理论片午午论夜理片久久| 欧美日韩一区二区三区| 欧美国产亚洲精品久久久8v| 亚洲黄色av网站| 亚洲成人a级网| www.99久久热国产日韩欧美.com| 国产精品电影一区| 一本色道久久综合亚洲精品小说| 精品自在线视频| 91po在线观看91精品国产性色| 亚洲国产日韩欧美在线动漫| 日韩中文字幕精品视频| 国产精品久久久久久久久久久久久久| 国产日韩欧美影视| 欧美激情中文字幕在线| 亚洲最新av在线网站| 91综合免费在线| 国产国语videosex另类| www.欧美精品一二三区| 亚洲激情成人网| 91色视频在线观看| 91高清视频免费观看| 中文字幕v亚洲ⅴv天堂| 91精品国产综合久久香蕉| 大胆欧美人体视频| 国产精品青青在线观看爽香蕉| 美女视频久久黄| 欧美极品美女电影一区| 欧美激情精品在线| 亚洲天堂色网站| 欧美色另类天堂2015| 九九热这里只有在线精品视| 亚洲精品免费一区二区三区| 成人国内精品久久久久一区| 日韩精品极品在线观看播放免费视频| 国产精品国产三级国产专播精品人| 一区二区中文字幕| 欧美香蕉大胸在线视频观看| 97在线观看视频国产| 久久精品电影网站| 亚洲国产免费av| 精品一区二区三区四区| 中文字幕av一区二区三区谷原希美|