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截取中文字符串的问题
Jul 12 PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
May 06 PHP
检查php文件中是否含有bom的函数
May 31 PHP
逆序二维数组插入一元素的php代码
Jun 08 PHP
百度ping方法使用示例 自动ping百度
Jan 26 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
Dec 05 PHP
PHP使用in_array函数检查数组中是否存在某个值
Mar 25 PHP
Yii扩展组件编写方法实例分析
Jun 29 PHP
Zend Framework教程之Bootstrap类用法概述
Mar 14 PHP
php in_array() 检查数组中是否存在某个值详解
Nov 23 PHP
thinkPHP5框架设置404、403等http状态页面的方法
Jun 05 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
Oct 12 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 判断常量,变量和函数是否存在
2009/04/26 PHP
php更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
JavaScript实现英语单词题库
2019/12/24 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
2020/11/07 Javascript
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
[53:15]Mineski vs iG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
用python简单实现mysql数据同步到ElasticSearch的教程
2018/05/30 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
外贸学院会计专业应届生求职信
2013/11/14 职场文书
学校食堂采购员岗位职责
2013/12/05 职场文书
好人好事事迹材料
2014/02/12 职场文书
品牌推广策划方案
2014/05/28 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
生产操作工岗位职责
2014/09/16 职场文书
刑事附带民事起诉状
2015/05/19 职场文书