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 09 PHP
PHP 和 MySQL 基础教程(二)
Oct 09 PHP
Zend Studio 无法启动的问题解决方法
Dec 04 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
Oct 11 PHP
phpmyadmin 常用选项设置详解版
Mar 07 PHP
win7下memCache的安装过程(具体操作步骤)
Jun 28 PHP
php开发时容易忘记的一些技术细节
Feb 03 PHP
php中final关键字用法分析
Dec 07 PHP
PHP使用第三方即时获取物流动态实例详解
Apr 27 PHP
phpmyadmin下载、安装、配置教程
May 16 PHP
Yii框架日志记录Logging操作示例
Jul 12 PHP
laravel框架创建授权策略实例分析
Nov 22 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把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
PHP实现小程序批量通知推送
2018/11/27 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
js继承 Base类的源码解析
2008/12/30 Javascript
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
js无刷新操作table的行和列
2014/03/27 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
javascript中Function类型详解
2015/04/28 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
整理Python中的赋值运算符
2015/05/13 Python
讲解Python中的标识运算符
2015/05/14 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
2018/12/27 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
Python3 搭建Qt5 环境的方法示例
2020/07/16 Python
python实现批处理文件
2020/07/28 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
Python中如何定义一个函数
2016/09/06 面试题
升学宴主持词
2014/04/02 职场文书
项目投资合作意向书
2014/07/29 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
销售内勤岗位职责
2015/02/10 职场文书
自我推荐信怎么写
2015/03/24 职场文书
如何理解PHP核心特性命名空间
2021/05/28 PHP