eaccelerator与Zend_Soap_AutoDiscover类的冲突

这段时间公司在开发一个项目,需要我开发一套WebService。用于和前端的Windows 应用程序交互。由于从未搞过这东西,一开始连什么是webService都不清楚。后来借助百度和google慢慢地学会了。由于我们的项目是采用zf框架的。所以自然采用zf来构建webService。zf框架构建webService还真的挺容易的。短短一段代码就搞定了。而且zf带有一个Zend_Soap_Autodiscover的类,它能帮助我们生成wsdl文件。这使得我们的工作变得更简单了。如下三行代码就能实现构建wsdl:
 $autodiscover = new Zend_Soap_AutoDiscover();
 $autodiscover->setClass('HelloWorldService');
 $autodiscover->handle();
当然前提是必须引入HelloWorldService这个类,Zend_Soap_AutoDiscover只会把这个类中所有公共的方法实现为webService。这个类在定义时所有公共的方法(也就是要暴露给webService的方法)必须采用以下格式写上注释
/**
* 类的作用(这个无关紧要)
*
* @param string $username
* @param string $password  这里是参数 一行一个 注意要声明类型
* @return bool 这个最重要,必须声明返回类型,不然实现出来的webService该方法无法被正常调用
*/
public function login()
{

}
做完这些,zf就能正常生成wsdl了。
本来以为webService的研究告一段落了,谁知道前几天公司要我把我本地的webService部署到公司的服务器(linux+nginx)上。原以为很简单的事情,我搞了2天才搞定。本来所有webService在我本地工作是正常的。但是部署到服务器后发现,所有的webService都没有返回值。查看wsdl才发现wsdl中所有的方法都没有定义返回值。查看修改了要暴露的类文件。发现里面注释格式是正确的。这下我毫无头绪了,到百度、google上面查了很久,都没有查到任何资料。最后无奈只能从Zend_Soap_AutoDiscover这个类的定义入手,一步步debug进去。研读了一个下午的代码,最后终于找到原因了。原来是获取注释失败。zf采用php5的反射api来获取这些注释,相关代码位于Zend\Server\Reflection\Function\Abstract.php中第268行$docBlock = $function->getDocComment();,通过尝试发现是php加速模块eaccelerator搞的鬼,原来eaccelerator会把代码中的注释全部去掉以减少内存的占有,关闭eaccelerator,问题得到解决!

经过这次调试。我才发现英文对于计算机专业的重要性。因为在网上这方面的资料特别少,偶尔找到一些也都是英文的,还好我的专业英语还马马虎虎,而且实在不行还可以看看源代码或者脚本来猜测,呵呵。

你可能感兴趣的:(eaccelerator与Zend_Soap_AutoDiscover类的冲突)