加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.cn/)- 云渲染、网络安全、数据安全、数据分析、人体识别!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php实现的简单多进程服务器类完整示例

发布时间:2022-06-20 09:02:49 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了php实现的简单多进程服务器类,结合完整实例形式分析了PHP多进程服务器数据传输、响应、处理等相关操作技巧,需要的朋友可以参考下。 本文实例讲述了php实现的简单多进程服务器类,分享给大家供大家参考,具体如下: php写的一个简单的多进
  这篇文章主要介绍了php实现的简单多进程服务器类,结合完整实例形式分析了PHP多进程服务器数据传输、响应、处理等相关操作技巧,需要的朋友可以参考下。
 
  本文实例讲述了php实现的简单多进程服务器类,分享给大家供大家参考,具体如下:
 
  php写的一个简单的多进程服务器。
 
  <?php
  class server
  {
    public $port;
    public $ip;
    protected $server;
    public function __construct($ip = '0.0.0.0', $port)
    {
      $this->ip = $ip;
      $this->port = $port;
      $this->createSocket(); //创建一个通讯节点
    }
    public function listen($callback)
    {
      if(!is_callable($callback)){
        throw new Exception('不是闭包,请传递正确的参数');
      }
      //只要我们接收到客户端的数据,就fork一个子进程处理
      while ($client = socket_accept($this->server)) { //等待客户端接入,返回的是客户端的连接
        $buf = socket_read($client, 1024); //读取客户端内容
        $pid=pcntl_fork(); //创建子进程
        //父进程和子进程都会执行下面代码
        if ($pid == -1) {
          //错误处理:创建子进程失败时返回-1.
          die('could not fork');
        } else if ($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(emptyempty($this->checkRule("/GETs(.*?)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("/GETs(.*?)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 模型
    //多进程
    protected function createSocket()
    {
      $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
     * @return mixed
     */
    protected function checkRule($reg,$buf){
      if(preg_match($reg,$buf,$matchs)){
        return $matchs;
      }
      return false;
    }
    //请求处理类
    public function request($buf){
      //1.只允许http协议访问
  //    if(preg_match("GETs(.*?)sHTTP/1.1",$buf,$matchs)){ //匹配到http协议
  //      return true;
  //    }else{
  //      return false;
  //    }
      //2.过滤掉/favicon.ico
      //3.获取请求信息
    }
    protected function response($content,$client){
      //返回数据给客户端,响应处理
      $string="HTTP/1.1 200 OKrn";
      $string.="Content-Type: text/html;charset=utf-8rn";
      $string.="Content-Length: ".strlen($content)."rnrn";
      socket_write($client,$string.$content);
    }
  }
 

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读