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中使用sockets:从新闻组中获取文章
Oct 09 PHP
php 定义404页面的实现代码
Nov 19 PHP
php时间戳转换的示例
Mar 31 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
php采集神器cURL使用方法详解
Feb 19 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
php生成验证码,缩略图及水印图的类分享
Apr 07 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
非常实用的php验证码类
May 15 PHP
php实现通过soap调用.Net的WebService asmx文件
Feb 27 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
Laravel 实现密码重置功能
Feb 23 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
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
详解A标签中href=&quot;&quot;的几种用法
2017/08/20 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
[01:10]DOTA2 Supermajor:英雄,由我们见证
2018/05/14 DOTA
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
Python数据类型之Dict字典实例详解
2019/05/07 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
python多线程并发及测试框架案例
2019/10/15 Python
Pandas时间序列基础详解(转换,索引,切片)
2020/02/26 Python
区分python中的进程与线程
2020/08/13 Python
python如何实现图片压缩
2020/09/11 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
写求职信有哪些注意事项
2014/05/08 职场文书
服务承诺书怎么写
2014/05/24 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
Redis Cluster 集群搭建你会吗
2021/08/04 Redis
MySQL实现配置主从复制项目实践
2022/03/31 MySQL