修复博客中的php notice告警

开启log日志

今天准备修复我的博客的mail发送故障,结果开启debug后发现好多告警,于是修复一下。

首先是打开日志,使用命令docker exec -it 3ef /bin/bash 进入容器,然后在wp-config.php中添加如下代码:

将日志定向到log文件,并且不在前端显示。

DESC宏错误

首先是DESC常量未定义。其实这是个字符串,应该是我忘记添加引号了。在提示的代码中,加上单引号包起来就可以了。

另外发现系统时间不对,不过反正我的wordpress是运行在docker容器中的,时间不对就不对吧,容器外面的时间无误,不影响cron调用啥的就可以。

WP_Widget构造函数变动

这个故障仍然是我这个插件的问题。目前博客已经升级到4.9,构造函数从4.3版本就变化了。把四处对应的代码修改一下就可以,如:

修改为:

置顶文章的排除参数

置顶文章的排除参数,由于我的主题和多个插件都是自己自己开发的,不知道问题出在哪里,只能利用notepad++的全部文件搜索,批量检索我在哪里用了WP_Query函数,结果找了好久还是没有找到,只能挨个禁用自己开发的主题和插件,来查找(如果刚才搜索caller_get_posts就直接找到了,哭)。

经过测试,发现问题还是来自Leniy Tweaks这个插件,毕竟我在里面放了超级多的功能。

然后,挨个的禁用里面的模块,最终发现,问题代码和前面的DESC故障代码紧挨着(大哭),于是修复就很简单了,把问题代码:

修改为:

未定义的偏移

这个故障日志中出来好多,但是我专门去找的时候,又很少会复现,应该是偶发情况。我看了一下对应的代码,都是出现在这个php文件中各处我调用$tmp[1]或者$tmp[2]的地方。

$tmp这个变量来自下面这行代码:

$source这个变量,就是avatar头像的url地址,如:

利用error_log(print_r($tmp, 1))显示匹配后的结果,如下:

然后其中一行出现警告的代码如下:

这么简单的代码,理论上list元素的调用怎么也不应该出现告警的啊,那么只有一种可能了,即$tmp变量本身的长度不足2,而出现这种情况,很大的可能出现在正则表达式匹配的环节。

在匹配代码的前后,做如下修改:

接下来就是利用tailf debug.log | grep “Undefined offset” 去等了。过了一段时间,终于出来了告警,然后我根据日志的时间查找前后的输出,结果如下:

这就很明显了,有的时候用户没有自定义头像,而且没有邮箱,那么自然不会存在邮箱的md5值,那么正则表达式匹配失败,最终$tmp这个aray长度为0,我去调用1和2角标,自然越界。

将正则匹配的代码做如下修改:

例如默认头像没有md5值,自然匹配失败。如果匹配失败,则直接返回原始地址。就不会出错了。

同时,这也解决了我4年前(2013年6月)开发这个插件时的一个疑惑:cache缓存文件夹中经常出现一个没有文件名只有后缀的文件“.png”,看来就是这儿的问题。当匹配失败时,$tmp[1]和$tmp[2]不存在,我拼接了两个空字符串,于是就只剩下了“.png”这么个文件。

无效短代码名

在来回启动我开发的“读者墙”插件的时候,系统会出现如下提示:

我查了一下我的代码,是这样写的:

应该是因为启用插件的时候,用户尚未进行后台配置,自然不存在qw_RW_shortcode这个参数,于是get_option就返回空或false了。我本来想做个判断的,然后去wordpress的codex文档中查找一下get_opthion这个函数,发现函数本身就支持默认值,于是代码修改如下:

另外,我又搜索了整个插件中全部用到get_option函数的地方,全都加上了默认值。

完工,邮件发送

最终,忙完php notice部分,我终于想起来,我今天本来是要修复邮件发送的故障来着。

于是各种分析代码,具体过程不详述了,最终发现原因很简单:我的代码没有问题,但是我使用的SMTP服务器不知道什么时候禁止自定义发件人了(可能是防止垃圾邮件伪装发件人的原因吧),我自定义了发件人自然发送失败(用别的SMTP服务器或服务器自带的mail功能可以自定义发件人)。我的代码如下:

将代码中From那行注释掉,就可以用了。

完工。

作者: Leniy

Do not , for one repulse , give up the purpose that you resolved to effect .

本文著作版权归Leniy所有,并受法律保护。

转载、使用整体或任何部分的内容(包含但不限于各个页面的标题、评论框提示语)须经过Leniy的授权。

CopyRight © 2006-2017 Leniy.org all rights reserved.

One thought on “修复博客中的php notice告警

发表评论

电子邮件地址不会被公开。 必填项已用*标注