php如何开启多进程
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,小编给大家分享一下php如何开启多进程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体实现方法如下:
千家信息网最后更新 2026年10月31日php如何开启多进程
小编给大家分享一下php如何开启多进程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
具体实现方法如下:
外部連進來的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如何开启多进程"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
模式
程式
就是
篇文章
进程
内容
差不多
一行
不怎么
介面
原理
大部分
方式
方法
更多
知识
行业
资讯
资讯频道
频道
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
科技互联网技术
北京互联网科技
互联网 科技创新
互联网科技公司发展
互联网科技集团
鑫亿盛互联网科技
腾讯科技 互联网女皇
中国最先进互联网科技公司
海南科技产业互联网平台
华中科技有哪些互联网大佬
中国科技互联网公司收入
互联网科技寓意
来此购互联网科技有限公司
搜狐科技互联网
高科技互联网发展前景如何
互联网方面的科技前沿
陕西云淼互联网科技公司
互联网高科技行业有哪些企业
长沙易易互联网科技有限公司
互联网高科技绘画
互联网加科技
杭州互联网科技公司
互联网 科技服务平台
允成互联网科技有限公司融资
上海京穆互联网科技有限公司
半导体是互联网高科技吗
神州科技互联网有限公司
国产互联网科技公司
容联科技互联网电商
互联网的黑科技实验室