php如何开启多进程
发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,小编给大家分享一下php如何开启多进程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体实现方法如下:
千家信息网最后更新 2025年01月17日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安全错误
数据库的锁怎样保障安全
赤水网络安全系统
新闻稿网络安全教育主题班会
万方数据库免费入口护理论文
关系数据库系统的结构
华为服务器怎么找管理口ip
数据库 修改表的信息
leadtools服务器管理
互联网科技公司物流专员
无线传感器网络技术e有
网络安全七大分类
新和快报网络安全
戴尔服务器硬盘
本地数据库 sdf
ipad项目展示软件开发
服务器铁轨机
河南多功能软件开发服务价格
群晖能当作智能家居服务器吗
百度网盘的域名和服务器地址
优惠卷app服务器开小差
nas家庭服务器安全吗
计算机软件技术和网络技术
网络安全电影解析
软件开发专项整改有哪些
闵行区提供数据库系统职能
迷雾美剧软件开发
2022届网络技术专业的题目
数据库的小程序
法国软件开发员工资
网站和服务器
怎样使用数据库算法