今天在工作中发现一个很难想到的问题。问题的详细情况是这样的:
我在本地的windowsxp系统中有个通过soap实现通信的php文件:
1.server.php:(服务端程序)
<?php
/**
* @author yang
* @date 2011-11-7
* @todo 为邮箱服务器端调用本地soap代理类的方法所提供的服务端类。
*/
class control_server{
/**
* @author yang
* @date 2011-11-7
* @todo 为邮箱服务器端调用soapEmail.php方法提供的服务端类。
*/
public function emailServer(){
$server=new SoapServer(null,array('uri' => "moudle_soapEmail"));
include DOCUMENT_ROOT.DS.'module/soapEmail.php';
$server->setClass("moudle_soapEmail");
$server->handle();
exit();
}
}
2.soapEmail.php:(要用soap执行的逻辑程序)
<?php
/**
* @author yang
* @date 2011-11-5
* @todo 提供给邮箱服务器端的同步邮箱功能
*/
class moudle_soapEmail extends base_sql{
/**
* @author yang
* @date 2011-11-5
* @todo 返回未同步的邮箱给邮箱服务器端
* @return array 未同步的邮箱的二维数组
*/
public function Get_NoSynEmail($md5){
if ($md5===md5('123456')) {
$sql="select * from `#__email` where SynFlag=0 limit 10";
return $this->db->fetchAll($sql);
}else{
return false;
}
}
/**
* @author yang
* @date 2011-11-5
* @todo 更新本地的email表中未同步的邮箱为同步过的
* @return array 更新成功与否
*/
public function Update_SynEmail($ids,$md5){
if ($md5===md5('123456')) {
if (!is_null($ids)) {
foreach ($ids as $key=>$val){
$sql="update `#__email` set SynFlag=1 where ID=".$val;
$this->db->query($sql);
}
return true;
}else{
return false;
}
}else{
return false;
}
}
}
3.soap.php: (客户端程序)
<?php
class control_soap{
public function client(){
try{
$soap = new SoapClient(null,array(
"location" => "http://localhost/server/emailServer.html",
"uri" => "moudle_soapEmail", //资源描述符服务器和客户端必须对应
"style" => 1,
"use" => 1
));
//$ids=array(0=>'0');
if($soap->Get_NoSynEmail(md5('318301'))){
print_r($soap->Get_NoSynEmail(md5('318301')));
//echo "good boy";
}
}catch(Exction $e){
echo print_r($e->getMessage(),true);
}
exit();
}
}
通过这样配置后,我在本地访问soap.php文件,很轻松的就访问到了。但是,我将代码提交到我们的服务器(就是官网上)去以后就访问不到。为什么呢?
呵呵。这个地方我要先提醒我们的服务器是linux的。但是linux就不能访问soap了。首先排除我们的服务器没有开soap的设想。因为已经开了。而且没开也会报错而不是通过访问http://marsku.com/server/emailServer.html的时候返回的是什么都没有。问题在哪儿呢?
先提出这句代码:include DOCUMENT_ROOT.DS.'module/soapEmail.php';这句代码的意思是我们网站的框架是自己写的。所以正常情况下soap找不到这个文件,所以必须手动的为soap写这句include来帮soap找到文件。问题知道出在哪儿了吗?
呵呵。你看这个DOCUMENT_ROOT.DS.'module\soapEmail.php',在windows中这样访问是没错的。而linux里面呢?linux里面的文件夹分隔符是“/”是吧。
所以,前面的一段是程序自动生成的“DOCUMENT_ROOT.DS”,不会错。而后半段呢?我们写死的“ 'module\soapEmail.php' ”。改过来:DOCUMENT_ROOT.DS.'module/soapEmail.php'就可以了。
是不是很搞笑啊?很蛋疼吧。