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 相关文章推荐
BBS(php &amp; mysql)完整版(六)
Oct 09 PHP
PHP SQLite类
May 07 PHP
一步一步学习PHP(5) 类和对象
Feb 16 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
php实现按文件名搜索文件的远程文件查找器
May 10 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
php调用mysql存储过程实例分析
Dec 29 PHP
php中使用url传递数组的方法
Feb 11 PHP
Discuz!X中SESSION机制实例详解
Sep 23 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
Feb 24 PHP
ThinkPHP实现分页功能
Apr 28 PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 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
QueryPath PHP 中的jQuery
2010/04/11 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
克隆一个新项目的快捷方式
2013/04/10 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
功能强大的php分页函数
2016/07/20 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
javascript URL锚点取值方法
2009/02/25 Javascript
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Python的Django框架使用入门指引
2015/04/15 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
python3爬虫之设计签名小程序
2018/06/19 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
Python 私有化操作实例分析
2019/11/21 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
大学生个人自我鉴定
2013/12/03 职场文书
表彰先进的通报
2014/01/31 职场文书
白血病捐款倡议书
2014/05/14 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
linux下安装redis图文详细步骤
2021/12/04 Redis
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏