开发注意事项

由于控制台命令开发,并不像 Web 开发一样在 PHPer 中如此普及,所以该章节针对命令行开发的一些常识,整理说明一下。

1. 命令行开发的分类

命令行开发的分类并不像 Web 开发一样清晰,但 MixPHP 依然根据需求特征进行了分类。

任务处理类开发:

  • 定时任务,如:清理数据、统计数据等。
  • 守护进程,如:消息队列消费处理,数据入库,消息推送,爬取数据等。

服务类开发:

  • WebSocket服务,如: 消息推送、在线聊天、直播弹幕、棋牌游戏等。

2. 各分类对应的开发目录

各类型在框架中对应的目录如下:

├── console                                             Console应用开发目录
│   ├── common                                          公共模块目录
│   │   ├── config                                      公共配置目录
│   │   │   └── database.php                            公共数据库配置
│   │   ├── library                                     公共类库目录
│   │   └── model                                       公共数据模型目录
│   ├── crontab                                         定时任务模块
│   │   ├── command                                     Console应用控制器目录
│   │   ├── config                                      配置目录
│   │   ├── library                                     类库目录
│   │   ├── mix-crontab                                 定时任务入口文件
│   │   └── runtime                                     运行目录 (不可更改)
│   ├── daemon                                          守护进程模块
│   │   ├── command                                     Console应用控制器目录
│   │   ├── config                                      配置目录
│   │   ├── library                                     类库目录
│   │   ├── mix-daemon                                  守护进程入口文件
│   │   └── runtime                                     运行目录 (不可更改)
│   └── websocketd                                      WebSocket模块
│       ├── command                                     Console应用控制器目录
│       ├── config                                      配置目录
│       ├── library                                     类库目录
│       ├── mix-websocketd                              websocketd入口文件
│       ├── model                                       表单模型目录
│       └── runtime                                     运行目录 (不可更改)

3. 开发注意事项

数据库连接处理

定时任务:

定时任务是一次性执行,执行完就结束,所以不需要考虑数据库连接超时问题,数据库连接采用短连接即可。

守护进程:

守护进程实际上就是个一直在持续执行的程序,所以需要考虑数据库连接超时问题,传统框架需要手动使用 try/catch 来重启循环流程,而 MixPHP 不需要,你只需要使用长连接版本的数据库组件即可,MixPHP 会帮你重建连接,但是数据库重启的情况还是需要用户使用 try/catch 来处理。

蜕变为守护进程

PHP 在 CLI 模式下执行,正常是无法蜕变为一个守护进程的,通常是使用以下方法脱离终端在后台运行。

php command.php >/dev/null 2>&1 &

MixPHP 提供了更方便的方法,只需要控制器代码第一行,增加:

public function actionIndex()
{
    // 蜕变为守护进程
    self::daemon();
    // ...
    return 'SUCCESS' . PHP_EOL;
}

该方法依赖 Swoole 扩展,Windows下无法执行。

为了调试方便,开发阶段建议不使用该功能。

如何使用模型

Console 应用与 Web 应用不同的是,不需要对用户输入的数据做效验,所以就不需要表单模型的,因此默认的目录结构中没有 model 目录,但是数据模型是必须的,数据模型在全部模块中都是公用的,所以应该放在 common 模块的 model 之中,因此 Console 应用直接在控制器内使用公共模块的数据模型操作数据库即可。