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与MySQL交互使用详解
Oct 09 PHP
php下使用以下代码连接并测试
Apr 09 PHP
php 连接mysql连接被重置的解决方法
Feb 15 PHP
php表单提交问题的解决方法
Apr 12 PHP
PHP设置图片文件上传大小的具体实现方法
Oct 11 PHP
Codeigniter发送邮件的方法
Mar 19 PHP
php实现微信发红包功能
Jul 13 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
Dec 21 PHP
对php 判断http还是https,以及获得当前url的方法详解
Jan 15 PHP
php+Ajax处理xml与json格式数据的方法示例
Mar 04 PHP
php使用event扩展的io复用测试的示例
Oct 20 PHP
如何用PHP实现多线程编程
May 26 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向js函数传参的几种方法
2014/08/10 PHP
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
PHP多线程类及用法实例
2014/12/03 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
javascript函数库-集合框架
2007/04/27 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
node网页分段渲染详解
2016/09/05 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
JS实现带阴历的日历功能详解
2019/01/24 Javascript
Vue渲染过程浅析
2019/03/14 Javascript
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
python实现对一个完整url进行分割的方法
2015/04/29 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
python爬虫爬取网页表格数据
2018/03/07 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
如何解决tensorflow恢复模型的特定值时出错
2020/02/06 Python
Django model class Meta原理解析
2020/11/14 Python
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
革命先烈的英雄事迹材料
2014/02/15 职场文书
2015年女职工工作总结
2015/05/15 职场文书
MySQL笔记 —SQL运算符
2022/01/18 MySQL
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js
Python实现数据的序列化操作详解
2022/07/07 Python