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 MSSQL 存储过程的方法
Dec 24 PHP
PHP仿盗链代码
Jun 03 PHP
windows环境下php配置memcache的具体操作步骤
Jun 09 PHP
关于Sphinx创建全文检索的索引介绍
Jun 25 PHP
PHP字符串长度计算 - strlen()函数使用介绍
Oct 15 PHP
php支付宝手机网页支付类实例
Mar 04 PHP
Php-Redis安装测试笔记
Mar 05 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
一张表搞清楚php is_null、empty、isset的区别
Jul 07 PHP
php编程中echo用逗号和用点号连接的区别
Mar 26 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
Sep 23 PHP
基于ThinkPHP删除目录及目录文件函数
Oct 28 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
jQuery中parents()方法用法实例
2015/01/07 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
python中文件变化监控示例(watchdog)
2017/10/16 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
Ubuntu下使用python读取doc和docx文档的内容方法
2018/05/08 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
如何写好自荐信
2014/04/07 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
爱国演讲稿400字
2014/05/07 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
党政领导班子群众路线对照检查材料思想汇报
2014/09/27 职场文书
库房管理员岗位职责
2015/02/12 职场文书
商务代表岗位职责
2015/02/15 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL