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小技巧搜集,每个PHPer都来露一手
Jan 02 PHP
PHP添加MySQL数据记录代码
Jun 07 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
Jan 10 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
Feb 02 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
php从数据库查询结果生成树形列表的方法
Apr 17 PHP
PHP经典面试题之设计模式(经常遇到)
Oct 15 PHP
PHP中Http协议post请求参数
Nov 02 PHP
php对文件夹进行相关操作(遍历、计算大小)
Nov 04 PHP
标准版Eclipse搭建PHP环境的详细步骤
Nov 18 PHP
CodeIgniter连贯操作的底层原理分析
May 17 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
session 的生命周期是多长
2006/10/09 PHP
Smarty+QUICKFORM小小演示
2007/02/25 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
php SQL Injection with MySQL
2011/02/27 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
php网站地图生成类示例
2014/01/13 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
22点关于jquery性能优化的建议
2014/05/28 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
Python数据类型详解(四)字典:dict
2016/05/12 Python
Python字典简介以及用法详解
2016/11/15 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
在keras中model.fit_generator()和model.fit()的区别说明
2020/06/17 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
德国网上药房:Apotal
2017/04/04 全球购物
企业治理工作自我评价
2013/09/26 职场文书
函授本科毕业生自我鉴定
2013/10/16 职场文书
高一数学教学反思
2014/02/07 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
医院合作意向书范本
2015/05/08 职场文书
运动会口号霸气押韵
2015/12/24 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书