这几天晚上都在忙着赶工
mywhere.org,中间遇到不少问题。借助于
google的帮忙,都还能找到解决办法。
才解决的一个问题是提供xml的动态输出。这里所说的输出不仅仅产生xml格式的字符串,同时要告知浏览器它所访问的内容是xml文档。由于url采用rewrite重写,没有.xml的后缀,要让笨笨的浏览器知道这是xml文档,必须利用header函数。比如:
header("content-type:text/xml")
但是当我试图在controller的任意action里面使用的时候,他总会输出:
Warning: Cannot modify header information - headers already sent by (output started at
我几乎搜索了
zend framework的所有代码,也没有找到输出header的地方,除了那个Zend_Controller_Action::_redirect()函数。那为什么还会出现这种错误呢?
利用google搜索了好久,终于在一篇
Zend framework tutorial的comment里面找到解决方法:
- 修改php.ini文件,将output_buffering参数设置为On
- 修改.htaccess文件,添加类似的设置,例如:php_value output_buffering "4096"
我本地的实验中,方法1毫无疑问解决了问题,但是方法2似乎有些问题。我利用方法2,打开网页,居然出现如下错误:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, webmaster@mywhere.org and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log
不明白是不是什么地方不对,我的环境是windows+apache。
这还只是解决了第一个问题,更奇怪的是在后面,这应该是Zend framework的一个bug了。
现在万事俱备,就可以生成xml内容了。在php5中,DOM XML库是没法再使用了,需要使用DOM库。新的当然比旧的要好:)
简单的写了几行代码,做个测试,但是用浏览器访问,却得到如下的结果:
XML Parsing Error: not well-formed
Line Number 1, Column 2:
这个错误比前面那个更要奇怪。通过察看page source,xml内容的格式完全没有错误。开始以为是因为内容中间包含中文字符,因此可能是encoding方面的问题。但是无论encoding从utf-8改为gb2312还是iso之类,都没有任何改变,甚至更糟:中文成了乱码。在办公室的电脑测试,发现全部为英文也有这种错误。
只有求助于google了,不断的搜索,不断的变换关键字,终于找到了解决方法。
ob_end_clean();
header("Content-Type: text/xml");
原因是,Zend Framework不知道在哪里提前输出了一些空格内容。