PHP 致命错误:在 crontab 中将 WP-CLI 命令作为 cron-job 运行时,无法打开所需的“wp-salt.php”

mi-*_*ich 1 php wordpress cron wp-cli cloudways

这个问题旨在作为其他人查找的信息帖子,因为幸运的是我已经找到了解决方案。

我尝试在 Cloudways 服务器上的 crontab 中将 Wordpress-CLI 命令作为 cron 作业运行。该命令直接在终端中运行没有任何问题,但在使用 crontab 启动时失败并出现致命 PHP 错误。

Wordpress-CLI 的基本命令如下所示:

wp migratedb profile [id]

由于 crontab 运行的上下文通常是未知的,并且 $PATH 变量可能不可用,因此我修改了命令以提供必要的绝对路径:

/usr/local/bin/wp migratedb profile [id] --path=/absolute/path/to/wordpress/core/files

同样,从终端启动时,这个修改后的命令也可以完美运行,没有任何问题。

最终的 crontab 条目看起来像这样:

0 5 * * * /usr/local/bin/wp migratedb profile [id] --path=/absolute/path/to/wordpress/core/files

当从调度程序运行时,它会产生以下错误:

PHP Fatal error:  require(): Failed opening required 'wp-salt.php' (include_path='.:/usr/share/php') in phar:///usr/local/bin/wp/vendor/wp-cli/config-command/src/Config_Command.php(444) : eval()'d code on line 34
Run Code Online (Sandbox Code Playgroud)

经过一些实验,我意识到除了非常基本的命令之外,所有WP-CLI 命令都会发生此错误

wp --info

,产生以下输出:

OS: Linux 4.19.0-21-amd64 #1 SMP Debian 4.19.249-2 (2022-06-30) x86_64
Shell:  /bin/sh
PHP binary: /usr/bin/php7.4
PHP version:    7.4.33
php.ini used:   /etc/php/7.4/cli/php.ini
MySQL binary:   /usr/bin/mysql
MySQL version:  mysql  Ver 15.1 Distrib 10.4.20-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
SQL modes:  
WP-CLI root dir:    phar://wp-cli.phar/vendor/wp-cli/wp-cli
WP-CLI vendor dir:  phar://wp-cli.phar/vendor
WP_CLI phar path:   [absolute/path/to/user/home/directory]
WP-CLI packages dir:    
WP-CLI cache dir:   [absolute/path/to/user/home/directory]/.wp-cli/cache
WP-CLI global config:   
WP-CLI project config:  
WP-CLI version: 2.7.1
Run Code Online (Sandbox Code Playgroud)

我还尝试了以下调整但没有任何运气:

  • 下载新的 wp-cli.phar 并将其用于命令。

  • 查看和更改已用文件夹的所有权限

  • 尝试以不同用户身份运行 cronjob

  • 通过使用来更改命令/usr/bin/php来运行wp-cli.phar

mi-*_*ich 9

我最终发现这个错误与托管提供商(在本例中为 Cloudways)在文件中设置 Wordpress 配置的方式有关wp-config.php

盐和秘密授权密钥存储在单独的文件中,即wp-salt.php错误消息中引用的文件。它可以通过以下方式直接在配置文件中引用:require('wp-salt.php'). 由于这不是 wordpress 核心的一部分,并且 crontab 在不同的环境中运行,因此无法确定文件所在的正确目录,并且失败require()并出现致命错误。

wp-config.php要修复此问题,请将to中的行更改为require(__DIR__.'/wp-salt.php');,以便始终从与配置文件相同的目录引用该文件。

另一种选择是完全删除该行并将其替换为文件中的内容wp-salt.php,就像 Wordpress 核心所做的那样。