php实现的简单多进程服务器类完整示例
本文实例讲述了php实现的简单多进程服务器类。分享给大家供大家参考,具体如下:
php写的一个简单的多进程服务器。
ip=$ip; $this->port=$port; $this->createSocket();//创建一个通讯节点 } publicfunctionlisten($callback) { if(!is_callable($callback)){ thrownewException('不是闭包,请传递正确的参数'); } //只要我们接收到客户端的数据,就fork一个子进程处理 while($client=socket_accept($this->server)){//等待客户端接入,返回的是客户端的连接 $buf=socket_read($client,1024);//读取客户端内容 $pid=pcntl_fork();//创建子进程 //父进程和子进程都会执行下面代码 if($pid==-1){ //错误处理:创建子进程失败时返回-1. die('couldnotfork'); }elseif($pid){ //父进程会得到子进程号,所以这里是父进程执行的逻辑 var_dump('父进程',$pid); pcntl_wait($status);//等待子进程中断,防止子进程成为僵尸进程。 }else{ //子进程得到的$pid为0,所以这里是子进程执行的逻辑。 //睡眠 if($this->checkRule("/sleep/i",$buf)){ sleep(10); $this->response('休眠10S',$client); socket_close($client); return; } //请求过滤 if(empty($this->checkRule("/GET\s(.*?)\sHTTP\/1.1/i",$buf))){ socket_close($client); return; } //响应 $response=call_user_func($callback,$buf);//回调$callback函数 $this->response($response,$client); usleep(1000);//微妙为单位,1000000微妙等于1秒 socket_close($client); exit();//直接退出 } } //while(true){ //$client=socket_accept($this->server);//等待客户端接入,返回的是客户端的连接 //$buf=socket_read($client,1024);//读取客户端内容 // ////睡眠 //if($this->checkRule("/sleep/i",$buf)){ //sleep(10); //$this->response('休眠10S',$client); //socket_close($client); //return; //} ////请求过滤 //if(empty($this->checkRule("/GET\s(.*?)\sHTTP\/1.1/i",$buf))){ //socket_close($client); //return; //} // ////响应 //$response=call_user_func($callback,$buf);//回调$callback函数 //$this->response($response,$client); //usleep(1000);//微妙为单位,1000000微妙等于1秒 //socket_close($client); // //} socket_close($this->server); } //io复用 //epoll模型 //多进程 protectedfunctioncreateSocket() { $this->server=socket_create(AF_INET,SOCK_STREAM,SOL_TCP); //bind socket_set_option($this->server,SOL_SOCKET,SO_REUSEADDR,1);//复用还处于TIME_WAIT socket_bind($this->server,$this->ip,$this->port);//细节性的处理自行完成 socket_listen($this->server);//开始监听 } /** *协议过滤 *@param$reg *@param$buf *@returnmixed */ protectedfunctioncheckRule($reg,$buf){ if(preg_match($reg,$buf,$matchs)){ return$matchs; } returnfalse; } //请求处理类 publicfunctionrequest($buf){ //1.只允许http协议访问 //if(preg_match("GET\s(.*?)\sHTTP/1.1",$buf,$matchs)){//匹配到http协议 //returntrue; //}else{ //returnfalse; //} //2.过滤掉/favicon.ico //3.获取请求信息 } protectedfunctionresponse($content,$client){ //返回数据给客户端,响应处理 $string="HTTP/1.1200OK\r\n"; $string.="Content-Type:text/html;charset=utf-8\r\n"; $string.="Content-Length:".strlen($content)."\r\n\r\n"; socket_write($client,$string.$content); } }
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。