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一些服务器端特性的配置加强php的安全
Oct 09 PHP
PHP 出现乱码和Sessions验证问题的解决方法!
Dec 06 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
Sep 12 PHP
20个2014年最优秀的PHP框架回顾
Oct 22 PHP
PHP实现全角字符转为半角方法汇总
Jul 09 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
Joomla数据库操作之JFactory::getDBO用法
May 05 PHP
详解php几行代码实现CSV格式文件输出
Jul 01 PHP
thinkphp分页集成实例
Jul 24 PHP
PHP echo()函数讲解
Feb 15 PHP
PHP基于openssl实现非对称加密代码实例
Jun 19 PHP
PHP与Web页面的交互示例详解一
Aug 04 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
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
php 静态变量的初始化
2009/11/15 PHP
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
php debug 安装技巧
2011/04/30 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
Position属性之relative用法
2015/12/14 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
python实现横向拼接图片
2020/03/23 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
python文件读取失败怎么处理
2020/06/23 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
党员承诺书范文
2014/05/19 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
学校欢迎标语
2014/06/18 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
工商管理本科生求职信
2014/07/13 职场文书
办理信用卡工作证明
2014/09/30 职场文书
普宁寺导游词
2015/02/04 职场文书
2015年化验员工作总结
2015/04/10 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL