ThinkCMF命令行实战:自动化后台任务

早安!接上回,既然我们之前聊了 API 和中间件,今天我们来攻克一个让很多 PHP 开发者(特别是习惯了写网页的开发者)感到陌生但极其强大的领域:ThinkCMF 的命令行模式(Console)与定时任务

在实际项目中,你是否遇到过这样的尴尬:

  • 想批量发送 10,000 封营销邮件,结果网页转了 30 秒就报 504 Gateway Time-out
  • 需要每天凌晨 2 点自动统计昨天的报表,却只能苦哈哈地定个闹钟爬起来点一下"生成"按钮?

📅 今日知识点:利用 Console 命令行处理"后台重活"

核心逻辑:

PHP 不仅仅是为了响应浏览器请求(HTTP)而生的,它在命令行(CLI)模式下同样强大。ThinkCMF(基于 ThinkPHP)内置了强大的 Console 组件,允许你编写自定义指令,跳过 Nginx/Apache 的超时限制,直接在服务器后台跑任务。

1. 为什么要用命令行?
  • 无超时限制:脚本可以跑几分钟甚至几小时,适合数据迁移、备份。
  • 自动化:配合 Linux 的 Crontab,实现"无人值守"的自动化运行。
  • 安全:这些逻辑不暴露在公网 URL 上,黑客扫不到。
2. 实战:写一个"清理过期日志"的命令

假设我们需要一个命令,清理 30 天前的临时文件。

第一步:创建命令类

app/command 目录下新建 ClearLogs.php(如果是 ThinkCMF 5.1,目录可能略有不同,但逻辑一致):

php 复制代码
namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;

class ClearLogs extends Command
{
    // 配置指令
    protected function configure()
    {
        // setName 设置指令名称,例如 php think cmf:clear_logs
        $this->setName('cmf:clear_logs')
             ->setDescription('清理30天前的系统日志文件');
    }

    // 执行逻辑
    protected function execute(Input $input, Output $output)
    {
        $output->writeln("开始清理任务...");
        
        // 模拟清理逻辑
        // 这里可以调用你的 Service 或 Model
        // $count = \app\portal\service\LogService::clearOld(30);
        
        // 假装清理了 100 条
        $output->writeln("任务完成!成功清理了 100 条过期日志。");
    }
}

第二步:注册指令

config/console.php 中注册你的命令:

php 复制代码
return [
    'commands' => [
        'app\command\ClearLogs',
    ],
];

第三步:运行它!

打开终端(Terminal),进入项目根目录,输入:

bash 复制代码
php think cmf:clear_logs

你会看到屏幕输出:"任务完成!成功清理了 100 条过期日志。" ------ 不需要浏览器,瞬间完成!


💡 进阶:如何让它"自动"运行(Crontab)?

写好了命令,怎么让它每天凌晨 2 点自己动?这时候需要配合 Linux 的 Crontab。

输入 crontab -e,添加一行:

bash 复制代码
# 每天凌晨 02:00 执行
0 2 * * * /usr/bin/php /www/wwwroot/yoursite/think cmf:clear_logs >> /tmp/cron_log.txt 2>&1
  • /usr/bin/php:你的 PHP 执行路径。
  • /www/wwwroot/yoursite/think:你的项目根目录下的 think 文件。

⚠️ 开发小贴士

  1. 内存泄漏 :如果你在命令行里做死循环(比如常驻内存的消息队列消费者),记得用 unset() 及时释放大数组,否则内存会爆炸。
  2. 权限问题 :命令行运行的用户通常是 root,生成的日志文件权限可能会变成 root,导致 Web 端(通常是 www 用户)无法写入。记得处理好文件权限。

今日金句: 浏览器是给用户看的,命令行才是服务器的"后台总控室"。学会 CLI,你才能掌控服务器的每一分钟。


相关推荐
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森6 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜7 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB8 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode9 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户03284722207010 天前
如何搭建本地yum源(上)
运维
大树8813 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠13 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质13 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务