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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。