一个跟操作系统linux和windows差异有关的问题:通过soap的无wsdl实现php程序通信的程序(经典的吐血)

今天在工作中发现一个很难想到的问题。问题的详细情况是这样的:

我在本地的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'就可以了。

是不是很搞笑啊?很蛋疼吧。



你可能感兴趣的:(一个跟操作系统linux和windows差异有关的问题:通过soap的无wsdl实现php程序通信的程序(经典的吐血))