zoukankan      html  css  js  c++  java
  • PHP Web Server 实例

      通过WebService,我们可以调用部署在其它地方的程序,而不用关心被调用的程序是在什么平台用什么语言编写的。这里我们使用php调用。

      在php4时代调用WebService大部分使用的nusoap,到了php5已经有了自己的soap扩展,我们只需要在php的配置文件php.ini开启扩展  

      extension = php_soap.dll
    

      

    实例程序

       定义一个实现业务逻辑的类文件basic.php

    //测试定义公开的类
    class Mywsdl {
        private $nombre = '';
        public function __construct($name = 'World') 
    	{
    		$this->name = $name;
    	}
        public function greet($name = '') 
    	{
    		$name = $name?$name:$this->name;
            return 'Hello '.$name.'.';
    	}
        public function serverTimestamp() 
    	{
    		return time();
    	}
    	public function myfunc($a=''){
    	    $arr = array('a'=>$a,'b'=>$a,'c'=>$a);
            return json_encode($arr);	}
    }
    

      一个类,返回一个字符串。假设这个程序在服务器A上面,如果想在服务器B上面调用这个程序怎么办?首先我们先要将这个类变成Web的服务,这就需要用到前面PHP的soap扩展了。

      创建服务server.php,需要使用到的SoapDiscovery.class.php文件

    require_once('basic.php');
    
    //define('WSDL_URL','hello.wsdl');        //定义WSDL文件路径
    ini_set('soap.wsdl_cache_enabled','0');    //关闭WSDL缓存
     
     //WSDL文件不存在时自动创建
    if(!file_exists('Mywsdl.wsdl'))
    {
        require_once 'SoapDiscovery.class.php';
        $disco = new SoapDiscovery('Mywsdl','www.zhuoqu.com');
        $str = $disco->getWSDL();
    }
     
    //SOAP开启并接收Client传入的参数响应 
    $server = new SoapServer('Mywsdl.wsdl',array('soap_version' => SOAP_1_2));
    $server->setClass('Mywsdl');
    $server->handle();
     
    

      OK,一个web服务搭建好了,上面的例子中,我们创建了一个SoapServer对象,人后利用setClass函数将我们刚才编写的basic类set进去,最后 handle()。现在如果用浏览器访问这个文件,会出现警告,这是正常的,因为这个文件不是用浏览器访问的,而是用另一个程序访问的。当一个客户端程序访问我们的webService时,运行到handle() 时会对客户端的输入进行处理,并输出结果给客户端,这里需要注意一下,不要在handle() 之前和之后输出任何东西,否者客户端会处理不了。

      现在,编写客户端访问我们的webservice

     

    $client = new SoapClient("http://127.0.0.1/s.php?wsdl");
    
    try {
    $result = $client->myfunc('789');
    var_dump(json_decode($result));
    echo "The answer is result";
    }
    catch (SoapFault $e){
    echo "Error Message: {$e->getMessage()}";
    }
    

      这样我们就可以通过访问客户端文件来获取我们需要的结果了

      SoapDiscovery.class.php文件

        

    <?php
      
    /**
     * Copyright (c) 2005, Braulio Jos?Solano Rojas
     * All rights reserved.
     * 
     * Redistribution and use in source and binary forms, with or without modification, are
     * permitted provided that the following conditions are met:
     * 
     * 	Redistributions of source code must retain the above copyright notice, this list of
     * 	conditions and the following disclaimer. 
     * 	Redistributions in binary form must reproduce the above copyright notice, this list of
     * 	conditions and the following disclaimer in the documentation and/or other materials
     * 	provided with the distribution. 
     * 	Neither the name of the Solsoft de Costa Rica S.A. nor the names of its contributors may
     * 	be used to endorse or promote products derived from this software without specific
     * 	prior written permission.
     * 
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
     * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
     * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     * 
     *
     * @version $Id$
     * @copyright 2005 
     */
    
    /**
     * SoapDiscovery Class that provides Web Service Definition Language (WSDL).
     * 
     * @package SoapDiscovery
     * @author Braulio Jos?Solano Rojas
     * @copyright Copyright (c) 2005 Braulio Jos?Solano Rojas
     * @version $Id$
     * @access public
     **/
    class SoapDiscovery {
    	private $class_name = '';
    	private $service_name = '';
    	
    	/**
    	 * SoapDiscovery::__construct() SoapDiscovery class Constructor.
    	 * 
    	 * @param string $class_name
    	 * @param string $service_name
    	 **/
    	public function __construct($class_name = '', $service_name = '') {
    		$this->class_name = $class_name;
    		$this->service_name = $service_name;
    	}
    	
    	/**
    	 * SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable.
    	 * 
    	 * @return string
    	 **/
    	public function getWSDL() {
    		if (empty($this->service_name)) {
    			throw new Exception('No service name.');
    		}
    		$headerWSDL = "<?xml version="1.0" ?>
    ";
    		$headerWSDL.= "<definitions name="$this->service_name" targetNamespace="urn:$this->service_name" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="urn:$this->service_name" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns="http://schemas.xmlsoap.org/wsdl/">
    ";
    		$headerWSDL.= "<types xmlns="http://schemas.xmlsoap.org/wsdl/" />
    ";
    
    		if (empty($this->class_name)) {
    			throw new Exception('No class name.');
    		}
    		
    		$class = new ReflectionClass($this->class_name);
    		
    		if (!$class->isInstantiable()) {
    			throw new Exception('Class is not instantiable.');
    		}
    		
    		$methods = $class->getMethods();
    		
    		$portTypeWSDL = '<portType name="'.$this->service_name.'Port">';
    		$bindingWSDL = '<binding name="'.$this->service_name.'Binding" type="tns:'.$this->service_name."Port">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
    ";
    		$serviceWSDL = '<service name="'.$this->service_name."">
    <documentation />
    <port name="".$this->service_name.'Port" binding="tns:'.$this->service_name."Binding"><soap:address location="http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF']."" />
    </port>
    </service>
    ";
    		$messageWSDL = '';
    		foreach ($methods as $method) {
    			if ($method->isPublic() && !$method->isConstructor()) {
    				$portTypeWSDL.= '<operation name="'.$method->getName()."">
    ".'<input message="tns:'.$method->getName()."Request" />
    <output message="tns:".$method->getName()."Response" />
    </operation>
    ";
    				$bindingWSDL.= '<operation name="'.$method->getName()."">
    ".'<soap:operation soapAction="urn:'.$this->service_name.'#'.$this->class_name.'#'.$method->getName()."" />
    <input><soap:body use="encoded" namespace="urn:$this->service_name" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
    </input>
    <output>
    <soap:body use="encoded" namespace="urn:$this->service_name" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
    </output>
    </operation>
    ";
    			    $messageWSDL.= '<message name="'.$method->getName()."Request">
    ";
    				$parameters = $method->getParameters();
    				foreach ($parameters as $parameter) {
    					$messageWSDL.= '<part name="'.$parameter->getName()."" type="xsd:string" />
    ";
    				}
    				$messageWSDL.= "</message>
    ";
    				$messageWSDL.= '<message name="'.$method->getName()."Response">
    ";
    				$messageWSDL.= '<part name="'.$method->getName()."" type="xsd:string" />
    ";
    				$messageWSDL.= "</message>
    ";
    			}
    		}
    		$portTypeWSDL.= "</portType>
    ";
    		$bindingWSDL.= "</binding>
    ";
    
            /**
             * 2017-01-16 17:35:12
             * author SUR
             */
            $file = fopen($this->class_name.'.wsdl','w');
    		fwrite($file,sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>')) ;
            fclose($file);
    	}
    	
    	/**
    	 * SoapDiscovery::getDiscovery() Returns discovery of WSDL.
    	 * 
    	 * @return string
    	 **/
    	public function getDiscovery() {
    		return "<?xml version="1.0" ?>
    <disco:discovery xmlns:disco="http://schemas.xmlsoap.org/disco/" xmlns:scl="http://schemas.xmlsoap.org/disco/scl/">
    <scl:contractRef ref="http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF']."?wsdl" />
    </disco:discovery>";
    	}
    }
    
    ?>
    

      

       来源   http://www.open-open.com/doc/view/fb5af38feff2470da22458e31c2087b1

            http://www.360doc.com/content/11/0212/16/15103_92457365.shtml

  • 相关阅读:
    jQuery里的$.ajax()方法详解
    express框架使用axios进行post请求, 两次请求问题
    electron-vue 报错 Unresolved node modules: bufferutil, utf-8-validate, canvas
    electron-vue离线打包
    个推技术:性能提升60%↑ 成本降低50%↓ Spark性能调优看这篇就够了!
    百亿级日志流分析实践 | 剖析个推后效分析功能实现原理
    iOS开发常用国外网站清单
    一篇文章搞定Git——Git代码管理及使用规范
    音视频技术入门——音频处理
    Java内存空间知识点梳理
  • 原文地址:https://www.cnblogs.com/jinxiblog/p/6369450.html
Copyright © 2011-2022 走看看