WordPress 不兼容插件引发的惨案

前言

WordPress 从 2.x 升级到了 3.0.1,又恰逢更换了主机,从原来Windows的主机切换到了Linux主机上。

惨剧

某天在后台发现有插件可以更新了,于是点了自动更新,然后杯具的事情发生了,自动更新失败,以为是权限问题,登上FTP,到处查看修改权限,无果,于是念叨这主机是不是有问题,不能通过它访问网络?是不是差劲了点?然后手动上传覆盖了好几个插件的更新……

再过了几天,发现模板不支持3.0的菜单功能,于是换了模板,加入菜单,又发现了问题,新建菜单可以成功,但是不能修改,每次修改都失败……

随即要添加文章,新的问题又来了,新添的文章会自动生成固定链接,因为觉得固定链接生成的不是很好,想修改掉,结果也不能修改……

这下可让我烦起来了,想想肯定是哪里出问题了,静下心想了想,后台凡是Ajax的操作均无响应,并且数据也没有更新,之前出问题的部分都涉及Ajax,是不是这里出问题了?

上帝保佑

马上开启Firefox,用Firedebug查看XHR数据,发现admin-ajax.php返回HTTP响应头为

HTTP/1.1 500 Internal Server Error

很明显,后台程序运行出错了,WP本身应该不会烦这么低级的错误,我又没改过后台的代码,那么应该是插件引起问题无疑了,在wp-config.php文件中激活调试

define('WP_DEBUG', true);

然后在错误日志文件中找到了一些与插件文件相关的错误,将这些插件逐个禁用/启用排查问题,结果发现只要将“WordPress Thread Comment”插件(作者:偶爱偶家)禁用之后这些Ajax操作就都正常了,所以确定该问题是由“WordPress Thread Comment”插件导致

PS: 今天(2011年1月8日)升级及添加了些插件,发现又出了这个问题,这次查出来是“All in One SEO Pack”这个插件导致,抱着试试看的态度重新启用“WordPress Thread Comment”插件,发现又可以用了……

结局

就这样,之前所有的问题(包括自动更新的问题)就都解决了,不兼容插件惹的祸啊~ 差点错怪主机提供商了,汗~~

开机后任务栏托盘图标显示不全

问题描述:

有时候装了一些开机自启动的程序,在系统启动的时候有些就会在系统托盘区添加一个图标方便操作,有些情况下开机以后发现图标只显示了一部分,还有一些没有显示出来,字体注销重新登录后能显示出来,但是重启计算机以后问题依旧,是个非常奇怪的问题,居然是UPnP设备发现服务造成的。

解决方法:

控制面板的管理工具里面打开“服务”,或者在“开始”→“运行”(WinKey+R)中输入“service.msc”(不带引号) ,找到名称为“SSDP Discovery Service”的服务(即UPnP设备发现服务),选择右键→属性,启动类型改为“已禁用”,然后停止该服务,然后重新启动计算机,你会发现一切正常了。

部分程序的菜单栏中的中文字体显示有问题

问题描述:

这种情况通常出现在Java程序、Gtk程序之类非Windows原生的程序(Native App)中,比如OpenOffice.org的菜单栏、FreeMind的菜单栏、还有基于QT库的Vidalia的系统托盘通知区图标的弹出菜单等,原因是因为安装了第三方主题等使系统菜单字体设置成8号“Tahoma”适合英文显示的字体却影响了汉字的显示效果。

解决方法:

桌面右键→属性,切换到外观选项卡,点击“高级”按钮,在弹出的对话框中的项目中选择“菜单”,然后调整字体大小,一般中文字体设为9较为合适,推荐使用9号“Tahoma”字体,如果其他项目字体显示有问题也可以到这里更改为9号”Tahoma”,或者索性把所有的字体全部改成9号”Tahoma”,当然,也可以使用你自己喜欢的字体。

nusoap 客户端获取的中文数据变成问号的问题

问题描述:
使用 nosoap_client 类创建了一个客户端 SOAP 对象,然后从 $client->call 方法传回UTF-8编码的中文数据时,所有的中文数据均显示为问号(nusoap 版本为 0.9.5)

问题原因:
nusoap_client 的 decode_utf8 属性默认设置为 true,导致默认对UTF-8数据进行转码,在 nusoap 中的具体调用过程如下:

class.soapclient.php 中的 nusoap_client 的 parseResponse 在解析返回的数据时使用了 nusoap_parser 类

		$parser = new nusoap_parser($data, $this->xml_encoding, $this->operation, $this->decode_utf8);

class.soap_parser.php 中 soap_parser 类的 character_data 方法中又调用了utf8_decode进行了转码

		if ($this->xml_encoding=='UTF-8'){
			// TODO: add an option to disable this for folks who want
			// raw UTF-8 that, e.g., might not map to iso-8859-1
			// TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
			if($this->decode_utf8){
				$data = utf8_decode($data);
			}
		}

解决方法:
在使用 $client = new nusoap_client() 创建了对象之后马上设置 decode_utf8 为 false;

设置方法如下:

$client->decode_utf8 = false;

$client->decodeUTF8(false);

补充:
又遇到一则因服务端输出信息编码不匹配,导致 NuSOAP XML Parser 以’ISO-8859-1′编码解析而出错的问题,NuSOAP 库相关部分代码在 class.nusoap_base.php 中,具体位置如下:

    /**
	* charset encoding for outgoing messages
	*
	* @var      string
	* @access   public
	*/
    var $soap_defencoding = 'ISO-8859-1';
	//var $soap_defencoding = 'UTF-8';

解决方法:

$client->soap_defencoding = 'utf-8';	# 仅比上述问题增加该项设置
$client->xml_encoding = 'utf-8';	# 默认值
$client->decode_utf8 = false;

参考链接:
http://blog.csdn.net/mynamesucks/archive/2006/05/26/756480.aspx
http://lhx1026.javaeye.com/blog/506092
http://plog.longwin.com.tw/programming/2010/03/16/php-soap-nusoap-client-2010

Apache 按天分割日志的方法

这里介绍了两个管道日志程序来实现

A. 使用 cronolog 为每一天建立一个新的日志

从 http://cronolog.org/download/ 可以下载 cronolog 程序,把下载到的 cronolog 程序并放到 Apache 的 bin 目录下(详细参数参见:http://cronolog.org/usage.html

主配置文件中的使用方法

ErrorLog "|bin/cronolog logs/error_%Y%m%d.log"
CustomLog "|bin/cronolog logs/access_%Y%m%d.log" combined

虚拟主机配置文件中的使用方法

ServerAdmin webmaster@localhost
DocumentRoot "E:/htdocs"
ServerName localhost
ErrorLog "|bin/cronolog logs/localhost/error_%Y%m%d.log"
CustomLog "|bin/cronolog logs/localhost/access_%Y%m%d.log" combined

B. 使用 rotatelogs 每隔一天记录一个日志

rotatelogs 是 Apache 2.2 中自带的管道日志程序,参数如下(参见:http://lamp.linux.gov.cn/Apache/ApacheMenu/programs/rotatelogs.html

语法
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]

选项
-l
使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。
logfile
它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime
日志文件滚动的以秒为单位的间隔时间。
offset
相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。
filesizeM
指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。

主配置文件中的使用方法

ErrorLog "|bin/rotatelogs -l logs/error_%Y%m%d.log 86400"
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined

虚拟主机配置文件中的使用方法

ServerAdmin webmaster@localhost
DocumentRoot "E:/htdocs"
ServerName localhost
ErrorLog "|bin/rotatelogs -l logs/localhost/error_%Y%m%d.log 86400"
CustomLog "|bin/rotatelogs -l logs/localhost/access_%Y%m%d.log 86400" combined

PS1:这两个管道日志文件程序还有一点不同之处是使用 cronolog 时如果日志是放在某个不存在的路径则会自动创建目录,而使用 rotatelogs 时不能自动创建,这一点要特别注意。
PS2:有关 Apache 日志文件的更多信息请参见:http://lamp.linux.gov.cn/Apache/ApacheMenu/logs.html