如何让被禁用的ini_set()函数不再记录错误(@运算符无效)
解决被禁用的ini_set()仍记录错误的问题
嘿,我之前也碰到过这种糟心情况——明明加了@抑制符,错误日志还是被那个禁用的ini_set()填满!结合你提到的插件回调猜测,咱们一步步来搞定它:
核心问题分析
@抑制符有时候会失效,尤其是当插件自带自定义错误处理机制,或者你调用的ini_set()触发了内部后续调用时(比如你猜的回调里又嵌套了一次调用)。另外,有些服务器的PHP配置会强制记录被@抑制的警告,这时候靠抑制符根本压不住。
可行的解决方案
1. 提前检查函数可用性(最稳妥的方案)
直接避免调用被禁用的函数才是根治办法。找到插件里所有ini_set()的调用位置(包括报错的/all-in-one-event-calendar.php:81,以及可能藏在回调里的调用),把原来的代码:
@ini_set('your_config_option', 'target_value');
替换成:
// 先确认函数未被禁用,再执行调用 if (function_exists('ini_set')) { ini_set('your_config_option', 'target_value'); }
这样当ini_set()被禁用时,代码根本不会执行调用,自然不会产生错误日志。
2. 临时调整错误报告级别(备选方案)
如果找不到所有调用位置,或者修改起来太麻烦,可以在调用ini_set()前后临时调整错误报告级别,屏蔽警告类错误:
// 保存当前错误报告级别 $original_error_level = error_reporting(); // 临时关闭警告级别的错误报告 error_reporting($original_error_level & ~E_WARNING); // 执行原本的ini_set调用(这里可以去掉@了) ini_set('your_config_option', 'target_value'); // 恢复原来的错误报告级别 error_reporting($original_error_level);
这个方法能强制让PHP不记录这次调用的警告,但不如第一种方法彻底——如果服务器有强制日志的配置,还是可能会被记录。
3. 不修改插件代码的小技巧(适合怕更新覆盖的情况)
如果你担心插件更新会冲掉修改,可以在WordPress主题的functions.php里加个钩子(如果插件支持的话),或者写个极简自定义插件拦截这个调用。不过这需要你对插件的代码结构有一定了解,比如找到插件初始化的钩子,提前判断ini_set()是否可用,再决定是否执行相关逻辑。
注意事项
- 修改插件代码前记得备份原文件,避免更新插件时丢失修改;
- 如果是商业插件,建议给开发者提反馈,让他们在后续版本里加入函数存在性检查;
内容的提问来源于stack exchange,提问作者that-ben
相关产品推荐
相关产品推荐

