必须用绝对路径调用宝塔对应PHP版本的CLI解释器,如/www/server/php/80/bin/php,而非系统php命令,并在Shell脚本任务中指定完整路径、处理工作目录与权限。

宝塔面板里添加 PHP 脚本定时任务的正确姿势
直接在宝塔「计划任务」里填 PHP 脚本路径,大概率执行失败——因为没指定 PHP 解释器路径,也没处理工作目录和环境变量。必须用绝对路径调用对应版本的 php 命令,否则脚本找不到扩展、连不上数据库、读不到相对路径文件都是常态。
- 进宝塔后台 → 「计划任务」→ 「添加计划任务」
- 任务类型选「Shell 脚本」(别选「PHP 脚本」,那个只支持简单函数调用,不走 CLI 环境)
- 脚本内容写成:
/www/server/php/80/bin/php /www/wwwroot/example.com/cli.php
(把80换成你实际启用的 PHP 版本号,cli.php改为你的脚本绝对路径) - 执行周期按需设置,建议首次调试先设「每分钟」,确认能跑通再调回正常频率
为什么用 /www/server/php/xx/bin/php 而不是系统 php
宝塔多 PHP 版本共存时,系统 php 命令通常指向默认版本(可能是 7.4 或未启用的版本),而你的网站用的是 8.0 或 8.2,扩展、配置、SSL 证书路径全都不一样。直接调用 php 极易报错:Class 'PDO' not found、Undefined function curl_init()、file_get_contents(): SSL operation failed。
-
/www/server/php/xx/bin/php是宝塔为每个 PHP 版本单独编译的 CLI 可执行文件,加载的是该版本完整的php.ini - 可通过宝塔「软件商店」→「PHP 管理」→「设置」→「配置文件」确认对应版本的
php.ini路径,再检查扩展是否已启用 - 如果脚本依赖 Composer 自动加载,确保
vendor/autoload.php路径正确,且composer install --no-dev已在目标目录执行过
调试 PHP 定时任务失败的三步定位法
任务显示「执行成功」但脚本没反应?或日志里一堆 Warning 却没输出?别猜,按顺序查:
- 在脚本开头加:
file_put_contents('/tmp/cron_debug.log', date('Y-m-d H:i:s') . " start\n", FILE_APPEND);,确认是否真被触发 - 捕获错误输出:把命令改成
/www/server/php/80/bin/php /www/wwwroot/example.com/cli.php >> /tmp/cron_output.log 2>&1
,查看/tmp/cron_output.log里的真实报错 - 检查用户权限:宝塔计划任务默认以
www用户运行,确保该用户对脚本、日志目录、缓存目录有读写权限(chown -R www:www /www/wwwroot/example.com/runtime)
常见陷阱:相对路径、数据库连接与 session 冲突
你在浏览器能跑通的 PHP 脚本,放进定时任务十有八九会卡在路径或连接上——CLI 环境没有 Web Server 的 DocumentRoot 和 $_SERVER 上下文。
立即学习“PHP免费学习笔记(深入)”;
- 所有文件包含必须用
__DIR__或绝对路径:require __DIR__ . '/config/database.php';,别用require 'config/database.php'; - 数据库配置若依赖
$_SERVER['DOCUMENT_ROOT']或getcwd(),要重写为固定路径或通过常量定义 - 避免在 CLI 脚本中调用
session_start()—— CLI 模式下 session.save_path 可能不可写,且无 cookie 上下文,直接报 Warning 并阻塞后续逻辑 - 如果脚本含 cURL 请求,注意 CLI 版本的
php.ini中curl.cainfo是否指向有效 CA 证书路径(宝塔通常在/etc/pki/tls/certs/ca-bundle.crt)











