php如何开启多进程
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,小编给大家分享一下php如何开启多进程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体实现方法如下:
千家信息网最后更新 2025年11月07日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安全错误
数据库的锁怎样保障安全
工控网络技术水位控制系统
青岛聚能量网络技术
数据库填充位置
有关于数据库基础知识的题
华为服务器远程管理怎么用
软件开发文档谁写
时间服务器默认端口是多少
软件开发学校培训的目的
公安开展网络安全教育会议
自建服务器设置
128g的服务器电脑
怎么删除两条一样的数据库
数据库是否主键在哪里
区卫健局网络安全应急演练方案
acrobat提交服务器
计算机四级网络技术改革时间
长宁区大型网络技术采购信息
双引号数据库百科
罗湖区网络技术优化
网络安全策略的技术
渭南 网络安全服务招标公告
无线传感网络安全
北仑应用软件开发服务
中国一拖网络安全比赛
租阿里云空间怎样获得服务器码
镇江定制软件开发
软件开发社团名
网络安全属于什么类型的比赛
灿翔网络技术有限公司怎么样
怎么查看域名绑定服务器成功