修复ftp_nlist()报错

橘子 发布于 2025-08-13 114 次阅读


报错

在安装 LiteSpeed 插件时,触发了一个报错,如下:

Fatal error: Uncaught TypeError: ftp_nlist(): Argument #1 ($ftp) must be of type FTP\Connection, null given in /var/www/example.com/html/wp-admin/includes/class-wp-filesystem-ftpext.php:438 Stack trace: #0 /var/www/example.com/html/wp-admin/includes/class-wp-filesystem-ftpext.php(438): ftp_nlist() #1 /var/www/example.com/html/wp-admin/includes/class-wp-filesystem-ftpext.php(456): WP_Filesystem_FTPext->exists() #2 /var/www/example.com/html/wp-admin/includes/class-wp-filesystem-ftpext.php(757): WP_Filesystem_FTPext->is_file() #3 /var/www/example.com/html/wp-content/plugins/litespeed-cache/src/import.preset.cls.php(37): WP_Filesystem_FTPext->dirlist() #4 /var/www/example.com/html/wp-content/plugins/litespeed-cache/src/import.preset.cls.php(51): LiteSpeed\Preset::get_backups() #5 /var/www/example.com/html/wp-content/plugins/litespeed-cache/src/import.preset.cls.php(177): LiteSpeed\Preset::prune_backups() #6 /var/www/example.com/html/wp-content/plugins/litespeed-cache/src/import.preset.cls.php(119): LiteSpeed\Preset->make_backup() #7 /var/www/example.com/html/wp-content/plugins/litespeed-cache/src/import.preset.cls.php(253): LiteSpeed\Preset->apply() #8 /var/www/example.com/html/wp-content/plugins/litespeed-cache/src/router.cls.php(825): LiteSpeed\Preset->handler() #9 /var/www/example.com/html/wp-content/plugins/litespeed-cache/src/core.cls.php(340): LiteSpeed\Router->handler() #10 /var/www/example.com/html/wp-content/plugins/litespeed-cache/src/core.cls.php(291): LiteSpeed\Core->proceed_action() #11 /var/www/example.com/html/wp-includes/class-wp-hook.php(324): LiteSpeed\Core->after_user_init() #12 /var/www/example.com/html/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters() #13 /var/www/example.com/html/wp-includes/plugin.php(517): WP_Hook->do_action() #14 /var/www/example.com/html/wp-settings.php(727): do_action() #15 /var/www/example.com/html/wp-config.php(120): require_once('...') #16 /var/www/example.com/html/wp-load.php(50): require_once('...') #17 /var/www/example.com/html/wp-admin/admin.php(35): require_once('...') #18 {main} thrown in /var/www/example.com/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 438

尝试搜索了一下,发现是这行代码报错了:

$list = ftp_nlist( $this->link, $path );

修复

CSDN找到一个解决方法,修改wp-config.php如下:

/** 添加这个direct配置防止 ftp_nlist() 报错 */
define('FS_METHOD', 'direct');
/** 设置 WordPress 变量和包含的文件。 */
require_once ABSPATH . 'wp-settings.php';

然后网站就恢复了。

需要注意的是,这个配置必须放在 wp-settings.php 导入之前。

我记得很久之前我也改过配置,所以这次修改之后的配置尾部看起来是这样的:

/** 自己改的,添加这个direct配置防止 ftp_nlist() 报错 */
define('FS_METHOD', 'direct');
/** 自己改的,配置自动更新 */
define('WP_TEMP_DIR', ABSPATH.'wp-content/tmp');
define("FS_CHMOD_DIR", 0775); define("FS_CHMOD_FILE", 0664);

/** 设置 WordPress 变量和包含的文件。 */
require_once ABSPATH . 'wp-settings.php';

并且我发现以前也配置过 FS_METHOD,但是在导入设置之后。这次调到之前就好了。

以下是相关调整的解释:

FS_METHOD

define('FS_METHOD', 'direct');

  • 作用:强制 WordPress 使用直接文件系统操作(PHP 直接读写文件),而非通过 FTP/SSH 等协议。
  • 默认情况:WordPress 会自动选择安全的方式(如 direct、ftpext、ssh2)。
  • 配置原因:
    • 服务器文件权限已正确配置(如 PHP 进程用户对文件有读写权限)。
    • 避免因 FTP/SSH 配置问题导致更新失败(如插件/主题安装失败)。
    • 常见于本地开发环境或托管服务器(如云服务器)无需额外协议的场景。

WP_TEMP_DIR

define('WP_TEMP_DIR', ABSPATH.'wp-content/tmp');

  • 作用:自定义临时文件目录路径为 wp-content/tmp。
  • 默认情况:WordPress 使用系统临时目录(如 /tmp)。
  • 配置原因:
    • 权限控制:系统临时目录可能不可写或受限制,自定义目录更可控。
    • 集中管理:将临时文件(如升级包、缓存)放在 WordPress 项目内,便于备份或清理。
    • 安全性:避免多站点共享系统临时目录导致潜在冲突。

FS_CHMOD_DIR; FS_CHMOD_FILE

define("FS_CHMOD_DIR", 0775); 和 define("FS_CHMOD_FILE", 0664);

  • 作用:设置创建目录和文件的默认权限为。
  • 默认情况:WordPress 根据服务器环境自动选择权限(通常目录 0755,文件 0644)。
  • 配置原因:
    • 多用户环境:可能需要宽松权限以适应多用户/多进程操作(如共享主机)。
    • 兼容性:解决因权限不足导致的插件/主题安装失败问题。
    • 风险提示:生产环境应尽量限制权限(如 0755/0644)。如果使用0777 权限可能存在安全隐患(允许任何用户修改文件),仅建议在受控环境(如内部开发或容器)中使用。这里我是让通用户组的也拥有了所有者的权限。