php开启多进程的方法
发布时间:2020-12-13 02:26:23 所属栏目:PHP教程 来源:网络整理
导读:《php开启多进程的方法》要点: 本文介绍了php开启多进程的方法,希望对您有用。如果有疑问,可以联系我们。 PHP应用 本篇章节讲解php开启多进程的办法.供大家参考研究.具体实现办法如下: 代码如下: ?php ?$IP='192.168.1.1';//WindowsX的IP ?$Port
《php开启多进程的方法》要点: PHP应用本篇章节讲解php开启多进程的办法.分享给大家供大家参考.具体实现办法如下:
代码如下:
<?php ?$IP='192.168.1.1';//WindowsX的IP ?$Port='5900';??????? //VNC使用的Port ?$ServerPort='9999';//Linux Serverν馐褂玫Port ?$RemoteSocket=false;//B到VNC的Socket ?function SignalFunction($Signal){ ? //@是主Process的息砗 ?global $PID;//Child Process的PID ?switch ($Signal) ?{ ? case SIGTRAP: ? case SIGTERM: ?? //收到Y束程式的Signal ?? if($PID) ?? { ??? //送一SIGTERM的oChild告V他s快Y束掉D ??? posix_kill($PID,SIGTERM); ??? //等待Child ProcessY束,避免zombie ??? pcntl_wait($Status); ?? } ?? //P]主Process_⒌Socket ?? DestroySocket(); ?? exit(0); //Y束主Process ?? break; ? case SIGCHLD: ?? /* Child ProcessY束掉r,Child鸵SIGCHLDoParrent Parrent收到SIGCHLD,就知道Child Process已Y束D,做一些 Y束的幼*/ ?? unset($PID); //$PID清空,表示Child Process已Y束 ?? pcntl_wait($Status); //避免Zombie ?? break; ? default: ?} ?} ?function ChildSignalFunction($Signal){ //@是Child Process的息砗 ?switch ($Signal) ?{ ? case SIGTRAP: ? case SIGTERM: //Child Process收到Y束的息 ?? DestroySocket(); //P]Socket ?? exit(0); //Y束Child Process ? default: ?} ?} ?function ProcessSocket($ConnectedServerSocket){ ?//Child Process Socket砗 ?//$ConnectedServerSocket -> 外部BM淼Socket ?global $ServerSocket,$RemoteSocket,$IP,$Port; ?$ServerSocket=$ConnectedServerSocket; ?declare(ticks = 1); //@一行一定要加,不然]k法O定息砗怠 //O定息砗 ?if(!pcntl_signal(SIGTERM,"ChildSignalFunction")) return; ?if(!pcntl_signal(SIGTRAP,"ChildSignalFunction")) return; //建立一B到VNC的Socket ?$RemoteSocket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP); //B到炔康VNC ?@$RemoteConnected=socket_connect($RemoteSocket,$Port); ?if(!$RemoteConnected) return; //o法B到VNC Y束 //Socket的碓ONonblock,避免程式被Block住 ?if(!socket_set_nonblock($RemoteSocket)) return; ?if(!socket_set_nonblock($ServerSocket)) return; ?while(true) ?{ //@我裼pooling的方式去取得Y料 ? $NoRecvData=false;?? //@涤砼e外部的B是否有x到Y料 ? $NoRemoteRecvData=false;//@涤砼eVNCB是否有x到Y料 ? @$RecvData=socket_read($ServerSocket,4096,PHP_BINARY_READ); //外部Bx取4096 bytes的Y料 ? @$RemoteRecvData=socket_read($RemoteSocket,PHP_BINARY_READ); //vncBBx取4096 bytes的Y料 ? if($RemoteRecvData==='') ? { //VNCB中啵Y束D ?? echo"Remote Connection Closen"; ?? return;?? ? } ? if($RemoteRecvData===false) ? { /* 由於我是裼nonblobk模式 @e的情r就是vncB]有可供x取的Y料 */ ?? $NoRemoteRecvData=true; //清除掉Last Errror ?? socket_clear_error($RemoteSocket); ? } ? if($RecvData==='') ? { //外部B中啵Y束D ?? echo"Client Connection Closen"; ?? return; ? } ? if($RecvData===false) ? { /* 由於我是裼nonblobk模式 @e的情r就是外部B]有可供x取的Y料 */ ?? $NoRecvData=true; //清除掉Last Errror ?? socket_clear_error($ServerSocket); ? } ? if($NoRecvData&&$NoRemoteRecvData) ? { //如果外部B以及VNCB都]有Y料可以x取r, //就程式睡0.1秒,避免L期子CPUY源 ?? usleep(100000); //睡醒後,^m作pooling的幼髯x取socket ?? continue; ? } ? //Recv Data ? if(!$NoRecvData) ? { //外部Bx取到Y料 ?? while(true) ?? { //把外部Bx到的Y料,D送到VNCB上 ??? @$WriteLen=socket_write($RemoteSocket,$RecvData); ??? if($WriteLen===false) ??? { //由於W路鬏的},目前ro法入Y料 //先睡0.1秒再^mL. ???? usleep(100000); ???? continue; ??? } ??? if($WriteLen===0) ??? { //h端B中啵淌皆Y束了 ???? echo"Remote Write Connection Closen"; ???? return; ??? } //外部Bx取的Y料,已完全送oVNCBr,中噙@圈. ??? if($WriteLen==strlen($RecvData)) break; //如果Y料一次送不完就得拆成好次魉停钡剿械馁Y料全部送出橹 ??? $RecvData=substr($RecvData,$WriteLen); ?? } ? } ? if(!$NoRemoteRecvData) ? { //@是VNCBx取到的Y料,再D送回外部的B //原理跟上面差不多不再述 ?? while(true) ?? { ??? @$WriteLen=socket_write($ServerSocket,$RemoteRecvData); ??? if($WriteLen===false) ??? { ???? usleep(100000); ???? continue; ??? } ??? if($WriteLen===0) ??? { ???? echo"Remote Write Connection Closen"; ???? return; ??? } ??? if($WriteLen==strlen($RemoteRecvData)) break; ??? $RemoteRecvData=substr($RemoteRecvData,$WriteLen); ?? } ? } ?} ?} ?function DestroySocket(){ //用黻P]已_⒌Socket ?global$ServerSocket,$RemoteSocket; ?if($RemoteSocket) ?{ //如果已_VNCB //在Close Socket前必Socket shutdown不然Ψ讲恢侥阋呀P]B了 ? @socket_shutdown($RemoteSocket,2); ? socket_clear_error($RemoteSocket); //P]Socket ? socket_close($RemoteSocket);?? ?} //P]外部的B ?@socket_shutdown($ServerSocket,2); ?socket_clear_error($ServerSocket); ?socket_close($ServerSocket); ?} //@e是整程式的_^,程式@_始绦 //@e首先绦幸淮fork ?$PID=pcntl_fork(); ?if($PID==-1) die("could not fork"); //如果$PID不0表示@是Parrent Process //$PID就是Child Process //@是Parrent Process 自己Y束掉,Child成橐Daemon. ?if($PID) die("Daemon PID:$PIDn"); //@_始,就是Daemon模式在绦辛 //⒛壳暗Process跟K端Cx成daemon模式 ?if(!posix_setsid()) die("could not detach from terminaln"); //O定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"); //建立外部B的Socket ?$ServerSocket=socket_create(AF_INET,SOL_TCP); //O定外部BO的IP以及Port,IP谖辉O0,表示所有介面的IP ?if(!socket_bind($ServerSocket,$ServerPort)) die("Cannot Bind Socket!n"); //_始OPort ?if(!socket_listen($ServerSocket)) die("Cannot Listen!n"); //SocketOnonblock模式 ?if(!socket_set_nonblock($ServerSocket)) die("Cannot Set Server Socket to Block!n"); //清空$PID担硎灸壳]有任何的Child Process ?unset($PID); ?while(true) ?{ //M入pooling模式,每隔1秒就去z查有]有BM怼 ? sleep(1); //z查有]有BM ? @$ConnectedServerSocket=socket_accept($ServerSocket); ? if($ConnectedServerSocket!==false) ? { //有人BMD //起始一Child Process用硖磉B ?? $PID=pcntl_fork(); ?? if($PID==-1) die("could not fork"); ?? if($PID) continue;//@是daemon process,^m回去O. ?? //@e是Child Process_始 ?? //绦Sockete函 ?? ProcessSocket($ConnectedServerSocket); ? //硗Socket後,Y束掉Socket ?? DestroySocket(); ? //Y束Child Process ?? exit(0); ? } ?} 希望本文所述对大家的php程序设计有所赞助. 《php开启多进程的方法》是否对您有启发,欢迎查看更多与《php开启多进程的方法》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |