You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境WordPress插件调试:functions.php修改未生效问题

问题:Docker环境下WordPress插件激活/停用时报PHP通知错误,调试无日志输出

错误信息

[07-May-2024 01:11:48 UTC] PHP Notice: file_get_contents(): Read of 8192 bytes failed with errno=21 Is a directory in /var/www/html/wp-includes/functions.php on line 6852

调试情况

定位到wp-includes/functions.php的get_file_data函数第6852行后,添加了error_log($file)代码尝试调试,但错误仍指向原行,且error.log无日志输出。怀疑WordPress缓存了functions.php,想知道如何清理缓存,或者是否存在其他问题。

Docker Compose配置

version: '3.8'
services:
  db:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: mypwd
      MYSQL_DATABASE: wptest
      MYSQL_USER:  myuser
      MYSQL_PASSWORD: mypwd
    ports:
      - "3306:3306"  # MySQL default port is 3306
  wordpress:
    image: wordpress:latest
    ports:
      - "80:80"
    volumes:
      - ./wp-content:/var/www/html/wp-content
    depends_on:
      - db
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: myuser
      WORDPRESS_DB_PASSWORD: mypwd
      WORDPRESS_DB_NAME: wptest
volumes:
  mysql: {}

解决方案

一、先解决调试无日志的问题

你添加的error_log没输出,核心原因是你修改的functions.php不在挂载目录里。看你的docker-compose配置,只挂载了wp-content目录,wp-includes是容器内部的文件,直接在宿主机修改根本不会生效,容器里还是原文件,所以错误行没变,日志也打不出来。

要修改容器内的wp-includes/functions.php,有两种办法:

  1. 进入容器内部修改:

    # 先找到WordPress容器的ID或名称
    docker ps
    # 进入容器的bash环境
    docker exec -it [容器ID/名称] bash
    # 用编辑器修改文件,比如nano
    nano /var/www/html/wp-includes/functions.php
    

    修改后保存,直接刷新页面就能看到效果,不需要重启容器。

  2. 把wp-includes也挂载到宿主机(不推荐,因为WordPress升级会覆盖这个目录):
    在docker-compose的wordpress服务volumes里加一行:

    - ./wp-includes:/var/www/html/wp-includes
    

    然后重启容器:docker-compose down && docker-compose up -d,之后就能在宿主机的./wp-includes里修改文件了。

二、解决file_get_contents读取目录的错误

错误errno=21 Is a directory说明get_file_data函数传入的$file参数是一个目录路径,而不是文件路径。

你可以按上面的方法进入容器,在get_file_data函数开头加一行调试代码:

if(is_dir($file)){
    error_log("get_file_data received directory: " . $file);
    // 打印调用栈,方便定位哪里传错了
    error_log(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5));
}

然后激活/停用插件,查看PHP错误日志。容器里的PHP日志默认在/var/log/apache2/error.log,直接查看:

docker exec -it [容器ID/名称] tail -f /var/log/apache2/error.log

找到传错的调用位置后,检查你的插件代码里有没有在激活/停用钩子中调用get_file_data时传入了目录,或者排查其他主题、插件的问题。

三、关于WordPress缓存的问题

WordPress本身不会缓存核心文件(比如functions.php),你遇到的“修改不生效”是容器挂载的问题,不是缓存。如果要清理WordPress的运行缓存:

  • 装了缓存插件的话,直接在插件后台清理;
  • 清理wp-content/cache目录(如果存在):
    docker exec -it [容器ID/名称] rm -rf /var/www/html/wp-content/cache/*
    
  • 重启容器清空所有运行时临时缓存:docker-compose restart wordpress

内容的提问来源于stack exchange,提问作者TheRealPapa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:33:19