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获取地址栏信息的代码
Oct 08 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
深入理解require与require_once与include以及include_once的区别
Jun 05 PHP
PHP中session变量的销毁
Feb 27 PHP
Drupal7 form表单二次开发要点与实例
Mar 02 PHP
Linux下php5.4启动脚本
Aug 03 PHP
ThinkPHP自动填充实现无限级分类的方法
Aug 22 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
Sep 11 PHP
php自定义函数实现统计中文字符串长度的方法小结
Apr 15 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 PHP
PHP大文件切割上传功能实例分析
Jul 01 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
一个PHP针对数字的加密解密类
2014/03/20 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法详解
2019/10/15 Javascript
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
python实现感知机模型的示例
2020/09/30 Python
python实现企业微信定时发送文本消息的实例代码
2020/11/25 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
ToysRus日本官网:玩具反斗城
2018/09/08 全球购物
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
中级会计大学生职业生涯规划书
2014/09/16 职场文书
受伤赔偿协议书
2014/09/24 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
2015年收银工作总结范文
2015/04/01 职场文书
董事会决议范本
2015/07/01 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL