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
Excel数据导入Mysql数据库的实现代码
Jun 05 PHP
PHP中使用CURL获取页面title例子
Jan 07 PHP
php实现图片局部打马赛克的方法
Feb 11 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
php实现表单多按钮提交action的处理方法
Oct 24 PHP
Zend Framework处理Json数据方法详解
Dec 09 PHP
YII框架批量插入数据的方法
Mar 18 PHP
Yii2实现自定义独立验证器的方法
May 05 PHP
Laravel框架Request、Response及Session操作示例
May 06 PHP
Laravel 关联模型-关联新增和关联更新的方法
Oct 10 PHP
在TP5数据库中四个字段实现无限分类的示例
Oct 18 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
建立文件交换功能的脚本(二)
2006/10/09 PHP
php学习笔记 PHP面向对象的程序设计
2011/06/13 PHP
我的php学习笔记(毕业设计)
2012/02/21 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
PHP+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
JQuery触发事件例如click
2013/09/11 Javascript
js 通用订单代码
2013/12/23 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
react路由配置方式详解
2017/08/07 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
微信小程序实现提交input信息到后台的方法示例
2019/01/19 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
Python使用贪婪算法解决问题
2019/10/22 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
StubHub西班牙:购买和出售全球活动门票
2017/06/05 全球购物
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
局部内部类是否可以访问非final变量?
2013/04/20 面试题
先进集体事迹材料
2014/02/17 职场文书
理发店策划方案
2014/06/05 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
大学生助学金感谢信
2015/01/21 职场文书
邀请书模板
2015/02/02 职场文书
如何在CSS中绘制曲线图形及展示动画
2021/05/24 HTML / CSS