守护进程

守护进程实际上就是个一直在持续执行的程序,正常情况下,代码执行完该进程就会结束,而守护进程就是使用一个循环使该进程一直处于工作状态,PHP 在 CLI 下启动的程序,默认是单进程单线程的,MixPHP 可以实现多进程编程,请查看“多进程队列服务”章节。

使用场景

单进程:

如:开发调试。

当 MixPHP 拥有多进程开发能力后,单进程开发存在的意义可能就是开发阶段在 Windows 下,由于不支持 Swoole,先使用单进程把业务逻辑开发完成,上线正式环境时再转换为多进程处理。

多进程:

如:消息队列(MQ)消费处理,消息推送,数据采集等。

开发目录

├── console                                             Console应用开发目录
│   ├── daemon                                          守护进程模块
│   │   ├── command                                     Console应用控制器目录
│   │   ├── config                                      配置目录
│   │   ├── library                                     类库目录
│   │   ├── mix-daemon                                  守护进程入口文件
│   │   └── runtime                                     运行目录 (不可更改)

入口文件

执行完 install.sh 后,入口文件可在任意位置执行。

mix-daemon <路由> [-option1 --option2 --option3=value ...]

控制器范例

这是一个单进程守护进程的范例。

<?php

namespace console\daemon\command;

use mix\console\Controller;

/**
 * 这是一个单进程守护进程的范例
 * @author 刘健 <coder.liu@qq.com>
 */
class SingleController extends Controller
{

    // 是否后台运行
    protected $d = false;

    // 启动守护进程
    public function actionStart()
    {
        // 蜕变为守护进程
        if ($this->d) {
            self::daemon();
        }
        // 模型内使用长连接版本的数据库组件,这样组件会自动帮你维护连接不断线
        $tableModel = new \console\common\model\TableModel();
        // 循环执行任务
        while (true) {
            // 执行业务代码
            // ...
        }
    }

}

启动与查看

在命令行使用以下命令启动。

mix-daemon single/start

启动后使用如下 Linux 命令管理进程。

// 查找进程
ps -ef | grep single

// 结束进程
kill <PID>