Docker环境WordPress插件调试:functions.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,有两种办法:
进入容器内部修改:
# 先找到WordPress容器的ID或名称 docker ps # 进入容器的bash环境 docker exec -it [容器ID/名称] bash # 用编辑器修改文件,比如nano nano /var/www/html/wp-includes/functions.php修改后保存,直接刷新页面就能看到效果,不需要重启容器。
把
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

