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 相关文章推荐
mysql时区问题
Mar 26 PHP
php 特殊字符处理函数
Sep 05 PHP
隐性调用php程序的方法
Mar 09 PHP
PHP开发负载均衡指南
Jul 17 PHP
微盾PHP脚本加密专家php解密算法
Sep 13 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
PHP中cookie和session的区别实例分析
Aug 28 PHP
ThinkPHP的SAE开发相关注意事项详解
Oct 09 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
PHP获取当前日期及本周一是几月几号的方法
Mar 28 PHP
PHP处理bmp格式图片的方法分析
Jul 04 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 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
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
2017/02/13 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
pm2启动ssr失败的解决方法
2019/06/29 Javascript
js设置默认时间跨度过程详解
2019/07/17 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
一看就懂得Python的math模块
2018/10/21 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
爱护公物演讲稿
2014/09/09 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
辛亥革命观后感
2015/06/02 职场文书