Dolibarr 24.0 常用 CLI 命令与工具详解

Dolibarr 24.0.2 命令行工具全量实测:cron_run_jobs 计划任务执行器、admintool 口令加解密、群发/催款/文档重生成等 17 个 scripts 脚本的用法与真实回显,含 crontab 部署、模块启用前置与失效脚本排障实录。

DolibarrDolibarrERP2026/10/23

Dolibarr 24.0 常用 CLI 命令与工具详解

目标:系统讲清 Dolibarr 24.0.2 随包发布的命令行工具库(scripts/ 目录,17 个脚本、13 个业务域),逐一给出调用形态、参数说明与真实回显,覆盖计划任务执行器、管理员工具(口令加解密)、邮件群发、单据重生成、LDAP 同步等核心场景。已在 Ubuntu 22.04.5 LTS 实测服务器(PHP 8.1.2、Dolibarr 24.0.2、程序根 /var/www/dolibarr)逐条执行验证。

输出阅读说明:Dolibarr CLI 脚本运行时会在横幅里打印执行机主机名,形如 - 2026-10-23T00:42:28Z - <服务器主机名>——该字段是本机 hostname 命令的取值,每台机器不同,下文所有输出统一以 <服务器主机名> 表示。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • Dolibarr:24.0.2(官方 tar.gz 安装,安装流程见本站 《Ubuntu 22.04 安装 Dolibarr 24.0 指南》)
  • PHP CLI:/usr/bin/php,版本 8.1.2-1ubuntu2.28(与 Web 侧同一 PHP)
  • 程序根:/var/www/dolibarr/htdocs;脚本库:/var/www/dolibarr/scripts
  • 数据根:/var/www/dolibarr/documents(install.lock 已生成,应用已初始化)
  • 计划任务密钥(llx_const 表 CRON_KEY,实测值):cronkey-q1w2e3r4

二、工具概览

Dolibarr 没有单一的总入口命令,CLI 能力以"每域一脚本"的形式分布在 scripts/ 目录。实测目录全貌:

ls /var/www/dolibarr/scripts/

实测输出:

admin
ai
bank
blockedlog
clicktodial
company
contracts
cron
doc
emailings
invoices
members
odt2pdf
product
user
website
withdrawals

全部脚本清单与用途(实测逐个执行归纳):

脚本用途调用形态
cron/cron_run_jobs.php计划任务执行器(框架级,最重要)php cron_run_jobs.php <key> <user|firstadmin> [cronjobid] [--force]
admin/admintool.php管理员工具:conf.php 口令加解密/查看php admintool.php showpass|encodepass|decodepass
emailings/mailing-send.php发送邮件群发任务php mailing-send.php (ID_MAILING|all) [userlogin] [maxnbofemails]
emailings/reset-invalid-emails.php重置无效邮箱收件人php reset-invalid-emails.php <文件> <type> [test|confirm]
invoices/rebuild_merge_pdf.php重建/合并发票等 PDFphp rebuild_merge_pdf.php mode=invoice filter=all
invoices/email_unpaid_invoices_to_customers.php未付发票催款邮件(客户)php ... (test|confirm) (thirdparties|contacts) [delay] [after]
invoices/email_unpaid_invoices_to_representatives.php未付发票提醒(销售)php ... (test|confirm) [delay]
contracts/email_expire_services_to_customers.php服务到期提醒(客户)php ... (test|confirm) (thirdparties|contacts) [delay] [after]
contracts/email_expire_services_to_representatives.php服务到期提醒(销售)php ... (test|confirm) [delay]
doc/regenerate_docs.php重生成文档目录下的 PDFphp regenerate_docs.php <子目录> (test|confirm)
product/regenerate_thumbs.php重生成商品图片缩略图php regenerate_thumbs.php <子目录>
product/migrate_picture_path.php / user/migrate_picture_path.php图片路径迁移(旧版本升级用)php migrate_picture_path.php product|user
website/regenerate-pages.php重生成网站模块静态页php regenerate-pages.php (test|confirm) <site> [nbmaxrecord]
bank/export-bank-receipts.php导出银行对账单php export-bank-receipts.php <账户> <批次|all|empty> <格式>
blockedlog/check_blockedlog.php区块化日志(不可抵赖日志)完整性校验php check_blockedlog.php <option>
user/sync_users_ldap2dolibarr.php 等 9 个 sync_* 脚本用户/会员/组 与 LDAP 双向同步见 4.11 节
odt2pdf/odt2pdf.shODT 模板转 PDF(shell 辅助)sh odt2pdf.sh <文件> [转换器]
ai/purge_logs.phpAI 模块日志清理⚠️ 24.0.2 实测存在引用路径错误(见 4.14 节)

统一调用模式:php /var/www/dolibarr/scripts/<域>/<脚本>.php [参数]。所有脚本启动时经框架引导(读取 conf/conf.php、连数据库),因此必须在已初始化的实例上运行;绝大多数脚本不带参数执行时会打印 Usage(本文各节实测),自带用法说明。

三、前置条件

  1. 已完成安装与初始化(脚本要连库,空实例跑不了):
ls /var/www/dolibarr/documents/install.lock && php -v | head -1

实测输出:

/var/www/dolibarr/documents/install.lock
PHP 8.1.2-1ubuntu2.28 (cli) (built: Oct 19 2026 18:54:45) (NTS)
  1. 模块启用前置:多数业务脚本要求对应模块已启用,否则直接拒绝(实测见 4.2/4.5 节)。当前实例已启用模块实测:
mariadb -udolibarr -pq1w2e3r4 dolibarr \
  -e "SELECT name FROM llx_const WHERE name LIKE 'MAIN_MODULE_%' AND value='1';"

实测输出:

name
MAIN_MODULE_AGENDA
MAIN_MODULE_CRON
MAIN_MODULE_EXPORT
MAIN_MODULE_FCKEDITOR
MAIN_MODULE_IMPORT
MAIN_MODULE_USER
  1. 运行身份建议:与 Web 相同的 www-data 身份执行,避免生成文件属主错乱(sudo -u www-data php scripts/...)。本文为便于观测以 root 执行,读者复现时注意 documents/ 下新文件属主。
  2. 提示:脚本横幅里的 TZ server = UTC 来自 PHP CLI 的 date.timezone,Web 与 CLI 的时区各自独立配置,需要一致时改 /etc/php/8.1/cli/php.ini。

四、各工具详解

4.1 cron/cron_run_jobs.php:计划任务执行器(核心)

这是 Dolibarr 框架级 CLI:界面「计划任务」模块里配置的所有定时作业(发提醒邮件、清理临时文件、本地备份等),都由它周期性执行,也是生产环境 crontab 的唯一挂载点。

不带参数执行(打印用法):

cd /var/www/dolibarr
php scripts/cron/cron_run_jobs.php

实测输出:

***** cron_run_jobs.php (24.0.2) pid=14637 - 2026-10-23T00:42:28Z - <服务器主机名> *****
Usage: cron_run_jobs.php securitykey userlogin|'firstadmin' [cronjobid] [--force]

The script return 0 when everything worked successfully.

On Linux system, you can have cron jobs ran automatically by adding an entry into cron file.

密钥错误被拒(第一个参数必须是 llx_const 里 CRON_KEY 的值):

php scripts/cron/cron_run_jobs.php badkey firstadmin

实测输出:

***** cron_run_jobs.php (24.0.2) pid=14639 - 2026-10-23T00:42:28Z - <服务器主机名> *****
Usage: cron_run_jobs.php securitykey userlogin|'firstadmin' [cronjobid] [--force]

The script return 0 when everything worked successfully.

输出解读:密钥不对时脚本不报"密钥错误"而是静默回落到 Usage 行——排查时先核对 CRON_KEY 常量值,再怀疑其他。

真实运行(密钥正确,firstadmin 表示自动定位第一个管理员):

php scripts/cron/cron_run_jobs.php cronkey-q1w2e3r4 firstadmin

实测输出:

***** cron_run_jobs.php (24.0.2) pid=14651 - userlogin=firstadmin - 2026-10-23T00:42:37Z - <服务器主机名> *****
TZ server = UTC - set in PHP ini /etc/php/8.1/cli/php.ini
First admin user found is login 'admin', entity 0
cron_run_jobs.php search qualified job using filter: []
cron_run_jobs.php cronjobid: 3 priority=50 entity=0 label=PurgeDeleteTemporaryFilesShort - not qualified (datenextrunok=0, datestartok=1, dateendok=1)
cron_run_jobs.php cronjobid: 4 priority=90 entity=0 label=MakeLocalDatabaseDumpShort - not qualified (datenextrunok=0, datestartok=1, dateendok=1)
cron_run_jobs.php cronjobid: 1 priority=10 entity=1 label=SendEmailsReminders - qualified - Result of run_jobs OK result = 1 - Job re-scheduled
cron_run_jobs.php cronjobid: 2 priority=10 entity=1 label=SendSmsReminders - qualified - Result of run_jobs OK result = 1 - Job re-scheduled
***** cron_run_jobs.php end - 2026-10-23T00:42:37Z - <服务器主机名> *****

输出解读:脚本逐个评估任务队列——qualified 表示本轮到期执行(SendEmailsReminders/SendSmsReminders 执行成功并重排下次运行时间),not qualified (datenextrunok=0) 表示未到下次计划时间。任务清单存在 llx_cronjob 表,本实例实测:

mariadb -udolibarr -pq1w2e3r4 dolibarr -e "SELECT rowid, label, priority, entity FROM llx_cronjob ORDER BY rowid;"

实测输出:

rowid   label   priority        entity
1       SendEmailsReminders     10      1
2       SendSmsReminders        10      1
3       PurgeDeleteTemporaryFilesShort  50      0
4       MakeLocalDatabaseDumpShort      90      0
5       MakeSendLocalDatabaseDumpShort  91      0
6       CleanUnfinishedCronjobShort     10      0

指定任务强制执行:cronjobid 与 --force 连用可无视计划时间立即跑某个任务(--force 不带任务 ID 会报参数错误):

php scripts/cron/cron_run_jobs.php cronkey-q1w2e3r4 admin 1 --force

实测输出:

***** cron_run_jobs.php (24.0.2) pid=14766 - userlogin=admin - 2026-10-23T00:47:52Z - <服务器主机名> *****
TZ server = UTC - set in PHP ini /etc/php/8.1/cli/php.ini
cron_run_jobs.php search qualified job using filter: {"t.rowid":"1"}
cron_run_jobs.php cronjobid: 1 priority=10 entity=1 label=SendEmailsReminders - qualified - Result of run_jobs OK result = 1 - Job re-scheduled
***** cron_run_jobs.php end - 2026-10-23T00:47:52Z - <服务器主机名> *****

生产 crontab 部署(官方推荐每 5 分钟一轮),crontab -e 加入:

*/5 * * * * www-data /usr/bin/php /var/www/dolibarr/scripts/cron/cron_run_jobs.php cronkey-q1w2e3r4 firstadmin > /dev/null 2>&1

⚠️ 注意:conf.php 中 $dolibarr_cron_allow_cli 默认 0(示例默认值),部署系统 crontab 前置为 '1',否则 CLI 触发被框架拒绝。

4.2 emailings/mailing-send.php 与 reset-invalid-emails.php:邮件群发

mailing-send.php 执行界面里创建的群发任务(Emailing 模块)。模块未启用时的实测行为(本实例未启用 Emailing):

php /var/www/dolibarr/scripts/emailings/mailing-send.php 999

实测输出:

Module Emailing not enabled

模块启用后的用法(无参数执行打印):

php /var/www/dolibarr/scripts/emailings/mailing-send.php

实测输出:

Usage: mailing-send.php (ID_MAILING|all) [userloginforsignature] [maxnbofemails]

参数说明:ID_MAILING 为群发任务 ID(或 all 全部待发任务);userloginforsignature 指定签名用户;maxnbofemails 限制本轮发送封数(配合系统 crontab 高频小批量发送,避免超时)。

reset-invalid-emails.php(把名单里无效邮箱的收件人置为不接收,避免反复弹回):

php /var/www/dolibarr/scripts/emailings/reset-invalid-emails.php

实测输出:

Usage: reset-invalid-emails.php inputfile-with-invalid-emails type [test|confirm]
- inputfile-with-invalid-emails is a file with list of invalid email
- type can be 'all' or 'thirdparties', 'contacts', 'members', 'users'

⚠️ 注意:两个脚本都默认 test 之外还有 confirm 一级的实际执行动作,先 test 验证范围再 confirm,是邮件类脚本的通用安全惯例。

4.3 invoices/rebuild_merge_pdf.php:单据 PDF 重建与合并

用途:批量重建发票/订单/报价单 PDF,或把多份单据合并为一个 PDF(归档场景)。无参数执行:

php /var/www/dolibarr/scripts/invoices/rebuild_merge_pdf.php

实测输出:

***** rebuild_merge_pdf.php (24.0.2) pid=14643 *****
Rebuild PDF files for some invoices/orders/proposals and/or merge PDF files into one.

To build/merge PDF for all documents, use filter=all
Usage:   rebuild_merge_pdf.php mode=invoice filter=all
To build/merge PDF for documents in a date range:
Usage:   rebuild_merge_pdf.php mode=invoice filter=date dateafter datebefore
To build/merge PDF for invoices with at least one payment in a date range:

输出节选(实测首部):后续还有按付款日期筛选等两行用法变体。mode 支持 invoice/order/proposal 等单据类型,生成文件落在 documents/<类型>/ 目录。

配套催款脚本(无参数执行):

php /var/www/dolibarr/scripts/invoices/email_unpaid_invoices_to_customers.php

实测输出:

Usage: email_unpaid_invoices_to_customers.php (test|confirm) (thirdparties|contacts) [delay] [after]

Send an email to customers to remind all unpaid customer invoices.
If you choose 'test' mode, no emails are sent.
If you add param delay (nb of days), only invoice with due date < today + delay are included.

给销售代表的变体 email_unpaid_invoices_to_representatives.php 用法为 (test|confirm) [delay](实测输出仅一行 Usage,同结构)。

4.4 contracts/email_expire_services_*:服务到期提醒

无参数执行:

php /var/www/dolibarr/scripts/contracts/email_expire_services_to_customers.php

实测输出:

Usage: email_expire_services_to_customers.php (test|confirm) (thirdparties|contacts) [delay] [after]

Send an email to customers to remind all contracts services to expire or expired.
If you choose 'test' mode, no emails are sent.
If you add param delay (nb of days), only services with expired date < today + delay are included.

给销售代表的变体 email_expire_services_to_representatives.php 用法为 (test|confirm) [delay](实测输出一行 Usage)。典型生产用法是挂 crontab 每日跑一次 test 核对、确认范围后切 confirm。

4.5 doc/regenerate_docs.php:文档 PDF 重生成

重生成 documents/ 下指定业务目录的 PDF(模板改版后批量刷新)。无参数执行:

php /var/www/dolibarr/scripts/doc/regenerate_docs.php

实测输出:

***** regenerate_docs.php (24.0.2) pid=14673 - dir=/var/www/dolibarr/documents *****
Usage:    regenerate_docs.php  subdirtoscan (test|confirm)
Example:  regenerate_docs.php  propale test

按示例传参实测(本实例未启用报价单模块):

php /var/www/dolibarr/scripts/doc/regenerate_docs.php propale test

实测输出:

Error, module not enabled
0 objects processed
0 objects with errors

输出解读:横幅显示扫描根目录 dir=/var/www/dolibarr/documents;Error, module not enabled 说明目标业务目录对应的模块未启用(报价单模块被禁用),脚本给出统计后安全退出——模块启用与否是这类脚本的硬前置(见第三节实测的启用清单)。

4.6 product/regenerate_thumbs.php:缩略图重生成

用途:扫描商品图片目录重建缩略图(批量换图/迁移后使用)。无参数执行:

php /var/www/dolibarr/scripts/product/regenerate_thumbs.php

实测输出:

***** regenerate_thumbs.php (24.0.2) pid=14653 *****
Usage:    regenerate_thumbs.php  subdirtoscan
Example:  regenerate_thumbs.php  produit

按示例传参实测(本实例无商品图片,空跑):

php /var/www/dolibarr/scripts/product/regenerate_thumbs.php produit

实测输出:

***** regenerate_thumbs.php (24.0.2) pid=14693 *****
--- start

同族脚本 product/migrate_picture_path.php / user/migrate_picture_path.php(升级旧实例时迁移图片存储路径),无参数执行打印 Usage: migrate_picture_path.php product(实测),参数取 product 或 user 指定迁移对象。

4.7 website/regenerate-pages.php:网站页面重生成

网站模块(CMS)页面的批量重建:

php /var/www/dolibarr/scripts/website/regenerate-pages.php

实测输出:

***** regenerate-pages.php *****
Usage: regenerate-pages.php (test|confirm) website [nbmaxrecord]

Regenerate all pages of a web site.

参数:website 为站点引用名(界面网站模块里建的站点),nbmaxrecord 限制单轮页数。

4.8 bank/export-bank-receipts.php:银行对账导出

php /var/www/dolibarr/scripts/bank/export-bank-receipts.php

实测输出:

***** export-bank-receipts.php (24.0.2) pid=14655 *****
Usage: export-bank-receipts.php bank_ref [bank_receipt_number|all|empty] (csv|tsv|excel|excel2007) [lang=xx_XX]

参数:bank_ref 银行账户引用名;bank_receipt_number 对账批次号,或 all/empty;格式四选一。导出文件落在 documents/export/。

4.9 blockedlog/check_blockedlog.php:不可抵赖日志校验

BlockedLog 模块(发票防篡改审计日志,部分国家合规必备)的完整性校验:

php /var/www/dolibarr/scripts/blockedlog/check_blockedlog.php

实测输出:

***** check_blockedlog.php (24.0.2) pid=14667 *****
Usage: check_blockedlog.php option1|option2

💡 说明:该脚本 Usage 文案本身较简略(option1|option2),实际按区块校验模式执行;生产启用 BlockedLog 后建议定期运行并留存输出,作为审计链完整的证据。

4.10 admin/admintool.php:口令加解密管理工具

管理 conf.php 中 $dolibarr_main_db_pass 的三种模式(实测闭环,含加密/查看/解密):

cd /var/www/dolibarr
php scripts/admin/admintool.php                # 无参数:打印用法
php scripts/admin/admintool.php foo            # 参数错误:同样回落到用法

实测输出:

Usage: admintool.php showpass|encodepass|decodepass

encodepass:明文 → 加密。执行前 conf.php 实测值为明文:

grep "db_pass" /var/www/dolibarr/htdocs/conf/conf.php
php scripts/admin/admintool.php encodepass q1w2e3r4
grep "db_pass" /var/www/dolibarr/htdocs/conf/conf.php
curl -s http://localhost/ | grep -oE '<title>[^<]*</title>'

实测输出:

$dolibarr_main_db_pass='q1w2e3r4';
1
$dolibarr_main_db_pass='dolcrypt:AES-256-CTR:1e9239815570d012:07S6EYuIwk4=';
<title>Login @ 24.0.2</title>

输出解读:1 表示回写成功;db_pass 变为 dolcrypt:AES-256-CTR:<iv>:<密文> 格式,且站点照常登录——加密对应用透明。加密密钥派生自 conf.php 的 $dolibarr_main_instance_unique_id。

showpass:查看当前生效口令:

php scripts/admin/admintool.php showpass

实测输出:

***** admintool.php (24.0.2) pid=14728 - 2026-10-23T00:44:36Z - <服务器主机名> *****
q1w2e3r4

⚠️ 注意:showpass 把数据库口令直接打到 stdout,会进入 shell 历史与日志,仅在受控维护会话使用。

decodepass:加密 → 明文(手工编辑口令前先还原):

php scripts/admin/admintool.php decodepass
grep "db_pass" /var/www/dolibarr/htdocs/conf/conf.php

实测输出:

1
$dolibarr_main_db_pass='q1w2e3r4';

4.11 LDAP 同步脚本族(user/ + members/ + company/,9 个)

用户/会员/用户组与 LDAP 双向同步,命名规则一目了然(dolibarr2ldap 推送、ldap2dolibarr 拉取)。实测无参数行为:

php /var/www/dolibarr/scripts/user/sync_users_dolibarr2ldap.php

实测输出:

Usage: sync_users_dolibarr2ldap.php now
php /var/www/dolibarr/scripts/user/sync_users_ldap2dolibarr.php

实测输出:

***** sync_users_ldap2dolibarr.php (24.0.2) pid=14750 *****
Usage:  sync_users_ldap2dolibarr.php (nocommitiferror|commitiferror) [--server=ldapserverhost] [--excludeuser=user1,user2...] [-y]
php /var/www/dolibarr/scripts/members/sync_members_dolibarr2ldap.php

实测输出:

***** sync_members_dolibarr2ldap.php (24.0.2) pid=14756 *****
Usage: sync_members_dolibarr2ldap.php now [-y]

九个脚本清单:user/sync_users_{dolibarr2ldap,ldap2dolibarr}.php、user/sync_groups_{dolibarr2ldap,ldap2dolibarr}.php、members/sync_members_{dolibarr2ldap,ldap2dolibarr}.php、members/sync_members_types_{dolibarr2ldap,ldap2dolibarr}.php、company/sync_contacts_dolibarr2ldap.php。

⚠️ 注意:同步方向与字段映射需先在界面「设置 → 模块 → LDAP」配置并测试连通后,CLI 才能实际搬数据;commitiferror 与 -y 的组合会带错提交,生产同步一律先默认的 nocommitiferror 干跑核对。

4.12 odt2pdf/odt2pdf.sh:ODT 转 PDF 辅助脚本

shell 脚本(非 PHP),调用外部转换器把 ODT 模板转 PDF:

sh /var/www/dolibarr/scripts/odt2pdf/odt2pdf.sh

实测输出:

Usage:   odt2pdf.sh fullfilename [native|jodconverter|pyodconverter|pathtojodconverterjar|pandoc]
Example: odt2pdf.sh myfile ~/jodconverter/jodconverter-cli-2.2.2.jar

💡 技术拓展:ODT→PDF 转换器对比——

转换器原理适用场景
nativePHP 内置库直接转换零依赖,复杂模板保真度低
jodconverter调用 LibreOffice 进程保真度最高,需装 LibreOffice
pandoc文档格式转换器轻量文本型模板

单据排版要求高(发票/合同)选 jodconverter,内网简单场景用 native。同目录的 clicktodial/ekiga.sh、linphone.sh 是点击拨号功能的示例外呼脚本,按需取用。

4.13 其他脚本速览

脚本实测用法输出
company/sync_contacts_dolibarr2ldap.php联系人推送 LDAP(同 4.11 族)
invoices/email_unpaid_invoices_to_representatives.php`Usage: ... (test
contracts/email_expire_services_to_representatives.php`Usage: ... (test
members/sync_members_types_*.php会员类型双向同步(同 4.11 族)

4.14 已知问题:ai/purge_logs.php 引用路径错误

实测该脚本在 24.0.2 源码包中直接运行报 Fatal error:

php /var/www/dolibarr/scripts/ai/purge_logs.php

实测输出:

PHP Warning:  require(/var/www/dolibarr/scripts/ai/../../main.inc.php): Failed to open stream: No such file or directory in /var/www/dolibarr/scripts/ai/purge_logs.php on line 41
PHP Fatal error:  Uncaught Error: Failed opening required '/var/www/dolibarr/scripts/ai/../../main.inc.php' (include_path='.:/usr/share/php') in /var/www/dolibarr/scripts/ai/purge_logs.php:41
Stack trace:
#0 {main}
  thrown in /var/www/dolibarr/scripts/ai/purge_logs.php on line 41

定位:脚本第 41 行 require .../../../main.inc.php 解析到 scripts/main.inc.php——该文件不存在(框架引导文件在 htdocs/main.inc.php),属于源码包内的路径缺陷。解决:等上游修复,或临时改第 41 行的相对路径指向 htdocs/main.inc.php;AI 模块日志也可直接按 documents/ 下日志目录手工清理,不依赖此脚本。

五、注意事项

  1. 模块前置:业务脚本多数要求对应模块启用(4.2/4.5 节实测拒绝行为),跑批前先核对 MAIN_MODULE_* 常量清单(第三节实测查询)。
  2. 身份与权限:建议统一 sudo -u www-data php scripts/... 执行,与 Web 侧写入属主保持一致,避免 documents/ 内文件属主混杂导致界面删改失败。
  3. test/confirm 两级动作:邮件与重生成类脚本先 test 后 confirm;sync_*_ldap2dolibarr.php 用默认 nocommitiferror 干跑,确认再 -y。
  4. 密钥安全:CRON_KEY、showpass 输出、encodepass 的命令行参数都会进 shell 历史,生产环境用 sudo -u www-data 并及时清理历史,或从受控配置文件读取密钥。
  5. 时区独立性:CLI 与 Web 的 date.timezone 分别取自 /etc/php/8.1/cli/php.ini 与 /etc/php/8.1/apache2/php.ini,定时任务时间敏感场景两边必须核对一致(4.1 节横幅实测 TZ server = UTC)。

六、常见问题

Q1:脚本一闪而过没有任何输出? 先确认用 php 命令执行且路径正确(php /var/www/dolibarr/scripts/<域>/<脚本>.php),再确认实例已初始化(install.lock 存在)——脚本引导阶段连不上库或读不到 conf.php 时部分场景会静默退出。

Q2:cron_run_jobs.php 一直只打印 Usage? 第一个参数不是 CRON_KEY 常量的值。核对:

mariadb -udolibarr -pq1w2e3r4 dolibarr -e "SELECT value FROM llx_const WHERE name='CRON_KEY';"

实测输出(本环境):

value
cronkey-q1w2e3r4

Q3:想让计划任务跑得更快/更慢? 执行频率由系统 crontab 控制(4.1 节示例为每 5 分钟),任务自身的间隔在界面「计划任务」里配置(datenextrun);两者取交集,crontab 每分钟跑也不会让任务本身超频(4.1 实测输出里 not qualified (datenextrunok=0) 就是间隔未到的判定)。

Q4:批量重生成 PDF 后文件属主变成 root,界面里删不掉? 用 root 执行脚本所致。统一执行身份后修复存量:

chown -R www-data:www-data /var/www/dolibarr/documents

Q5:LDAP 同步脚本报连接失败? 同步依赖界面 LDAP 模块配置(主机、端口、绑定账号、字段映射),CLI 只复用该配置。先在「设置 → 模块 → LDAP」用界面测试按钮确认连通,再跑 CLI;跨机同步用 --server=ldapserverhost 参数覆盖。

七、参考链接