php soap 实例

 更新时间:2016年11月25日 16:09  点击:1559

  Server+Client+WSDL

 

声明:很简单!!!!!!

参考了如下:

 

先建Server,然后使用wsdl工具来生成wsdl,我用的是zend development environment,

zde中的tools中的wsdl generator wizard

第一页是名字,和输出地址(输出后直接挪过去就OK)

第二页是类和地址,类挑上勾,URL那里添server那个文件的地址

第三页 finish

别忘了拷那个wsdl过去...

 

记得server引用的那个类文件里不要有输出.

 

一共有两个需要添地址的地方

一个是wsdl中的描述http://127.0.0.1/test/CulculatorServer.php

一个是client中的连接http://127.0.0.1/test/Culculator.wsd

 

类文件

 

<?php

/**

 * @name Culculator.php

 * @date Fri Jan 25 12:43:40 CST 2008

 * @copyright 马永占(MyZ)

 * @author 马永占(MyZ)

 * @link http://blog.111cn.net/mayongzhan/

 */

 

class Culculator

{

       /**

        * 求和

        *

        * @param float $x

        * @param float $y

        * @return float

        */

       public function add($x, $y)

       {

              return $x + $y;

       }

}

?>

 

Server

 

<?php

/**

 * @name CulculatorServer.php

 * @date Fri Jan 25 12:44:04 CST 2008

 * @copyright 马永占(MyZ)

 * @author 马永占(MyZ)

 * @link http://blog.111cn.net/mayongzhan/

 */

 

include(''./Culculator.php'');

$server = new SoapServer(''./Culculator.wsdl'');

$server->setClass(''Culculator'');

$server->handle();

?>

 

Client

 

<?php

/**

 * @name CulculatorClient.php

 * @date Fri Jan 25 12:43:54 CST 2008

 * @copyright 马永占(MyZ)

 * @author 马永占(MyZ)

 * @link http://blog.111cn.net/mayongzhan/

 */

 

$soap = new SoapClient(''http://127.0.0.1/test/Culculator.wsdl'');

echo $soap->add(1, 2);

?>

 

WSDL

 

<?xml version=''1.0'' encoding=''UTF-8''?>

 

<!-- WSDL file generated by Zend Studio. -->

 

<definitions name="math" targetNamespace="urn:math" xmlns:typens="urn:math" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">

       <message name="add">

              <part name="x" type="xsd:float"/>

              <part name="y" type="xsd:float"/>

       </message>

       <message name="addResponse">

              <part name="addReturn" type="xsd:float"/>

       </message>

       <portType name="CulculatorPortType">

              <operation name="add">

                     <documentation>

                            求和

                     </documentation>

                     <input message="typens:add"/>

                     <output message="typens:addResponse"/>

              </operation>

       </portType>

       <binding name="CulculatorBinding" type="typens:CulculatorPortType">

              <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

              <operation name="add">

                     <soap:operation soapAction="urn:CulculatorAction"/>

                     <input>

                            <soap:body namespace="urn:math" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

                     </input>

                     <output>

                            <soap:body namespace="urn:math" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

                     </output>

              </operation>

       </binding>

       <service name="mathService">

              <port name="CulculatorPort" binding="typens:CulculatorBinding">

                     <soap:address location="http://127.0.0.1/test/CulculatorServer.php"/>

              </port>

       </service>

</definitions>


■PDO为何物?
POD(PHP Data Object)扩展在PHP5中加入,PHP6中将默认识用PDO连接数据库,所有非PDO扩展将会在PHP6被从扩展中移除。该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题。
我是配置在windows下做开发用的。
■PDO的目标
  • 提供一种轻型、清晰、方便的 API
  • 统一各种不同 RDBMS 库的共有特性,但不排除更高级的特性。
  • 通过 PHP 脚本提供可选的较大程度的抽象/兼容性。
  • ■PDO的特点:
  • 性能。PDO 从一开始就吸取了现有数据库扩展成功和失败的经验教训。因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利用 PHP 5 的最新特性。
  • 能力。PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RDBMS 独特功能的方便访问。
  • 简单。PDO 旨在使您能够轻松使用数据库。API 不会强行介入您的代码,同时会清楚地表明每个函数调用的过程。
  • 运行时可扩展。PDO 扩展是模块化的,使您能够在运行时为您的数据库后端加载驱动程序,而不必重新编译或重新安装整个 PHP 程序。例如,PDO_OCI 扩展会替代 PDO 扩展实现 Oracle 数据库 API。还有一些用于 MySQL、PostgreSQL、ODBC 和 Firebird 的驱动程序,更多的驱动程序尚在开发。

    ■安装PDO
    我这里是WINDOWS下开发用的PDO扩展,要是你要在Linux下安装配置,请到别的地方寻找。
    版本要求:
    php5.1以及以后版本的程序包里已经带了;
    php5.0.x则要到pecl.php.net下载,放到你的扩展库,就是PHP所在的文件夹的ext文件夹下;
    手册上说5.0之前的版本不能运行PDO扩展。

    配置:
    修改你的php.ini配置文件,使它支持pdo.(php.ini这个东西没有弄懂的话,先弄清楚,要修改调用你的phpinfo()函数所显示的那个php.ini)

    extension=php_pdo.dll前面的分号去掉,分毫是php配置文件注释符号,这个扩展是必须的。
    往下还有
    ;extension=php_pdo.dll
    ;extension=php_pdo_firebird.dll
    ;extension=php_pdo_informix.dll
    ;extension=php_pdo_mssql.dll
    ;extension=php_pdo_mysql.dll
    ;extension=php_pdo_oci.dll
    ;extension=php_pdo_oci8.dll
    ;extension=php_pdo_odbc.dll
    ;extension=php_pdo_pgsql.dll
    ;extension=php_pdo_sqlite.dll

    各各扩展所对应的数据库是:

    Server+Client

     

    上篇用了wsdl这个写不用wsdl.

     

    声明:很简单!!!!!!

    参考了如下:

    http://blog.111cn.net/phphot/archive/2007/07/15/1692109.aspx

     

    类文件

     

    <?php

    /**

    * 实现业务逻辑的类,此类是一个普通类

    *

    */

    class Basic {

           /**

            * 返回一个字符串:Hello World!

            *

            * @return string

            */

           public function returnString($test){

                   return "Hello World!".$test;

           }

    }

    ?>

    Server

     

    <?php

    /**

    * Web ServiceServer端,包含类文件。

    */

    require_once("basic.php");

    /**

    * 创建Server对象

    */

    $arrOptions = array(''uri''=>''checkAPI'');    //设置命名空间

    $objSoapServer = new SoapServer(null,$arrOptions);

    /**

    * 注册Basic类的所有方法

    */

    $objSoapServer->setClass("Basic");

    /**

    * 处理请求

    */

    $objSoapServer->handle();

    ?>

     

    Client

     

    <?php

    /**

    * Client端,首先创建Client对象

    */

    $arrOptions = array(''uri''=>''checkAPI'',                     //设置命名空间

                           ''location''=>''http://localhost/user/soaptest.php'',        //设置Server地址

                           ''trace''=>true);

    $objSoapClient = new SoapClient(null,$arrOptions);

    /**

    * 远程调用

    */

    $test=''ok123'';

    try{

       $strReturn = $objSoapClient->returnString($test);

    }catch(Exception $e){

    }

    /**

    * 打印结果

    */

    echo $strReturn;

    ?>

    Driver name Supported databases
    PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
    PDO_FIREBIRD Firebird/Interbase 6
    PDO_INFOR

     fsockopen

    socket方式打开一个连接

    我最常用的是模拟post

    这个是小李挖掘的到的...不错

    至于要模拟get方式....直接file_get_content就行了.

    代码见后面

     

    stream_socket_client, 代码见后面

    这个和fsockopenfsockopen一样.socket方式打开一个连接,只是参数不同

     

    stream_socket_server

    建立一个socket server, 代码见后面

    如果是建立的是tcpserver 就用stream_socket_accept进行通讯

    如果是建立的是udpserver 就用stream_socket_recvfromstream_socket_sendto进行通讯,而且stream_socket_server中需要加个参数STREAM_SERVER_BIND

     

    还有个socket扩展,这个是最基础的建立socket,但是从5.3.0开始就放到pecl中了.

    这里就不介绍了.

     

    ---------------------------- stream_socket client---------------------------

     

    <?php

    /**

     * @name test.php

     * @date Sun Jan 27 00:49:00 CST 2008

     * @copyright 马永占(MyZ)

     * @author 马永占(MyZ)

     * @link http://blog.111cn.net/mayongzhan/

     */

     

    $xport = "tcp";

    $port = "8001";

    $ip = "127.0.0.1";

    $address = "{$xport}://{$ip}:{$port}";

    $fp = stream_socket_client($address, $errno, $errstr, 1);

    if (!$fp) {

        echo "$errstr ($errno)<br /> ";

    } else {

        fwrite($fp, " ");

        echo fread($fp, 1024);

        fclose($fp);

    }

    ?>

     

    ---------------------------- streamSocketServer---------------------------

     

    <?php

    /**

     * @name test2.php

     * @date Sun Jan 27 00:45:57 CST 2008

     * @copyright 马永占(MyZ)

     * @author 马永占(MyZ)

     * @link http://blog.111cn.net/mayongzhan/

     */

    header("Content-type: text/html;charset=utf-8");

    //设置不超时.服务端当然不能超时

    set_time_limit(0);

    //得到可用socket

    $xportlist = stream_get_transports();

    echo "transports: ";

    foreach ($xportlist as $value) {

           echo "{$value} ";

    }

    //定义一些东西

    $xport = "tcp";

    $port = "8001";

    $address = "{$xport}://0.0.0.0:{$port}";

    //建立socketserver

    if ($xport==''tcp'') {

           $socket = stream_socket_server($address, $errno, $errstr);

    }

    elseif ($xport==''udp'') {

           $socket = stream_socket_server($address, $errno, $errstr, STREAM_SERVER_BIND);

    }

    if (!$socket) {

           echo "{$errstr} ({$errno}) ";

    }

    else {

           echo "listening {$xport}:{$port} ... ";

           if ($xport==''tcp'') {

                  //许可一个socket连接,-1超时

                  while ($conn = stream_socket_accept($socket,-1)) {

                         //得到访问的端口

                         $peer = stream_socket_get_name($conn,true);

                         echo "$peer ";

                      fwrite($conn, ''The local time is '' . date("Y-m-d H:i:s "));

                      fclose($conn);

                  }

           }

           elseif ($xport==''udp'') {

                  do {

                         //得到访问的端口

                      $pkt = stream_socket_recvfrom($socket, 1, 0, $peer);

                      echo "$peer ";

                      stream_socket_sendto($socket, date("Y-m-d H:i:s "), 0, $peer);

                  } while ($pkt !== false);

           }

           //关闭socket

           fclose($socket);

    }

    ?>

     

    ---------------------------- fsockopen(post)---------------------------

     

    <?php

    /**

     * @name test.php

     * @date Sat Jan 26 23:01:23 CST 2008

     * @copyright 马永占(MyZ)

     * @author 马永占(MyZ)

     * @link http://blog.111cn.net/mayongzhan/

     */

     

    /**

     * php 发送POST请求

     *

     * @param string $url 提交到的地址

     * @param array $data 要提交的参数 array(''a''=>'''',''b''=>'''');

     * @return string

     */

    function virtualPost($url, $data) {

           $url = parse_url($url);

           if (!$url) return "URL不能解析";

           if (!isset($url[''port'']))  $url[''port''] = "";

           if (!isset($url[''query''])) $url[''query''] = ""; 

           $encoded = "";

           while (list($k,$v) = each($data)) {

                  $encoded .= ($encoded ? "&" : "");

                  $encoded .= rawurlencode($k)."=".rawurlencode($v);

           }

           //$fp = stream_socket_client($url[''host''].":".($url[''port''] ? $url[''port''] : 80));

           $fp = fsockopen($url[''host''], $url[''port''] ? $url[''port''] : 80);

           if (!$fp) return "不能打开到$url[host]的连接";

           //发送

           fputs($fp, sprintf("POST %s%s%s HTTP/1.0 ", $url[''path''], $url[''query''] ? "?" : "", $url[''query'']));

           fputs($fp, "Host: $url[host] ");

           fputs($fp, "Content-type: application/x-www-form-urlencoded ");

           fputs($fp, "Content-length: " . strlen($encoded) . " ");

           fputs($fp, "Connection: close ");

           fputs($fp, "$encoded ");

           //接受

           $line = fgets($fp,1024);

           if (!eregi("^HTTP/1.. 200", $line)) return "返回结果错误";

           //滤掉空行

           $results = "";

           $inheader = 1;

           while(!feof($fp)) {

                  $line = fgets($fp,1024);

                  //把剩余的头信息过滤掉

                  if ($inheader && ($line == " " || $line == " ")) {

                         $inheader = 0;

                  }elseif (!$inheader) {

                         $results .= $line;

                  }

           }

           fclose($fp);

           return $results;

    }

    echo virtualPost(''http://127.0.0.1/test/test2.php'',array(myz=>''马永占''));

     

    ?>

    一、问题起源

    稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个模块中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题,就是用户在这个服务器登录之后,进入另一个服务器的别的模块时,仍然需要重新登录,这就是一次登录,全部通行的问题,映射到技术上,其实就是各个服务器之间如何实现共享 SESSION 数据的问题。

    二、PHP SESSION 的工作原理

    在解决问题之前,先来了解一下 PHP SESSION 的工作原理。在客户端(如浏览器)登录网站时,被访问的 PHP 页面可以使用 session_start() 打开 SESSION,这样就会产生客户端的唯一标识 SESSION ID(此 ID 可通过函数 session_id() 获取/设置)。SESSION ID 可以通过两种方式保留在客户端,使得请求不同的页面时,PHP 程序可以获知客户端的 SESSION ID;一种是将 SESSION ID 自动加入到 GET 的 URL 中,或者 POST 的表单中,默认情况下,变量名为 PHPSESSID;另一种是通过 COOKIE,将 SESSION ID 保存在 COOKIE 中,默认情况下,这个 COOKIE 的名字为 PHPSESSID。这里我们主要以 COOKIE 方式进行说明,因为应用比较广泛。

    那么 SESSION 的数据保存在哪里呢?当然是在服务器端,但不是保存在内存中,而是保存在文件或数据库中。默认情况下,php.ini 中设置的 SESSION 保存方式是 files(session.save_handler = files),即使用读写文件的方式保存 SESSION 数据,而 SESSION 文件保存的目录由 session.save_path 指定,文件名以 sess_ 为前缀,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了。如果访问量大,可能产生的 SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path="N;/save_path",N 为分级的级数,save_path 为开始目录。当写入 SESSION 数据的时候,PHP 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到相应的 SESSION 文件,不存在则创建之,最后将数据序列化之后写入文件。读取 SESSION 数据是也是类似的操作流程,对读出来的数据需要进行解序列化,生成相应的 SESSION 变量。

    三、多服务器共享 SESSION 的主要障碍及解决办法

    通过了解 SESSION 的工作原理,我们可以发现,在默认情况下,各个服务器会各自分别对同一个客户端产生 SESSION ID,如对于同一个用户浏览器,A 服务器产生的 SESSION ID 是 30de1e9de3192ba6ce2992d27a1b6a0a,而 B 服务器生成的则是 c72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。

  • [!--infotagslink--]

    相关文章

    • 源码分析系列之json_encode()如何转化一个对象

      这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
    • php中去除文字内容中所有html代码

      PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
    • index.php怎么打开?如何打开index.php?

      index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
    • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

      复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
    • PHP编程 SSO详细介绍及简单实例

      这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
    • PHP实现创建以太坊钱包转账等功能

      这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
    • php微信公众账号开发之五个坑(二)

      这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
    • PHP如何通过date() 函数格式化显示时间

      这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
    • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

      首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
    • 快速理解MySQL中主键与外键的实例教程

      主键与外键的关系,通俗点儿讲,我现在有一个论坛,有两张表,一张是主贴 thread,一张是回帖 reply先说说主键,主键是表里面唯一识别记录的字段,一般是帖子id,体现在访问的时候,例如是 thread.php&#63;id=1 表示我要访问的是帖子...2015-11-24
    • C# Soap调用WebService的实例

      下面小编就为大家带来一篇C# Soap调WebService的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
    • golang与php实现计算两个经纬度之间距离的方法

      这篇文章主要介绍了golang与php实现计算两个经纬度之间距离的方法,结合实例形式对比分析了Go语言与php进行经纬度计算的相关数学运算技巧,需要的朋友可以参考下...2016-07-29
    • c# 接口使用实例

      这篇文章主要介绍了c#接口使用的实例,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-17
    • yii添删改查实例

      一、数据访问对象 (DAO)YiiDAO 基于 PHP Data Objects (PDO) 构建。它是一个为众多流行的DBMS提供统一数据访问的扩展,这些 DBMS 包括MySQL, PostgreSQL 等等。因此,要使用 Yii DAO,PDO 扩展和特定的 PDO 数据库驱动(例如...2015-11-24
    • PHP+jQuery+Ajax实现多图片上传效果

      今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
    • PHP正则表达式过滤html标签属性(DEMO)

      这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06
    • php构造方法中析构方法在继承中的表现

      这篇文章主要为大家详细介绍了php构造方法中析构方法在继承中的表现,感兴趣的小伙伴们可以参考一下...2016-04-15
    • PHP如何使用cURL实现Get和Post请求

      这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
    • thinkPHP中多维数组的遍历方法

      这篇文章主要介绍了thinkPHP中多维数组的遍历方法,以简单实例形式分析了thinkPHP中foreach语句的使用技巧,需要的朋友可以参考下...2016-01-12
    • 谈谈PHP中相对路径的问题与绝对路径的使用

      经常看到有人踩在了PHP路径的坑上面了,感觉有必要来说说PHP中相对路径的一些坑,以及PHP中绝对路径的使用,下面一起来看看。 ...2016-08-24