A-A+

eaccelerator与ZendFramework(或者是Yii)自动生成wsdl冲突

2012年03月29日 YIIFramework, 程序研究 暂无评论 阅读 2,046 次
如果您有代购或者代维服务器、PHP网站建设、程序代码修改、系统开发等需求,可以联系我购买付费服务。QQ 379880222

由于我们的项目是采用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,问题得到解决!
使用Yii生成wsdl出现的问题是:首次请求可以正确生成wsdl,再次请求就生成错误了。重新启动web服务器(nginx)后又可以正确生成一次,再次访问有无法正确生成。关闭eaccelerator,即可解决问题。

标签:

给我留言