• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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(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 模型
      //多进程
      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("GET\s(.*?)\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 OK\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程序设计有所帮助。

    您可能感兴趣的文章:
    • php多进程中的阻塞与非阻塞操作实例分析
    • php多进程并发编程防止出现僵尸进程的方法分析
    • php 的多进程操作实践案例分析
    • php 多进程编程父进程的阻塞与非阻塞实例分析
    • PHP多进程简单实例小结
    • PHP 多进程与信号中断实现多任务常驻内存管理实例方法
    • php swoole多进程/多线程用法示例【基于php7nts版】
    • PHP基于swoole多进程操作示例
    • 详解PHP多进程消费队列
    上一篇:laravel 框架执行流程与原理简单分析
    下一篇:PHP设计模式之组合模式定义与应用示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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