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


Posted in PHP onFebruary 01, 2020

本文实例讲述了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编程效率的方法
Nov 07 PHP
php验证是否是md5编码的简单代码
Apr 01 PHP
YII模块实现绑定二级域名的方法
Jul 09 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
php判断输入是否是纯数字,英文,汉字的方法
Mar 05 PHP
codeigniter中view通过循环显示数组数据的方法
Mar 20 PHP
分享php分页的功能模块
Jun 16 PHP
PHP使用pear自带的mail类库发邮件的方法
Jul 08 PHP
详解PHP对象的串行化与反串行化
Jan 24 PHP
一段实用的php验证码函数
May 19 PHP
PHP性能优化大全(php.ini)
May 20 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
laravel 框架执行流程与原理简单分析
Feb 01 #PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 #PHP
php正则表达式使用方法整理集合
Jan 31 #PHP
laravel邮件发送的实现代码示例
Jan 31 #PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 #PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
Jan 26 #PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
Jan 26 #PHP
You might like
杏林同学录(四)
2006/10/09 PHP
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
jQuery中closest()函数用法实例
2015/01/07 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
Cython 三分钟入门教程
2009/09/17 Python
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
Python中decorator使用实例
2015/04/14 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
Python实现的网页截图功能【PyQt4与selenium组件】
2018/07/12 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
医学生职业规划范文
2014/01/05 职场文书
推广普通话标语
2014/06/27 职场文书
效能风暴心得体会
2014/09/04 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
给老婆道歉的话
2015/01/20 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP