如何在SS3主站的子域名上运行Silverstripe SS4 cron定时任务
排查解决步骤
- 修正cron命令的工作目录与重定向规则
cron执行时默认工作目录为用户根目录,而非站点根目录,SS4要求CLI任务必须从站点根目录(即composer.json所在的public_html/com4目录)执行。同时你之前的重定向仅捕获标准输出,错误信息会丢失,将cron命令修改为以下格式:
cd /home/你的cPanel账户名/public_html/com4 && php vendor/silverstripe/framework/cli-script.php dev/tasks/PCWLoadRecords > pcwresults.html 2>&1
末尾的2>&1会将错误输出也写入日志文件,方便定位500错误的具体原因。
校验CLI环境与SS4的兼容性
cPanel环境下CLI版本的PHP配置、版本通常与Web环境不一致:- 终端执行
php -v确认CLI的PHP版本符合SS4的要求(SS4要求PHP7.1+,不同小版本要求有差异,不要用SS3适配的低版本PHP) - 执行
php -m检查是否安装了SS4必需的扩展(mbstring、gd、curl、xml等),Web环境启用的扩展不代表CLI环境也启用了
如果版本不匹配,可以在cron中指定PHP绝对路径,比如用cPanel多PHP版本对应的路径,例如/opt/cpanel/ea-php74/root/usr/bin/php代替命令中的php。
- 终端执行
启用调试模式输出具体报错
在SS4站点的.env文件中添加以下配置,开启CLI模式下的错误输出:
SS_ENVIRONMENT_TYPE="dev" SS_ERROR_LEVEL="E_ALL"
关闭输出重定向直接在终端执行任务命令,就可以看到具体的报错信息,而非空输出。你担心的SS3/SS4 cli脚本冲突问题不会出现,只要你执行的是SS4目录下的cli-script.php,就不会调用到SS3的脚本,也可以在命令中用文件的绝对路径执行,彻底避免路径查找错误。
检查文件权限与任务本身的输出逻辑
- 确认SS4站点所有文件的所有者为你的cPanel账户用户,
.env文件权限设置为600,权限异常会触发Silverstripe的安全拦截,直接终止任务执行 - 检查
PCWLoadRecords任务的代码,是否存在仅在Web请求下输出内容、CLI模式下无输出的逻辑,比如判断了请求类型才写日志或者返回内容
- 确认SS4站点所有文件的所有者为你的cPanel账户用户,
强制指定站点URL避免路由识别错误
你已经配置了SS_BASE_URL,也可以在执行命令时额外加参数强制指定域名,避免CLI模式下路由识别异常:
php vendor/silverstripe/framework/cli-script.php dev/tasks/PCWLoadRecords url=ss4.mySS3domain.co.nz
内容的提问来源于stack exchange,提问作者user3769009
相关产品推荐
相关产品推荐

