设为首页 加入收藏

TOP

Swoole 整合成一个小框架(一)
2019-08-15 23:30:09 】 浏览:56
Tags:Swoole 合成 一个 框架

概述

这是关于 Swoole 学习的第六篇文章:Swoole 整合成一个小框架。

写了关于 Swoole 入门的 5 篇文章后,增加了不少的关注者,也得到了一些大佬的鼓励,也有很多关注者都加了微信好友,交流之后发现一些朋友比我优秀还比我努力,也得到了一些大佬的建议。

发现持续写文章真的不是件容易的事,担心别人认为没价值,担心想法太幼稚或有漏洞被别人笑话,担心肚子里墨水太少,写不出来... 知道自己思路还不够清晰,逻辑还不够严谨,告诉自己没关系,一些都会好起来的,逆境才能成长嘛,敢写就是好的开始,以此来激励自己持续的学习和思考。

跑题了,说回正题。

这篇文章其实是读者的小小要求,事情是这样的:

读者:“亮哥,看了你的文章很有收获,将文章 Demo 放在本地直接就能运行了,太感谢了”

本人:“哈哈。。。有收获就好,感谢支持 ~ ”

读者:“我有一个小小的要求,现在每个文件都是独立的,我想部署到生产环境,想操作上更便捷,有日志...”

本人:“你说的不是框架吗?现在有很多现成的,看 Swoole 官网推荐的 Swoft、EasySwoole、MixPHP 等。详细的参考这个地址:https://wiki.swoole.com/wiki/page/p-open_source.html”

读者:“看了,发现文件太多了,看不懂,你能帮忙讲解下吗?”

本人:“What?我也是入门呀,要不我搞个简单的轮子吧”

......

于是就有了这篇文章,正好也是对前面 5 篇文章的复习吧。

效果


命令如下:

  • php index.php 可以查看到上图
  • php index.php start 开启服务(Debug模式)
  • php index.php start -d 开启服务(Daemon模式)
  • php index.php status 查看服务状态
  • php index.php reload 服务热加载
  • php index.php stop 关闭服务

index.php 这是文件名称,大家叫什么都可以。

目录结构如下:

├─ controller
│     ├── ...
├─ client
│  ├─ websocket
│     ├── ...
│  ├─ tcp
│     ├── ...
├─ server
│  ├─ config
│     ├── config.php
│  ├─ core
│     ├── Common.php
│     ├── Core.php
│     ├── HandlerException.php
│  ├─ log  -- 需要 读/写 权限
│     ├── ...
├─ index.php

目前就这几个文件,后期研究新的知识点会直接集成到这里面。

说说实现了什么:

1、启动了 WebSocket、HTTP、TCP、UDP 等服务。

2、WebSocket 例子,在 client/websocket 文件夹,实现了视频弹幕。

3、HTTP 例子,在浏览器直接访问:http://ip:port,逻辑代码在 controller 文件夹。

4、TCP 例子,在 client/tcp 文件夹。

5、UDP 例子,直接运行 netcat -u ip port 即可。

6、相关配置,在 server/config 文件夹。

代码

放不全,就放一个主要的文件吧(Core.php)。

<?php

if (!defined('SERVER_PATH')) exit("No Access");

class Core
{
    private static $serv;

    public function __construct() {
        set_error_handler(['HandlerException', 'appError']);
        register_shutdown_function(['HandlerException', 'fatalError']);
    }

    public static function run() {
        static::checkCli();
        static::checkExtension();
        static::showUsageUI();
        static::parseCommand();
    }

    protected static function checkCli() {
        if (php_sapi_name() !== 'cli') {
            exit(output('服务只能运行在 cli sapi 模式下'));
        }
    }

    protected static function checkExtension() {
        if (!extension_loaded('swoole')) {
            exit(output('请安装 swoole 扩展'));
        }
    }

    protected static function showUsageUI() {
        global $argc;
        if ($argc <= 1 || $argc >3) {
            echo PHP_EOL;
            echo "----------------------------------------".PHP_EOL;
            echo "|               Swoole                 |".PHP_EOL;
            echo "|--------------------------------------|".PHP_EOL;
            echo '|    USAGE: php index.php commond      |'.PHP_EOL;
            echo '|--------------------------------------|'.PHP_EOL;
            echo '|    1. start    以debug模式开启服务   |'.PHP_EOL;
            echo '|    2. start -d 以daemon模式开启服务  |'.PHP_EOL;
            echo '|    3. status   查看服务状态          |'.PHP_EOL;
            echo '|    4. reload   热加载                |'.PHP_EOL;
            echo '|    5. stop     关闭服务              |'.PHP_EOL;
            echo "----------------------------------------".PHP_EOL;
            echo PHP_EOL;
            exit;
        }
    }

    protected static function parseCommand() {
        global $argv;
        $command = $argv[1];
        $option  = isset( $argv[2] ) ? $argv[2] : '' ;
        switch ($command) {
            case 'start':
                if ($option === '-d') { //以daemon形式启动
                    get_config(['set@daemonize' => true]);
                }
                self::workerStart();
                break;
            case 'status':
                self::workerStatus();
                break;
            case 'reload':
                self::workerReload();
                break;
            case 'stop':
                self::workerStop();
                break;
            default:
                echo &quo
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇PHP学习之迭代生成器 下一篇[Linux] ssh秘钥对免密码登陆

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目