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与ASP
Oct 09 PHP
PHP 高级课程笔记 面向对象
Jun 21 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
php 多关键字 高亮显示实现代码
Apr 23 PHP
360通用php防护代码(使用操作详解)
Jun 18 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
一个简单的php路由类
May 29 PHP
PHP实现图片压缩
Sep 09 PHP
laravel 实现用户登录注销并限制功能
Oct 24 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 PHP
phpstudy隐藏index.php的方法
Sep 21 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
来自phpguru得Php Cache类源码
2010/04/15 PHP
PHP 缓存实现代码及详细注释
2010/05/16 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
jQuery选择器之基本选择器与层次选择器
2015/03/03 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
2016/01/28 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
vue.js 获取当前自定义属性值
2017/06/01 Javascript
老生常谈ES6中的类
2017/07/31 Javascript
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
超市实习总结自我鉴定
2013/09/19 职场文书
高中同学聚会邀请函
2014/01/11 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
闪闪的红星观后感
2015/06/08 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书