phpBB 常用 CLI 命令详解

面向真实服务器的 phpBB 3.3.19 命令行工具 phpbbcli.php 实测手册:config、db、cron、extension、fixup、reparser、thumbnail、update、user 九组 26 个子命令逐条给出命令输入与真实回显,并沉淀 user:add 非交互环境报错、config:set-atomic 参数顺序、extension:purge 假成功等真实排障实录。

phpBBphpBB论坛2026/10/22

phpBB 常用 CLI 命令详解

phpBB 的图形化管理后台(ACP)覆盖了绝大多数日常运维动作,但批量化运维、自动化巡检、无浏览器的紧急修复,都要走它自带的命令行工具 bin/phpbbcli.php。本文在真实 Ubuntu 22.04 服务器视角下,对 phpBB 3.3.19 的全部 26 个专有子命令逐条实测:每条命令给出真实输入与真实回显,并把实测中踩到的坑(非交互环境执行 user:add 报错、config:set-atomic 参数顺序、extension:purge 假成功等)沉淀为排障实录。

一、环境信息

本文全部命令与回显均在下表所示环境中实测取得(版本查询日期:2026-10-22):

项目实测值
操作系统Ubuntu 22.04.5 LTS
PHP(CLI)PHP 8.1.2-1ubuntu2.28(cli, NTS)
数据库MariaDB 10.6.23(phpBB 使用 mysqli 驱动连接)
phpBB3.3.19(config:get version 实测值)
论坛规模83 个注册用户、2 篇帖子(SQL 实测)
phpBB 安装目录/var/www/phpbb
CLI 入口/var/www/phpbb/bin/phpbbcli.php
运行用户www-data(与 Web 服务同用户,保证缓存文件读写权限一致)

phpBB 的安装与 Web 侧配置请先阅读本专栏《Ubuntu 22.04 安装 phpBB 指南》与《phpBB 配置参数详解》,本文在其基础上展开。

二、工具概览

phpbbcli.php 是 phpBB 官方自带的控制台入口,基于 Symfony Console 组件构建,位于安装目录的 bin/ 下:

cd /var/www/phpbb
php bin/phpbbcli.php <子命令> [选项] [参数]

按 list 实测,phpBB 3.3.19 共提供 26 个专有子命令,分 9 组,外加 Symfony 自带的 help、list 两个通用命令:

分组子命令用途
cachecache:purge清空全部缓存
configconfig:get / config:set / config:increment / config:delete / config:set-atomic配置项读取与修改
croncron:list / cron:run计划任务查看与手动执行
dbdb:list / db:migrate / db:revert数据库迁移查看、升级、回滚
devdev:migration-tips找出不再被依赖的迁移(开发调试用)
extensionextension:show / extension:enable / extension:disable / extension:purge扩展状态查看与启停、清除
fixupfixup:fix-left-right-ids / fixup:update-hashes树结构修复、旧密码哈希升级
reparserreparser:list / reparser:reparse文本重解析
thumbnailthumbnail:generate / thumbnail:recreate / thumbnail:delete附件缩略图生成、重建、删除
updateupdate:check检查论坛是否为最新版
useruser:add / user:activate / user:delete / user:delete_id / user:reclean用户增删、激活、重清洗

与 ACP 后台相比,CLI 的价值在于:不依赖浏览器与会话、可写进 cron 与自动化脚本、故障时 ACP 不可用也能修复数据。

三、前置条件

  1. 能登录服务器并以安装 phpBB 的系统用户执行命令。phpBB 缓存目录(cache/、store/ 等)属主是 Web 服务用户,建议始终以同一用户运行 CLI,避免缓存文件属主混乱:
su -s /bin/bash www-data -c 'cd /var/www/phpbb && php bin/phpbbcli.php list'
  1. PHP CLI 与 MariaDB 服务正常(php -v、mariadb --version)。
  2. 确认版本与入口:
php bin/phpbbcli.php --version

实测输出:

phpBB Console 3.3.19
  1. 交互模式说明:Symfony Console 默认在「stdin 是终端」时启用交互问答;在 cron、CI、su -c 等非终端场景会自动降级为非交互。个别带问答逻辑的命令(如 user:add)在非交互环境有特殊行为,详见第 4.12 节与 FAQ。

四、命令详解

4.1 命令列表与帮助

查看全部命令:

php bin/phpbbcli.php list

实测输出(完整照抄):

phpBB Console 3.3.19

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --safe-mode       Run in Safe Mode (without extensions).
  -e, --env=ENV         The Environment name.
  -s, --shell           Launch the shell.
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  help                      Displays help for a command
  list                      Lists commands
 cache
  cache:purge               Purge the cache
 config
  config:delete             Deletes a configuration option
  config:get                Gets a configuration option’s value
  config:increment          Increments a configuration option’s integer value
  config:set                Sets a configuration option’s value
  config:set-atomic         Sets a configuration option’s value only if the old matches the current value
 cron
  cron:list                 Prints a list of ready and unready cron jobs.
  cron:run                  Runs all ready cron tasks.
 db
  db:list                   List all installed and available migrations.
  db:migrate                Updates the database by applying migrations.
  db:revert                 Revert a migration.
 dev
  dev:migration-tips        Finds migrations that are not depended upon.
 extension
  extension:disable         Disables the specified extension.
  extension:enable          Enables the specified extension.
  extension:purge           Purges the specified extension.
  extension:show            Lists all extensions in the database and on the filesystem.
 fixup
  fixup:fix-left-right-ids  Repairs the tree structure of the forums and modules.
  fixup:update-hashes       Updates outdated password hashes to be hashed with bcrypt.
 reparser
  reparser:list             Lists the types of text that can be reparsed.
  reparser:reparse          Reparses stored text with the current text_formatter services.
 thumbnail
  thumbnail:delete          Delete all existing thumbnails.
  thumbnail:generate        Generate all missing thumbnails.
  thumbnail:recreate        Recreate all thumbnails.
 update
  update:check              Check if the board is up to date.
 user
  user:activate             Activate (or deactivate) a user account.
  user:add                  Add a new user.
  user:delete               Delete a user account.
  user:delete_id            Delete user accounts by ID.
  user:reclean              Re-clean usernames.

全局选项对每个子命令都生效,常用三个:-v/-vv/-vvv 提升输出详细度(部分命令默认静默,加 -vv 才有实质输出)、-n 禁止交互问答、--safe-mode 在不加载扩展和缓存的环境下运行(扩展出问题时排查用)。

查看单个命令的用法:

php bin/phpbbcli.php help cache:purge

实测输出:

Usage:
  cache:purge

Help:
  Purges all cache files.

4.2 缓存命令 cache:purge

清空论坛全部缓存(数据缓存、模板缓存、s9e 渲染器缓存等)。直接改数据库 phpbb_config 表或手工替换模板文件后,必须执行本命令,改动才会反映到前台:

php bin/phpbbcli.php cache:purge

实测输出:


 [OK] Cache successfully purged.

该命令无参数、无交互,返回码 0。phpBB 配置体系(config.php + phpbb_config 表)与缓存生效关系在《phpBB 配置参数详解》中有完整实验:SQL 直改后前台仍显示旧值,cache:purge 后新值立即生效。

4.3 配置命令 config:get / set / increment / delete / set-atomic

五个子命令直接操作运行时配置(数据存于 phpbb_config 表)。

读取 config:get:

php bin/phpbbcli.php config:get version

实测输出:

3.3.19

加 --no-newline 则输出值后不换行(便于脚本取值):

php bin/phpbbcli.php config:get version --no-newline

实测输出(无换行):

3.3.19

写入 config:set(键不存在会自动创建):

php bin/phpbbcli.php config:set cli_test_key 5

实测输出:


 [OK] Successfully set config cli_test_key

自增 config:increment(整型值 +N):

php bin/phpbbcli.php config:increment cli_test_key 3

实测输出:


 [OK] Successfully incremented config cli_test_key

再次读取,实测从 5 变为 8:

8

删除 config:delete:

php bin/phpbbcli.php config:delete cli_test_key

实测输出:


 [OK] Successfully deleted config cli_test_key.

删除后再读取(注意:报错但退出码仍是 0,见第五节注意事项):

php bin/phpbbcli.php config:get cli_test_key; echo "EXIT=$?"

实测输出:


 [ERROR] Config cli_test_key does not exist
EXIT=0

条件写入 config:set-atomic:仅当「当前值与给定旧值一致」时才写入,用于并发场景下的防覆盖。注意参数顺序是 <key> <旧值> <新值>,旧值在前:

php bin/phpbbcli.php config:set-atomic board_name "phpBB CLI Test Board" "phpBB CLI Board v2"

实测(旧值与当前值一致,写入成功):


 [OK] Successfully set config board_name

读取确认:

phpBB CLI Board v2

旧值不匹配时(实测当前值已是 phpBB CLI Board v2,仍传旧值 phpBB CLI Test Board):

php bin/phpbbcli.php config:set-atomic board_name "phpBB CLI Test Board" "phpBB v3"; echo "EXIT=$?"

实测输出:


 [ERROR] Could not set config board_name
EXIT=1

help config:set-atomic 实测的用法说明,明确标注了 old 在前:

Usage:
  config:set-atomic [options] [--] <key> <old> <new>

Arguments:
  key                   The configuration option’s name
  old                   Current configuration value, use 0 and 1 to specify boolean values
  new                   New configuration value, use 0 and 1 to specify boolean values

配置项含义与修改后的生效路径,见《phpBB 配置参数详解》。

4.4 计划任务命令 cron:list / cron:run

cron:list 把系统任务分为「就绪(到期待跑)」与「未就绪」两组展示:

php bin/phpbbcli.php cron:list

实测输出(21 个任务:3 个就绪 + 18 个未就绪):


Ready tasks:
============

 * cron.task.core.tidy_guest_sessions
 * cron.task.text_reparser.pm_text
 * cron.task.text_reparser.poll_option

Not ready tasks:
================

 * cron.task.core.prune_all_forums
 * cron.task.core.prune_forum
 * cron.task.core.prune_shadow_topics
 * cron.task.core.prune_notifications
 * cron.task.core.version_check
 * cron.task.core.queue
 * cron.task.core.tidy_cache
 * cron.task.core.tidy_database
 * cron.task.core.tidy_plupload
 * cron.task.core.tidy_search
 * cron.task.core.tidy_sessions
 * cron.task.core.purge_oauth_states
 * cron.task.core.tidy_warnings
 * cron.task.text_reparser.poll_title
 * cron.task.text_reparser.post_text
 * cron.task.text_reparser.user_signature
 * cron.task.core.update_hashes
 * cron.task.viglink

cron:run 手动执行所有就绪任务。论坛流量低、依赖服务器 cron 触发 cron/task 入口的场景下,可用它手动兜底:

php bin/phpbbcli.php cron:run; echo "EXIT=$?"

实测输出(成功时没有任何输出,退出码 0):

EXIT=0

4.5 数据库迁移命令 db:list / db:migrate / db:revert

db:list 列出已安装与可用的迁移文件。实测共 340 行输出,开头如下:

php bin/phpbbcli.php db:list

实测输出(前 20 行):


Installed migrations
--------------------

 * \phpbb\viglink\migrations\viglink_ask_admin_wait
 * \phpbb\viglink\migrations\viglink_cron
 * \phpbb\viglink\migrations\viglink_data_v2
 * \phpbb\viglink\migrations\viglink_ask_admin
 * \phpbb\viglink\migrations\viglink_data
 * \phpbb\db\migration\data\v310\topic_sort_username
 * \phpbb\db\migration\data\v310\forgot_password
 * \phpbb\db\migration\data\v310\style_update_p1
 * \phpbb\db\migration\data\v310\extensions_version_check_force_unstable
 * \phpbb\db\migration\data\v310\profilefield_location
 * \phpbb\db\migration\data\v310\acp_prune_users_module
 * \phpbb\db\migration\data\v310\allow_cdn
 * \phpbb\db\migration\data\v310\notifications
 * \phpbb\db\migration\data\v310\jquery_update2
 * \phpbb\db\migration\data\v310\notifications_schema_fix
 * \phpbb\db\migration\data\v310\reset_missing_captcha_plugin

db:migrate 应用所有未安装的迁移,把数据库结构升级到代码对应版本。升级 phpBB 版本、安装/更新扩展后都需要跑:

php bin/phpbbcli.php db:migrate; echo "EXIT=$?"

实测输出:


 [OK] The database update was successful.
EXIT=0

db:revert 回滚指定迁移。<name> 必须写成带前导反斜杠的完整命名空间(与 db:list 显示一致),实测使用「正斜杠缩写」或双反斜杠转义都会报 is not a valid migration(详见 FAQ):

php bin/phpbbcli.php db:revert '\phpbb\db\migration\data\v33x\v3319'; echo "EXIT=$?"

实测输出:

Reverted Data: \phpbb\db\migration\data\v33x\v3319; Time: 0.00 seconds
Reverted Schema: \phpbb\db\migration\data\v33x\v3319; Time: 0.00 seconds

 [OK] The database update was successful.
EXIT=0

回滚是危险动作,务必先备份再操作,回滚后按需重新执行 db:migrate 复原:

php bin/phpbbcli.php db:migrate

实测输出:


 [OK] The database update was successful.

4.6 开发辅助命令 dev:migration-tips

找出「不再被任何其他迁移依赖」的迁移文件,扩展开发者用于判断哪些历史迁移可以考虑合并精简:

php bin/phpbbcli.php dev:migration-tips; echo "EXIT=$?"

实测输出(它直接打印出迁移类的 depends_on() 片段):

                [
                        '\phpbb\db\migration\data\v33x\v3319',
                ];
EXIT=0

日常运维用不到它,仅在编写扩展迁移时参考。

4.7 扩展管理命令 extension:show / enable / disable / purge

四个命令的 <extension-name> 都必须写**「厂商/扩展名」全称**(如 phpbb/viglink),只写 viglink 会被判定为不存在的扩展(实测见 FAQ)。

extension:show 列出已启用、已停用、仅安装在文件系统三组扩展:

php bin/phpbbcli.php extension:show

实测输出(phpBB 3.3.19 自带官方 viglink 扩展并处于启用态):


Enabled
-------

 * phpbb/viglink

Disabled
--------


Available
---------

extension:enable 启用扩展(自动执行其数据库迁移、写入权限等初始化数据):

php bin/phpbbcli.php extension:enable phpbb/viglink; echo "EXIT=$?"

实测输出:


 [OK] Successfully enabled extension phpbb/viglink
EXIT=0

对已启用扩展重复执行会报错:


 [ERROR] Extension phpbb/viglink is already enabled
EXIT=1

extension:disable 停用扩展(保留数据):

php bin/phpbbcli.php extension:disable phpbb/viglink; echo "EXIT=$?"

实测输出:


 [OK] Successfully disabled extension phpbb/viglink
EXIT=0

extension:purge 清除扩展:执行其卸载清理逻辑,删除其迁移记录与专属数据,但保留文件系统中的代码(show 中移到 Available 组)。完整「停用 → 清除 → 重新启用」实测:

php bin/phpbbcli.php extension:purge phpbb/viglink; echo "EXIT=$?"

实测输出:


 [OK] Successfully purged extension phpbb/viglink
EXIT=0

清除后验证:extension:show 中 phpbb/viglink 从 Enabled 移到 Available;SQL 查库确认其 5 条迁移记录已清空(phpbb_migrations 中 LIKE '%viglink%' 为 0 行)。重新启用即重装数据:

php bin/phpbbcli.php extension:enable phpbb/viglink

实测输出:


 [OK] Successfully enabled extension phpbb/viglink

注意:purge 只清扩展自身数据,phpBB 核心拥有的相关配置键(如 allow_viglink_phpbb)实测仍保留在 phpbb_config 表中。

4.8 修复命令 fixup:fix-left-right-ids / fixup:update-hashes

fixup:fix-left-right-ids 重建版面与 ACP 模块的左右值树结构。版面排序异常、ACP 菜单错乱时的修复手段:

php bin/phpbbcli.php fixup:fix-left-right-ids; echo "EXIT=$?"

实测输出:


 [OK] Successfully repaired the tree structure of the forums and modules.
EXIT=0

fixup:update-hashes 把老版本算法存储的密码哈希批量升级为 bcrypt(用户下次登录时自动完成透明转换,此命令用于主动批量处理):

php bin/phpbbcli.php fixup:update-hashes; echo "EXIT=$?"

实测输出(本论坛无待升级哈希,进度条一闪而过):

    0 [>---------------------------]Successfully updated outdated password hashes to bcrypt.
EXIT=0

4.9 文本重解析命令 reparser:list / reparser:reparse

phpBB 把帖子、私信等富文本解析结果缓存在数据库中;BBCode 扩展规则变化或数据修复后,可对指定类型文本全量重解析。

reparser:list 列出全部可重解析的文本类型(实测 9 项):

php bin/phpbbcli.php reparser:list

实测输出:


Available reparsers:
--------------------

 * contact_admin_info
 * forum_description
 * forum_rules
 * group_description
 * pm_text
 * poll_option
 * poll_title
 * post_text
 * user_signature

reparser:reparse 执行重解析,带实时进度条:

php bin/phpbbcli.php reparser:reparse post_text; echo "EXIT=$?"

实测输出:


Reparsing post_text (range 1..2)
--------------------------------



    0/2 ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░    0%
        Reparsing post_text... < 1 sec/< 1 sec 12.0 MiB

    2/2 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  100%
        Reparsing post_text (range 1..2) < 1 sec/< 1 sec 20.0 MiB


 [OK] Reparsing ended with success
EXIT=0

4.10 附件缩略图命令 thumbnail:generate / recreate / delete

三个命令处理附件缩略图:generate 补齐缺失的、recreate 全部重建、delete 全部删除。实测论坛尚无带缩略图的附件,三个命令都给出 WARNING 而非报错:

php bin/phpbbcli.php thumbnail:generate; echo "EXIT=$?"

实测输出:


Generating thumbnails
---------------------

 [WARNING] No thumbnails to generate.
EXIT=0
php bin/phpbbcli.php thumbnail:recreate; echo "EXIT=$?"

实测输出:


Deleting thumbnails
-------------------

 [WARNING] No thumbnails to delete.


Generating thumbnails
---------------------

 [WARNING] No thumbnails to generate.
EXIT=0
php bin/phpbbcli.php thumbnail:delete; echo "EXIT=$?"

实测输出:


Deleting thumbnails
-------------------

 [WARNING] No thumbnails to delete.
EXIT=0

4.11 版本检查命令 update:check

检查论坛是否为官方最新稳定版。默认静默——已是最新版时无任何输出、退出码 0:

php bin/phpbbcli.php update:check; echo "EXIT=$?"

实测输出:

EXIT=0

加 -vv 才能看到详细信息:

php bin/phpbbcli.php update:check -vv; echo "EXIT=$?"

实测输出:


phpBB core
==========

 ! [NOTE] Current version: 3.3.19

 [OK] The board is up to date.
EXIT=0

写成巡检脚本时判断退出码即可:非 0 表示有可用更新或检查失败。

4.12 用户管理命令 user:add / activate / delete / delete_id / reclean

user:add 命令行创建用户。help user:add 实测用法:

Usage:
  user:add [options]

Options:
  -U, --username=USERNAME  Username of the new user
  -P, --password=PASSWORD  Password of the new user
  -E, --email=EMAIL        E-mail address of the new user
      --send-email         Send account activation email to the new user (not sent by default)
  -h, --help               Display this help message
  -q, --quiet              Do not output any message
  -V, --version            Display this application version
      --ansi               Force ANSI output
      --no-ansi            Disable ANSI output
  -n, --no-interaction     Do not ask any interactive question

排障实录(重要):在 cron、su -c 等非终端(stdin 不是 TTY)环境下,即使 -U/-P/-E 三个参数都给全,实测仍然失败:

php bin/phpbbcli.php user:add --username cliuser --password q1w2e3r4 --email cliuser@example.com; echo "EXIT=$?"

实测输出:

PHP Warning:  Trying to access array offset on value of type null in /var/www/phpbb/includes/functions_user.php on line 1544
PHP Warning:  Trying to access array offset on value of type null in /var/www/phpbb/includes/functions_user.php on line 1544
PHP Warning:  Trying to access array offset on value of type null in /var/www/phpbb/includes/functions_user.php on line 1544
PHP Warning:  Trying to access array offset on value of type null in /var/www/phpbb/includes/functions_user.php on line 1544
PHP Warning:  Trying to access array offset on value of type null in /var/www/phpbb/includes/functions_user.php on line 1544
PHP Warning:  Trying to access array offset on value of type null in /var/www/phpbb/includes/functions_user.php on line 1544
PHP Warning:  Undefined array key "user_email" in /var/www/phpbb/includes/functions_user.php on line 1937

 [ERROR] The username you entered is too short.
         The password you entered is too short.
         The email address you entered is too short.
EXIT=1

报错信息极具误导性——看起来像用户名太短,实际根因在 Symfony Console 的 configureIO():stdin 非 TTY 且未设置 SHELL_INTERACTIVE 环境变量时,输入被标记为非交互,命令的 interact() 阶段被整体跳过,负责承接选项值的内部数据结构未初始化,校验阶段全部拿到空值,才产生三条 "too short"。修复方式是显式声明交互环境:

SHELL_INTERACTIVE=1 php bin/phpbbcli.php user:add --username cliuser --password q1w2e3r4 --email cliuser@example.com; echo "EXIT=$?"

实测输出(创建成功;首行 Warning 是该命令在成功路径上也会出现的已知噪音,不影响结果):

PHP Warning:  Undefined array key "user_email" in /var/www/phpbb/includes/functions_user.php on line 1937

 [OK] Successfully added user cliuser.
EXIT=0

实测查库:新用户 user_type=0(普通用户)、user_inactive_reason=0,即 CLI 创建的账号默认就是激活状态,无需再去 ACP 手工激活。

user:activate 激活或停用账号。停用(-d / --deactivate):

php bin/phpbbcli.php user:activate cliuser -d; echo "EXIT=$?"

实测输出:


 [OK] User deactivated successfully.
EXIT=0

实测查库该用户 user_inactive_reason 由 0 变为 3。重新激活:

php bin/phpbbcli.php user:activate cliuser; echo "EXIT=$?"

实测输出:


 [OK] User activated successfully.
EXIT=0

对不存在用户执行:

php bin/phpbbcli.php user:activate nosuchuser; echo "EXIT=$?"

实测输出:


 [ERROR] The requested user does not exist.
EXIT=1

user:delete 按用户名删除账号(加 --delete-posts 连同其帖子一并删除,默认保留帖子):

php bin/phpbbcli.php user:delete cliuser; echo "EXIT=$?"

实测输出:


 [OK] User deleted successfully.
EXIT=0

缺参数时(实测退出码 1):


  Not enough arguments (missing: "username").


user:delete [--delete-posts] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [--safe-mode] [-e|--env ENV] [--] <command> <username>

user:delete_id 按用户 ID 批量删除,可一次传多个 ID。实测(重建测试用户 cliuser2 得到 ID 85 后执行):

php bin/phpbbcli.php user:delete_id 85; echo "EXIT=$?"

实测输出:


    0/1 ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░    0%
                         < 1 sec/< 1 sec 12.0 MiB

    1/1 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  100%
                         < 1 sec/< 1 sec 14.0 MiB
 [OK] Successfully deleted user IDs.
EXIT=0

user:reclean 批量重清洗全站用户名(去除非法字符、统一格式),不接用户名参数。实测:

php bin/phpbbcli.php user:reclean; echo "EXIT=$?"

实测输出(进度条实测自 0/83 逐帧推进至 83/83,中间帧省略):


Re-cleaning usernames
---------------------

    0/83 ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░    0%
                         < 1 sec/< 1 sec 12.0 MiB

……中间进度帧省略(实测 8/83 → 80/83 逐帧推进)……

    83/83 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  100%
                         < 1 sec/< 1 sec 14.0 MiB


 [OK] Re-cleaning complete. No usernames needed to be cleaned.
EXIT=0

五、注意事项

  1. 统一运行身份:始终用 Web 服务同一用户(本文为 www-data)执行 CLI,避免 cache/、store/ 目录下缓存文件属主混杂导致 Web 侧写缓存失败。
  2. 退出码不统一:多数命令失败时退出码为 1,但 config:get 对不存在的键虽然打印 [ERROR],实测退出码仍是 0。脚本判断不能只依赖退出码,必要时解析输出文本。
  3. 部分命令默认静默:cron:run、update:check 成功时零输出,config:get 成功时直接打印值;自动化里要先想清楚「无输出 = 成功」还是「加 -vv 才有输出」。
  4. 缓存一致性:config:set* 会同步刷新配置缓存;但绕过 CLI 直接改数据库 phpbb_config 表后,必须 cache:purge,否则 CLI 的 config:get 与前台都可能读到旧值。
  5. 危险命令先备份:db:revert、fixup:*、thumbnail:delete、user:delete* 都直接改库或删文件,执行前先备份数据库与 files/ 目录;db:revert 执行过程中会自动清空缓存(源码内置 cache->purge())。
  6. 扩展名必须写全称:extension:* 系列一律使用 厂商/扩展名(如 phpbb/viglink),且 purge 前需先 disable(对启用中的扩展 purge 无效)。
  7. 非交互环境:cron/CI 中执行带交互逻辑的命令(当前只有 user:add)必须带 SHELL_INTERACTIVE=1,否则报出与真实原因无关的错误(见 FAQ 第一条)。

六、常见问题

Q1:user:add 参数给全了,为什么还报 "The username you entered is too short."?

这是 phpBB 3.3.19 CLI 最典型的误导性报错。真实原因不是用户名长度,而是非 TTY 环境下 Symfony Console 自动关闭了交互,命令内部承接选项值的数据结构未初始化,三项校验全部按空值处理。三种解决办法(实测均有效):① 命令前加 SHELL_INTERACTIVE=1;② 在真实终端(TTY)中执行;③ 改用 Web 注册流程。顺带一提:即使成功路径,实测也会打出一条 Undefined array key "user_email" 的 PHP Warning,属已知噪音,不影响创建结果。

Q2:config:set-atomic 总是报 "Could not set",值明明是对的?

先检查参数顺序:该命令是 config:set-atomic <key> <旧值> <新值>,旧值在前、新值在后(help 输出可确认)。本文实测中即因把新值写在第 2 位,导致「成功」与「失败」两条路径反复颠倒。可用 config:get 先取当前值,再把它作为第 2 参数传入。

Q3:config:get 报 "Config xxx does not exist",但数据库里这个键明明存在?

CLI 的运行时配置优先从缓存加载,缓存条目不完整时就会出现「数据库有、CLI 读不到」。实测过一个衍生怪象:这种状态下 config:set-atomic 可能报 [OK] 但数据库并未更新(源码在该分支会走 INSERT 补偿路径并返回成功)。执行一次 cache:purge 重建缓存后即恢复正常。判断数据真实状态时,以数据库直查为准。

Q4:extension:purge 显示 "Successfully purged",但扩展数据一点没删?

大概率是扩展名写成了裸名(如 viglink)。purge 命令对无效名称不会报错,而是走「未启用 → 清除」的成功分支,输出 [OK] 但实际什么都没做(实测源码中成功分支只写日志后直接返回成功)。必须写全称 phpbb/viglink,并且先 extension:disable 再 purge;purge 后用 extension:show 和数据库直查双重验证。

Q5:db:revert 报 "is not a valid migration"?

迁移名必须与 db:list 显示的完全一致:带前导反斜杠的完整命名空间,如 '\phpbb\db\migration\data\v33x\v3319'。实测「正斜杠简写」(help 文本声称可用)与双反斜杠转义都会被拒。命令行传参时用单引号包裹,避免 shell 吞掉反斜杠。

Q6:cron:run 执行后没有任何输出,是失败了吗?

不是。实测 cron:run 在没有就绪任务或任务全部执行成功时都输出为空、退出码 0。用 cron:list 查看当前就绪任务,用退出码判断执行结果即可。

Q7:CLI 写入或匹配中文值时要注意什么?

通过 mariadb 命令行直查/直改中文配置时,连接默认字符集不是 utf8mb4,中文会显示或匹配异常,需加 --default-character-set=utf8mb4(详见《Ubuntu 22.04 安装 phpBB 指南》FAQ)。phpBB CLI 自身经 mysqli 驱动连接,读写中文配置值实测正常,但 config:set-atomic 的旧值匹配发生在 SQL 层,建议中文键值尽量走 ACP 或 SQL(utf8mb4 连接)+ cache:purge,减少脚本传参带来的编码变量。

七、参考链接