前几天博客突然无法发布中文日志,殚精竭虑想不出来哪里出错,很是困扰。
写信给国内甚至台湾我认为比较出色的WordPress博客站长求助,仍找不到问题所在。许多站长建议我升级到WordPress最新版本2.7.1。在本地测试我的K2_WalltzLee主题(修改自K2 RC6)与WordPress2.7.1的兼容性时,发现会出现许多样式上的错位,再加上我改动过现在正在使用的WordPress版本的源码,真要折腾升级的话估计没个十天半个月弄不好。幸好我没有傻乎乎地直接在虚拟主机上升级,不然就完蛋了,有备份也没用,根本回不到原来的样子,还要面对几千行的代码从头改。现在想起后怕得头皮一阵发麻。天塌下来只有你一个人被砸死,别人都好好的,也许这就是独立站点最大的痛苦和最大的快乐所在吧。
另外我不喜欢2.7.1的后台界面,一键升级功能对我这种改源码的用户没有任何意义,2.7.1版本发布时,WordPress老大Matt还给我发了封邮件,说你们这帮不升级的家伙是不是住在岩石下面啊,快快升级到2.7.1吧,这是我们一顿折腾后最完美的作品了!唉,你这么说的话就拜托以后别再升级了。对WordPress的频频升级我真感到不能理解。
症状
1.可以发布英文日志。但只要标题或正文中含有中文,就会发布出错,主机CPU占用100%并出现超时提示:
Fatal error: Maximum execution time of 30 seconds exceeded in/…/wp-includes/post.php on line 1287
并且每次报错的具体文件和行数都不相同,有时会报错在一些并不存在的行数。
2.与主机php的超时设定无关,按网上的方法修改php.ini把超时设定成多久都没用。
3.日志会存为草稿,编辑草稿再发布也不行,但在可以修改并保存草稿。
4.与插件和主题无关,停用所有插件,换回默认主题,问题仍然存在。
5.与虚拟主机的PHP/MySQL软件版本无关。
6.之前已经发布的中文日志可以编辑添加中文并保存。可以通过先发布英文日志、再把英文日志修改成中文日志的方法发布中文日志(苍天啊,我前两篇日志就是这么发布的)。
解决
在论坛上我搜索到其他的朋友也碰到过这个问题,但不知如何解决。这其实是一个只存在于WordPress2.5.1的BUG,在2008年5月已经有人向WordPress提交了这个BUG的报告:some post text (persian) causes timeout on publish (not save)(某些包含波斯语的文本在发布时会导致超时错误)。中文和波斯语是一个德性,哈哈。
官方已给出修正方法,详见这里,在wp-includes/post.php第1289行,用绿色部分的代码替换掉红色部分的代码。
感谢
问题能解决,必须感谢yskin的帮助,在我求助的六个看上去都很牛的站长中,只有他给出了可以绕过BUG的办法,鹤立牛群。从yskin的解释中能深刻感觉到他对WordPress的熟悉程度远胜别人一筹,有实力的人就是不一样。在我找到解决方案后,yskin还耐心地对我刨根问底的追问给出了自己的解答:
从PHP的角度来讲,这两段代码应该是一样的,原来的代码使用的是双引号内直接使用$变量,后者是用类似C语言的printf函数的方式,在需要使用变量的地方用%s代替,然后后面跟上变量。
原则上PHP对两种方式的处理应该是一样的,并且都可以保证正确。后面这段代码把$alt_post_name和$post_type单独作为$wpdb->prepare()函数的参数,而该函数里有:array_walk($args, array(&$this, ‘escape_by_ref’)); 这样一段代码对所有参数做一个处理,所以估计是这里有bug导致中文录入的出错。
对比起其它寥寥数语的回复,yskin上千字的邮件让人感动,从邮件的条理性、针对性、严谨性我看到了一个认真、缜密、踏实、助人为乐的人,他教会我的不仅仅是WordPress里几个PHP语句。