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 25 PHP
php数据库连接时容易出错的特殊符号问题
Sep 01 PHP
用C/C++扩展你的PHP 为你的php增加功能
Sep 06 PHP
php中call_user_func函数使用注意事项
Nov 21 PHP
php的闭包(Closure)匿名函数详解
Feb 22 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
May 12 PHP
6个超实用的PHP代码片段
Aug 10 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
Sep 23 PHP
PHP时间类完整实例(非常实用)
Dec 25 PHP
thinkphp实现图片上传功能
Jan 13 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 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
初学CAKEPHP 基础教程
2009/11/02 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
用jQuery技术实现Tab页界面之二
2009/09/21 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
Python采集腾讯新闻实例
2014/07/10 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
Python 实现一个简单的web服务器
2021/01/03 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
英国高端食品和葡萄酒超市:Waitrose
2016/08/23 全球购物
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
全球性的女装店:storets
2019/06/12 全球购物
建筑班组长岗位职责
2014/01/02 职场文书
青年文明号复核材料
2014/02/11 职场文书
大学生职业规划书的范本
2014/02/18 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
MySQL系列之十二 备份与恢复
2021/07/02 MySQL
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA