<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[小宇飞刀的BLOG]]></title> 
<link>http://vir.jxstnu.edu.cn/xieyunc/index.php</link> 
<description><![CDATA[小宇的网上家园 飞刀的技术博客]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[小宇飞刀的BLOG]]></copyright>
<item>
<link>http://vir.jxstnu.edu.cn/xieyunc/read.php?256</link>
<title><![CDATA[用 PHP 读取和编写 XML DOM[转]]]></title> 
<author>xieyunc &lt;xieyunc@jxstnu.cn&gt;</author>
<category><![CDATA[PHP&amp;MySQL]]></category>
<pubDate>Thu, 22 Jan 2009 01:13:09 +0000</pubDate> 
<guid>http://vir.jxstnu.edu.cn/xieyunc/read.php?256</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;有许多技术可用于用 PHP 读取和编写 XML。本文提供了三种方法读取 XML：使用 DOM 库、使用 SAX 解析器和使用正则表达式。还介绍了使用 DOM 和 PHP 文本模板编写 XML。用 PHP 读取和编写可扩展标记语言（XML）看起来可能有点恐怖。实际上，XML 和它的所有相关技术可能是恐怖的，但是用 PHP 读取和编写 XML 不一定是项恐怖的任务。首先，需要学习一点关于 XML 的知识 —— 它是什么，用它做什么。然后，需要学习如何用 PHP 读取和编写 XML，而有许多种方式可以做这件事。本文提供了 XML 的简短入门，然后解释如何用 PHP 读取和编写 XML。<br/>............<br/><br/>Tags - <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=php" rel="tag">php</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=%25E8%25AF%25BB%25E5%258F%2596" rel="tag">读取</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=xml" rel="tag">xml</a>
]]>
</description>
</item><item>
<link>http://vir.jxstnu.edu.cn/xieyunc/read.php?255</link>
<title><![CDATA[PHP的WEB服务编程工具---NuSoap介绍[转]]]></title> 
<author>xieyunc &lt;xieyunc@jxstnu.cn&gt;</author>
<category><![CDATA[PHP&amp;MySQL]]></category>
<pubDate>Wed, 21 Jan 2009 23:48:36 +0000</pubDate> 
<guid>http://vir.jxstnu.edu.cn/xieyunc/read.php?255</guid> 
<description>
<![CDATA[ 
	<p>&nbsp;&nbsp;&nbsp; NuSOAP 是 PHP 环境下的 WEB 服务编程工具，用于创建或调用 WEB 服务。它是一个开源软件，当前版本是 0.7.2 ，支 持 SOAP1.1 、 WSDL1.1 ，可以与其他支持 SOAP1.1 和 WSDL1.1 的系统互操作。 NuSOAP 完全由PHP语言编 写，由一系列 PHP 类组成，不需要扩展库的支持，这种特性使得 NuSOAP 可以用于所有的 PHP 环境，不受服务器安全设置的影响。</p><h1>1. NuSOAP 的获取和安装</h1><p>NuSOAP 项目建立在 SourceForge 上，网络地址是： <a href="http://sourceforge.net/projects/nusoap/"><span style="color: #006629"><a href="http://sourceforge.net/projects/nusoap/" target="_blank">http://sourceforge.net/projects/nusoap/</a> </span></a> 或 <a href="http://dietrich.ganx4.com/nusoap"><span style="color: #009900"><a href="http://dietrich.ganx4.com/nusoap" target="_blank">http://dietrich.ganx4.com/nusoap</a></span></a>，这里，可以下载到 NuSOAP 的最新的版本。</p><p>NuSOAP 的安装比较简单，把下载的 NuSOAP 的文件拷贝到服务器上，可以放在独立的目录里，也可以与程序代码放在相同的目录里，只要你的 PHP 代码能够访问到这些文件就可以了。</p><p>本文的测试环境基于 PHP4.3.2 和 NuSOAP 0.7.2 版本， NuSOAP 安装在 WEB 目录&ldquo; /nusoap &rdquo;里，有 两个子目录， lib 和 samples 。其中， lib 目录下存放 NuSOAP 的所有源代码文件， samples 目录下是NuSOAP开 发小组提供一些的例子。测试文件存放在 WEB 目录&ldquo; /nusoap &rdquo;里。</p><h1> </h1><h1>2. NuSOAP 的使用</h1><p>NuSOAP 由一 PHP 的类组成，其中最常用到的是类soap_server和类soalclient。类soap_server 用于创建 WEB 服务，类soapclient在访问WEB服务时会用到。</p><h2>2.1 一个简单的例子： Hello World</h2><p>这个例子将利用 NuSOAP 创建一个简单的 WEB 服务，并利用 NuSOAP 创建一个客户端程序，调用这个服务。这个服务唯一的功能就是 向客户端返回一个字符串&ldquo; Hello World &rdquo;。首先，创建 WEB 服务程序代码文件&ldquo; /nusoap /nusoap_server1.php &rdquo;：</p><pre>&nbsp;&nbsp;//把 NuSOAP 的源文件包含到当前的代码文件里<br />&nbsp;&nbsp;&lt;?php&nbsp;&nbsp;require_once(&quot;lib/nusoap.php&quot;);<br />&nbsp;&nbsp;//定义服务程序<br />&nbsp;&nbsp;function hello() &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;return 'Hello World!';<br />&nbsp;&nbsp;&#125;<br />&nbsp;&nbsp;//初始化服务对象 , 这个对象是类 soap_server 的一个实例&nbsp;&nbsp;<br />&nbsp;&nbsp;$soap = new soap_server; </pre><pre>&nbsp;&nbsp;//调用服务对象的 register 方法注册需要被客户端访问的程序。&nbsp;&nbsp;<br />&nbsp;&nbsp;//只有注册过的程序，才能被远程客户端访问到。<br />&nbsp;&nbsp;$soap-&gt;register('hello'); </pre><pre>&nbsp;&nbsp;//最后一步，把客户端通过 post 方式提交的数据，传递给服务对象的 service 方法。<br />&nbsp;&nbsp;//service 方法处理输入的数据，调用相应的函数或方法，并且生成正确的反馈，传回给客户端。 <br />&nbsp;&nbsp;$soap-&gt;service($HTTP_RAW_POST_DATA);<br />?&gt; </pre><p>至此， WEB 服务程序代码文件已经建好，接下来，创建一个客户端程序代码文件&ldquo; /nusoap/nusoap_client1.php &rdquo;，调用 WEB 服务：</p><pre>//把 NuSOAP 的源文件包含到当前的代码文件里<br />&lt;?php<br />&nbsp;&nbsp;require_once(&quot;lib/nusoap.php&quot;);&nbsp;&nbsp;<br />&nbsp;&nbsp;//初始化客户端对象，这个对象是类 soapclient 的一个实例，&nbsp;&nbsp;<br />&nbsp;&nbsp;//把服务程序的 URL 地址传递给soapclient类的构造函数。<br />&nbsp;&nbsp; $client = new soapclient('http://127.0.0.1/nusoap/nusoap_server1.php'); </pre><pre>&nbsp;&nbsp;//利用客户端对象的 call 方法调用 WEB 服务的程序$str=$client-&gt;call('hello'); </pre><pre>&nbsp;&nbsp;//客户端对象的 getError() 方法可以用来检查调用过程是否出现错误。&nbsp;&nbsp;<br />&nbsp;&nbsp;//如果没有错误， getError() 方法返回 false ；如果有错误， getError()方法返回错误信息。<br />&nbsp;&nbsp; if (!$err=$client-&gt;getError()) &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp; echo &quot; 程序返回 :&quot;,htmlentities($str,ENT_QUOTES);&#125; <br />&nbsp;&nbsp; else &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp; echo &quot; 错误 :&quot;,htmlentities($err,ENT_QUOTES);&#125;<br />?&gt; </pre><p>至此，客户端程序也建立好了，打开浏览器，访问客户端程序，看一下结果。这个例子，浏览器会显示字符串：&ldquo;程序返回 :Hello World! &rdquo;</p><h2>2.2 传递参数和返回错误信息的方法</h2><p>再通过例子说明传递参数和返回错误信息的方法。这个例子实现两个字符串的连接，参数是两个字符串，返回值是由两个参数连接而成的字符串。首先，创建服务程序代码文件&ldquo; /nusoap/nusoap_server2.php &rdquo;，完整的代码如下：</p><pre>&lt;?php<br />&nbsp;&nbsp; require_once(&quot;lib/nusoap.php&quot;);<br />&nbsp;&nbsp; function concatenate($str1,$str2) &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp; if (is_string($str1) &amp;&amp; is_string($str2))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $str1 . $str2;<br />&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new soap_fault('client','','concatenate 函数的参数应该是两个字符串 ');&nbsp;&nbsp;<br />&nbsp;&nbsp;&#125;<br />&nbsp;&nbsp;$soap = new soap_server;<br />&nbsp;&nbsp;$soap-&gt;register('concatenate');<br />&nbsp;&nbsp;$soap-&gt;service($HTTP_RAW_POST_DATA);<br />?&gt; </pre><p>与 2.1 节 WEB 服务程序的代码比较，这里的代码结构大体是相同的。注意以下两点：</p><ul><br />&nbsp;&nbsp;&nbsp;&nbsp;<li>服务程序的定义不同，带有两个参数。 NuSOAP 注册服务程序的过程还是一样的，都是调用服务对象的 register 方法。</li>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<li>这里使用了 NuSOAP 的一个新类 soap_fault 。当传入的两个参数有一个不是字符串时，程序通过这个类把错误信息返回给客户端。这个类的构造函数有 4 个参数：</li>&nbsp;&nbsp;&nbsp;&nbsp;<br /></ul><table border="0" cellspacing="0" cellpadding="0" align="center">&nbsp;&nbsp;&nbsp;&nbsp;<tbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<tr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td width="108" valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<p>fault</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<p>code</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td width="388" valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<p>必填参数 , 建议值为&ldquo; Client &rdquo;或&ldquo; Server &rdquo;，指明错误是客户端的错误还是服务端的错误。</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<tr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td width="108" valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<p>faultactor</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td width="388" valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<p>预留项，现在还没有使用</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<tr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td width="108" valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<p>faultstring</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td width="388" valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<p>错误的描述信息</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<tr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td width="108" valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<p>faultdetail</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td width="388" valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<p>可选项， XML 格式的数据 , 说明详细的错误信息</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tr>&nbsp;&nbsp;&nbsp;&nbsp;</tbody></table><p>客户端程序代码文件&ldquo; /nusoap/nusoap_client2.php &rdquo;的完整内容如下 :</p><pre>&lt;?php<br />&nbsp;&nbsp;require_once(&quot;lib/nusoap.php&quot;);<br />&nbsp;&nbsp;$client = new soapclient('http://127.0.0.1/nusoap/nusoap_server2.php');<br />&nbsp;&nbsp;$parameters=array(' 字符串 1',' 字符串 2'); <br />&nbsp;&nbsp;$str=$client-&gt;call('concatenate',$parameters); <br />&nbsp;&nbsp;if (!$err=$client-&gt;getError()) &#123;<br />&nbsp;&nbsp; echo &quot; 程序返回 :&quot;,$str;&#125;<br />&nbsp;&nbsp;else &#123;<br />&nbsp;&nbsp; echo &quot; 错误 :&quot;,$err;&#125;<br />?&gt; </pre><p>NuSOAP 的客户端调用带参数的 WEB 服务时，使用数组传递参数。 $parameters 是一个数组，其中依次是每个参数的值。客户端 在调用远程的服务程序时，使用带有两个参数的 call 方法，第一个参数是服务程序的名称，第二个参数是服务程序的参数数组，这里 是 $parameters 。通过浏览器访问上面的客户端程序，浏览器上会显示字符串：&ldquo; 程序返回 : 字符串 1 字符串 2 &rdquo;</p><p>接下来，试着给 WEB 服务程序传入错误参数，修改上面的客户端程序，把生成参数数组的语句改成： $parameters=array(&ldquo; 字 符串 &rdquo;,12) ，再通过浏览器访问客户端程序，浏览器上会显示字符串：&ldquo;错误 : 客户端 : concatenate 函数的参数应该是两个字符串 &rdquo;。 WEB 服务程序判断传入的参数有一个不是字符串，通过 soap_fault 给客户端返回错误信息。</p><h2>2.3 调试的方法</h2><p>NuSOAP中常用的调试方法有三种:</p><h3>2.3.1 soapclient 类的 request 和 response 成员变量</h3><p>最直接的调试方法就是检查访问 WEB 服务的过程中，客户端发出的 request 信息和服务端返回的 response 信 息。 soapclient 类的 request 和 response 成员变量包含这些信息，在程序中显示出这两个变量的内容，可以帮助分析程序运 行的情况。看下面的代码:</p><pre>&lt;?php<br />&nbsp;&nbsp;require_once(&quot;lib/nusoap.php&quot;);<br />&nbsp;&nbsp;$client = new soapclient('http://127.0.0.1/nusoap/nusoap_server2.php');<br />&nbsp;&nbsp;$parameters=array(' 字符串 1',' 字符串 2');<br />&nbsp;&nbsp;$str=$client-&gt;call('concatenate',$parameters);<br />&nbsp;&nbsp;if (!$err=$client-&gt;getError()) &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;echo &quot; 程序返回 :&quot;,$str;&#125;<br />&nbsp;&nbsp;else &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;echo &quot; 错误 :&quot;,$err;&#125;<br />&nbsp;&nbsp;//下面显示request和response 变量的内容<br />&nbsp;&nbsp;echo '&lt;p/&gt;';<br />&nbsp;&nbsp;echo 'Request:';<br />&nbsp;&nbsp;echo '&lt;pre&gt;',htmlspecialchars($client-&gt;request,ENT_QUOTES),'&lt;/pre&gt;';<br />&nbsp;&nbsp;echo 'Response:';<br />&nbsp;&nbsp;echo '&lt;pre&gt;',htmlspecialchars($client-&gt;response,ENT_QUOTES ),'&lt;/pre&gt;';<br /> ?&gt; </pre><h3>2.3.2 soapclient 类的 debug_str 成员变量</h3><p>soapclient 类的 debug_str 成员变量提供了更为详细的调试信息，查看这个变量的内容，可以更好地帮助程序调试。</p><h3>2.3.3 WEB 服务程序提供的调试方法</h3><p>WEB 服务程序代码中，在创建 soap_server 类的实例前，定义变量 $debug=1 。调试信息作为备注，放在 SOAP 消息的尾部返回客户端，客户端通过查看 WEB 服务的 response 信息来查看调试信息。</p><pre>&lt;?php<br />&nbsp;&nbsp;require_once(&quot;lib/nusoap.php&quot;);<br />&nbsp;&nbsp;function concatenate($str1,$str2) &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;if (is_string($str1) &amp;&amp; is_string($str2))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $str1 . $str2;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new soap_fault('client','','concatenate 函数的参数应该是两个字符串 ');<br />&nbsp;&nbsp;&#125;<br />&nbsp;&nbsp;$debug=1; //定义调试<br />&nbsp;&nbsp;$soap = new soap_server;<br />&nbsp;&nbsp;$soap-&gt;register('concatenate');<br />&nbsp;&nbsp;$soap-&gt;service($HTTP_RAW_POST_DATA);<br />?&gt; </pre><h2>2.4 对 WSDL 的支持</h2><p>NuSOAP 内部通过类 &quot;WSDL&quot; 实现对 WSDL 的支持。对于 NuSOAP 的用户来说，不需要关心内部的WSDL类是如何工作的，正确地使用 soap_server 类和 soapclient 类就可以实现对 WSDL 的支持。</p><h3>2.4.1 创建支持 WSDL 的 WEB 服务</h3><p>为了实现 WEB 服务程序对 WSDL 的支持，需要使用 soap_server 的 configureWSDL 方法，并且在调 用 soap_server 的 register 方法注册 WEB 服务程序时，需要提供更详细的参数。看下面的代码，代码的文件名 是 &ldquo;/nusoap/nusoap_server3.php&rdquo;。</p><pre>&lt;?php<br />&nbsp;&nbsp;require_once(&quot;lib/nusoap.php&quot;);<br />&nbsp;&nbsp;function concatenate($str1,$str2) &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp; if (is_string($str1) &amp;&amp; is_string($str2))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $str1 . $str2;<br />&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new soap_fault('client','','concatenate 函数的参数应该是两个字符串 ');<br />&nbsp;&nbsp;&#125;<br />&nbsp;&nbsp;$soap = new soap_server;<br />&nbsp;&nbsp;$soap-&gt;configureWSDL('concatenate'); <br />&nbsp;&nbsp;// 初始化对 WSDL 的支持<br />&nbsp;&nbsp;// 注册服务<br />&nbsp;&nbsp;$soap-&gt;register('concatenate',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array(&quot;str1&quot;=&gt;&quot;xsd:string&quot;,&quot;str2&quot;=&gt;&quot;xsd:string&quot;),// 输入参数的定义<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array(&quot;return&quot;=&gt;&quot;xsd:string&quot;)// 返回参数的定义<br />&nbsp;&nbsp;);<br />&nbsp;&nbsp;$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';<br />&nbsp;&nbsp;$soap-&gt;service($HTTP_RAW_POST_DATA);<br />?&gt; </pre><p>现在打开浏览器，访问刚才建立的文件，<a href="http://127.0.0.1/nusoap/nusoap_server3.php" target="_blank">http://127.0.0.1/nusoap/nusoap_server3.php</a>，结果如下：</p><div>concatenate<br />View the <strong>WSDL</strong> for the service. Click on an operation name to view it&amp;apos;s details.<div><br /><strong>concatenate</strong></div></div><p>点击函数名称concatenate，可以看到对函数的描述。点击&quot;WSDL&quot;，或者访问WEB服务文件，并在后面加上查询字符串&quot;?wsdl&quot; (<a href="http://127.0.0.1/nusoap/nusoap_server3.php?wsdl)" target="_blank">http://127.0.0.1/nusoap/nusoap_server3.php?wsdl)</a>，可以得到WEB服务的WSDL内容。</p><h3>2.4.2 通过 WSDL 调用 WEB 服务</h3><p>通过 WSDL 调用 WEB 服务，与不通过 WSDL 调用 WEB 服务，程序的结构大体相同。区别在于，通过 WSDL 调用 WEB 服 务，初始化 soapclient 类时，传入两个参数到 soapclient 的构造函数，第一个参数是 WSDL 文件的地址，第二个参数指定是否 使用 WSDL ，指定为 true 即可。看下面的代码，代码的文件名是 &ldquo; /nusoap/nusoap_client3.php &rdquo;</p><pre>&lt;?php<br />&nbsp;&nbsp;require_once(&quot;lib/nusoap.php&quot;);<br />&nbsp;&nbsp;$client = new soapclient('http://127.0.0.1/nusoap/nusoap_server3.php?wsdl',true);<br />&nbsp;&nbsp;$parameters=array(' 字符串 1',' 字符串 2');<br />&nbsp;&nbsp;$str=$client-&gt;call('concatenate',$parameters);<br />&nbsp;&nbsp;if (!$err=$client-&gt;getError()) &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp; echo &quot; 程序返回 :&quot;,$str;&#125;<br />&nbsp;&nbsp;else &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp; echo &quot; 错误 :&quot;,$err;&#125;<br />?&gt; </pre><h3>2.4.3 代理的使用</h3><p>NuSOAP 提供代理的方法调用远程 WEB 服务。这种方法，在客户端程序里面创建一个远程服务的代理对象，通过代理直接调用远程的 WEB 服务，而不需要通过 soalclient 类的 call 方法。看下面的代码。</p><pre>&lt;?php<br />&nbsp;&nbsp;require_once(&quot;lib/nusoap.php&quot;);<br />&nbsp;&nbsp;$client = new soapclient('http://127.0.0.1/nusoap/nusoap_server3.php?wsdl',true);<br />&nbsp;&nbsp;$proxy=$client -&gt; getProxy(); // 创建代理对象 (soap_proxy 类 )<br />&nbsp;&nbsp;$str=$proxy-&gt;concatenate(&quot; 参数 1&quot;,&quot; 参数 2&quot;); // 直接调用 WEB 服务<br />&nbsp;&nbsp;if (!$err=$proxy-&gt;getError()) &#123; <br />&nbsp;&nbsp;&nbsp;&nbsp; echo &quot; 程序返回 :&quot;,$str;&#125; <br />&nbsp;&nbsp;else &#123; <br />&nbsp;&nbsp;&nbsp;&nbsp; echo &quot; 错误 :&quot;,$err;&#125;<br />?&gt; </pre><h2>3. 更多的学习资源</h2><ul><br />&nbsp;&nbsp;&nbsp;&nbsp;<li><a href="http://dietrich.ganx4.com/nusoap/"><span style="color: #006629"><a href="http://dietrich.ganx4.com/nusoap/" target="_blank">http://dietrich.ganx4.com/nusoap/</a></span></a></li>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<li>Scott Nichol. <a href="http://www.scottnichol.com/nusoapprog.htm"><span style="color: #006629">Programming with NuSOAP</span></a>. 24 Apr 2003</li>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<li>Scott Nichol. <a href="http://www.scottnichol.com/nusoapprog2.htm"><span style="color: #006629">Programming with NuSOAP Part 2</span></a>. 29 May 2003</li>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<li>Scott Nichol. <a href="http://www.scottnichol.com/nusoapintro.htm"><span style="color: #006629">Introduction to NuSOAP</span></a>. 03 Nov 2004</li>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<li>Scott Nichol. <a href="http://www.scottnichol.com/nusoapprogwsdl.htm"><span style="color: #006629">Programming with NuSOAP Using WSDL</span></a>. 11 Nov 2003</li>&nbsp;&nbsp;&nbsp;&nbsp;<br /></ul><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;----转自 <a href="http://www.cnblogs.com/lwlzyjl/archive/2007/11/08/953258.html" target="_blank">http://www.cnblogs.com/lwlzyjl/archive/2007/11/08/953258.html</a></p><br/>Tags - <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=php" rel="tag">php</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=nusoap" rel="tag">nusoap</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=wsdl" rel="tag">wsdl</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=webservice" rel="tag">webservice</a>
]]>
</description>
</item><item>
<link>http://vir.jxstnu.edu.cn/xieyunc/read.php?212</link>
<title><![CDATA[PHP调用Webservice实例]]></title> 
<author>xieyunc &lt;xieyunc@jxstnu.cn&gt;</author>
<category><![CDATA[PHP&amp;MySQL]]></category>
<pubDate>Mon, 26 May 2008 06:17:14 +0000</pubDate> 
<guid>http://vir.jxstnu.edu.cn/xieyunc/read.php?212</guid> 
<description>
<![CDATA[ 
	 　　NuSoap是PHP环境下的WebService编程工具，用于创建或调用WebService。它是一个开源软件，是完全采用PHP语言编写的、通过HTTP收发SOAP消息的一系列PHP类，由NuSphere Corporation(<a href="http://dietrich.ganx4.com/nusoap/" target="_blank">http://dietrich.ganx4.com/nusoap/</a> )开发。NuSOAP的一个优势是不需要扩展库的支持，这种特性使得NuSoap可以用于所有的PHP环境，不受服务器安全设置的影响。　　<br/><br/>方法一：直接调用<br/><textarea name="code" class="php" rows="15" cols="100"><?
/******************************************************************************/
/*&nbsp;&nbsp;文件名 : soapclient.php
/*&nbsp;&nbsp;说&nbsp;&nbsp;明 : WebService接口客户端例程
/******************************************************************************/
include('NuSoap.php');

// 创建一个soapclient对象，参数是server的WSDL 
$client = new soapclient('http://localhost/Webservices/Service.asmx?WSDL', 'wsdl');

// 参数转为数组形式传递
$aryPara = array('strUsername'=>'username', 'strPassword'=>MD5('password'));

// 调用远程函数
$aryResult = $client->call('login',$aryPara);

//echo $client->debug_str;
/*
if (!$err=$client->getError()) &#123;
&nbsp;&nbsp;print_r($aryResult); 
&#125; else &#123; 
&nbsp;&nbsp;print "ERROR: $err"; 
&#125;
*/

$document=$client->document;
echo <<<SoapDocument
<?xml version="1.0" encoding="GB2312"?>
 <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:si="http://soapinterop.org/xsd">
&nbsp;&nbsp; <SOAP-ENV:Body>
&nbsp;&nbsp; $document
&nbsp;&nbsp; </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>
SoapDocument;

?></textarea><br/>方法二：代理方式调用 <br/><textarea name="code" class="php" rows="15" cols="100"><?
/******************************************************************************/
/*&nbsp;&nbsp;文件名 : soapclient.php
/*&nbsp;&nbsp;说&nbsp;&nbsp;明 : WebService接口客户端例程
/******************************************************************************/
require('NuSoap.php'); 

//创建一个soapclient对象，参数是server的WSDL 
$client=new soapclient('http://localhost/Webservices/Service.asmx?WSDL', 'wsdl'); 

//生成proxy类 
$proxy=$client->getProxy(); 

//调用远程函数 
$aryResult=$proxy->login('username',MD5('password'));

//echo $client->debug_str;
/*
if (!$err=$proxy->getError()) &#123;
&nbsp;&nbsp;print_r($aryResult); 
&#125; else &#123; 
&nbsp;&nbsp;print "ERROR: $err"; 
&#125;
*/

$document=$proxy->document;
echo <<<SoapDocument
<?xml version="1.0" encoding="GB2312"?>
 <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:si="http://soapinterop.org/xsd">
&nbsp;&nbsp; <SOAP-ENV:Body>
&nbsp;&nbsp; $document
&nbsp;&nbsp; </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>
SoapDocument;

?></textarea><br/>　　许多使用NuSoap 调用.NET WebService或J2EE&nbsp;&nbsp;WebService的朋友可能都遇到过中文乱码问题，下面介绍这一问题的出现的原因和相应的解决方法。 <br/>　　NuSoap调用WebService出现乱码的原因：<br/>　　通常我们进行WebService开发时都是用的UTF-8编码，这时我们需要设置：<br/><textarea name="code" class="php" rows="15" cols="100">$client->soap_defencoding = 'utf-8';</textarea><br/><br/>　　同时，需要让xml以同样的编码方式传递：<br/><textarea name="code" class="php" rows="15" cols="100">$client->xml_encoding = 'utf-8';</textarea><br/> 　　至此应该是一切正常了才对，但是我们在输出结果的时候，却发现返回的是乱码。<br/>　　NuSoap调用WebService出现乱码的解决方法：<br/>　　实际上，开启了调试功能的朋友，相信会发现$client->response返回的是正确的结果，为什么$result = $client->call($action, array('parameters' => $param)); 却是乱码呢？<br/>　　研究过NuSoap代码后我们会发现，当xml_encoding设置为UTF-8时，NuSoap会检测decode_utf8的设置，如果为true，会执行 PHP 里面的utf8_decode函数，而NuSoap默认为true，因此，我们需要设置：<br/><textarea name="code" class="php" rows="15" cols="100">$client->soap_defencoding = 'utf-8';
$client->decode_utf8 = false;
$client->xml_encoding = 'utf-8';</textarea><br/>Tags - <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=php" rel="tag">php</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=%25E8%25B0%2583%25E7%2594%25A8" rel="tag">调用</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=webservice" rel="tag">webservice</a>
]]>
</description>
</item><item>
<link>http://vir.jxstnu.edu.cn/xieyunc/read.php?155</link>
<title><![CDATA[用Zend Encoder加密PHP文件和PHP 优化配置]]></title> 
<author>xieyunc &lt;xieyunc@jxstnu.cn&gt;</author>
<category><![CDATA[PHP&amp;MySQL]]></category>
<pubDate>Fri, 30 Nov 2007 14:17:25 +0000</pubDate> 
<guid>http://vir.jxstnu.edu.cn/xieyunc/read.php?155</guid> 
<description>
<![CDATA[ 
	在发布一个你写好的PHP程序时，你是不是担心自已辛苦写出来的成果会被别人占为已有呢？其实我们可以用Zend Encoder为我们的PHP文件加上一层保护壳。<br/>软件版本：2.0.1<br/>软件大小：10.2M<br/>适用平台：Win9X/2000/XP<br/>官方网址：<a href="http://www.zend.com/store/products/zend-encoder.php" target="_blank">http://www.zend.com/store/products/zend-encoder.php</a><br/>软件的使用方法非常简单，首先选择“File”－“New Project”新建一个项目，然后在该项目下添加你要加密的文件或文件夹。在右边的“Target Directory”选项里输入保存加密PHP文件的路径。然后点“Encode”按钮就可以对当前项目中的PHP文件进行加密了。你还可以将当前项目保存起来，以便你的PHP文件更新后重新加密。PHP文件加密后，文件大小也变得小多了，以前一个30K的文件加密后只有14K。<br/>技巧：在“Tools”－“Settings”对话框的“Extensions to Encoder”文本框中你可以对要加密的文件扩展名进行指定（多个扩展名用空格分隔），使Zend Encoder只对这些文件进行加密。<br/>加密后的PHP文件需要服务器上有Zend Optimizer才能正常显示，而一般在“Zend Encoder”压缩包的“optimizer_packages”目录中都能够找到该文件，如果没有的话可以到<a href="http://www.zend.com" target="_blank">www.zend.com</a>免费下载。安装完成后重新启动WEB服务器就可以正常浏览加密的PHP文件了。而一般的PHP空间都是应该支持Zend Optimizer的。<br/><br/>PHP 优化配置之一 <br/>让论坛速度更快 PHP加速设置 PHP加速：Zend Optimizer优化PHP程序 <br/><br/>Zend Optimizer V2.5.7 For Windows <br/>软件语言：英文 <br/>运行环境：Win9x/NT/2000/XP <br/><br/>Zend Optimizer V2.5.7 For Windows软件介绍： <br/><br/>Zend Optimizer用优化代码的方法来提高PHP 4.0应用程序的执行速度。实现的原理是对那些在被最终执行之前由运行编译器(Run-Time Compiler)产生的代码进行优化。一般情况下，执行使用Zend Optimizer的PHP程序比不使用的要快40%到100%。这意味着网站的访问者可以更快的浏览网页，从而完成更多的事务，创造更好的客户满意度。更快的反应同时也意味着可以节省硬件投资，并增强网站所提供的服务。所以，使用Zend Optimizer，就等于提高了电子商务的盈利能力。Zend Optimizer能给PHP用户带来很多益处，特别是那些运营网站的人。快速运行PHP程序可以显著降低服务器的CPU负载，并可以减少一半的反应时间，也就是从访问者点击链接到服务器开始读取页面之间的时间。 <br/><br/>安装Zend Optimizer优化PHP程序 <br/><br/>Zend Optimizer是由PHP核心引擎“Zend” <a href="http://www.zend.com" target="_blank">http://www.zend.com</a> 创建者Zend技术公司所开的免费PHP优化软件。据Zend公司透露使用这个软件某些情况下至少可以提高性能30%以上！现在我们来看看如何配置这套软件。 <br/><br/>Zend Optimizer的安装很简单 <br/><br/>1、运行安装文件，首先提示你选择安装目录，选择一个你喜欢的目录，单击“Next”。 <br/>2、安装向导会要求你选择当前使用的WEB服务器（Apache、IIS或其它），选择好服务器后单击“Next” <br/>3、安装向导提示您确认php.ini的位置（默认是C:&#92;WINDOWS&#92;）单击“Next”，提示“备份php.ini到C:&#92;WINDOWS&#92;php.ini-Optimizer-bak,当卸载该软件时可以恢复到原始的php.ini）单击“Next”。 <br/>4、安装向导提示“为了继续安装程序需要重新启动IIS服务）单击“是”，安装程序开始重新启动IIS服务，然后安装程序会提示“IIS服务顺利重新启动了”单击“确定”，再单击“finish”完成安装。 <br/>5、安装完毕后程序会自动根据你的选择来修改php.ini帮助你启动这个引擎。下面我们来介绍Zend Optimizer的配置选项，帮助你最大化自定义合理的配置。 <br/><br/>[Zend] <br/>zend_optimizer.optimization_level=15&nbsp;&nbsp;//我的配置文件中zend_optimizer.optimization_level = 1023 <br/>zend_extension_ts="C:&#92;Inetpub&#92;Zend&#92;lib&#92;ZendExtensionManager.dll"&nbsp;&nbsp;&nbsp;&nbsp;//这个与你的安装路径有关 <br/>zend_extension_manager.optimizer_ts="C:&#92;Inetpub&#92;Zend&#92;lib&#92;Optimizer-2.5.5" <br/><br/>现在我们来介绍上边这些配置文件中相关内容的含义： <br/>zend_optimizer.optimization_level 《== 优化程度，这里定义启动多少个优化过程。 <br/>zend_optimizer.encoder_loader 《== 是否允许处理由Zend Encoder加密的PHP文件，默认允许。 <br/>zend_extension_ts 《== 优化器所在目录。 <br/>zend_extension_manager.optimizer_ts 《== 优化器管理所在目录。 <br/><br/>优化过程 zend_optimizer.optimization_level 详细解释 <br/><br/>这里最为重点的部分，仔细看！Zend Opt总共有10个优化过程，从理论上说开的越多性能越好。当然，理论和实际永远都存在着差距。优化过程开启的越多对性能消耗也相对也越大，Zend Opt的10个优化过程并不相同也就是说效果不是平均的。Zend公司定义的最高值(High模式)为15，这里15指的是开启1-4号优化过程。当然，很多朋友并不满足于此，毕竟最高也只开启4个优化过程连总数的一半都没有。各个优化过程的对应的数字代码（值）如下： <br/><br/>不使用 0 <= 如果这样不如不装，还能节约点内存说！ <br/>优化过程1(PASS1) 1 <br/>优化过程2(PASS2) 2 <br/>优化过程3(PASS3) 4 <br/>优化过程4(PASS4) 8 <br/>优化过程5(PASS5) 16 <br/>优化过程6(PASS6) 32 <br/>优化过程7(PASS7) 64 <br/>优化过程8(PASS8) 128 <br/>优化过程9(PASS9) 256 <br/>优化过程10(PASS10) 512 <br/><br/>以何种方式开启优化过程是通过这些数字代码（值）相加所得的和作为此参数的参数值来控制的。如我的配置文件中 zend_optimizer.optimization_level = 1023，这里的1023是优化过程1到优化过程10全部数字代码（值）相加得到的和，表示开启全部10个优化过程。刚才所提到的Zend公司定义的High模式值为15，15表示同时开启优化过程1-4。 <br/><br/>加密代码支持 zend_optimizer.encoder_loader 详细解释 <br/><br/>对于这个参数，我想如果没有看过Zend Opt FAQ文档的朋友大多数并不知道。这个参数用来告诉Zend Opt是否去支持被Zend Encoder加密过的代码。默认情况下Zend Opt将支持加密过的代码。如果不使用被加密过的代码我推荐你关闭此选项。这个功能牵扯到解包反码的过程，会导致系统负荷的加重。我的朋友已经开发完毕相应的反编译工具，预计春节之后推出。 <br/><br/>这个参数的值只有两个 0 关闭， 1 开启。默认为1，推荐设置为0。 <br/><br/>模块定位 zend_extension_ts 、zend_extension_manager.optimizer_ts无需解释，这些参数就是Zend Optimizer相关模块在硬盘上的安装路径。 <br/><br/>6、如何获知Zend Optimizer是否在运行？ <br/>答案很简单，只要用PHP的函数phpinfo()来检测便知，如下所示： <br/><? <br/>phpinfo(); <br/>?> <br/><br/>显示的结果中关于Zend Optimizer的部分就象下面这样：(PHP版本不同，信息可能不同，我的是PHP4.3.11) <br/><br/><br/>CODE:[Copy to clipboard]This program makes use of the Zend Scripting Language Engine: <br/>Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies with Zend Extension Manager v1.0.6, Copyright (c) 2003-2004, by Zend Technologies with Zend Optimizer v2.5.7, Copyright (c) 1998-2004, by Zend Technologies&nbsp;&nbsp; <br/>表示 Zend Optimizer for PHP优化成功了。<br/> <br/>PHP 优化配置之二 <br/>用eAccelerator(前身Truck MMCache)加速 <br/>What is eAccelerator? <br/>---------------------- <br/>eAccelerator is a free open source PHP accelerator, optimizer, encoder and <br/>dynamic content cache for PHP. It increases performance of PHP scripts by <br/>caching them in compiled state, so that the overhead of compiling is almost <br/>completely eliminated. Also it uses some optimizations to speed up execution <br/>of PHP scripts. eAccelerator typically reduces server load and increases the <br/>speed of your PHP code by 1-10 times. <br/><br/>eAccelerator is a fork of TurckMMCache <br/>eAccelerator(前身Truck MMCache) <br/><br/>相信很多朋友都知道MMCache,不过很久前开发者就被Zend招安了,因此MMCache一直没有官方的新版本...要支持最新的 PHP4.4.0或者PHP5.04都需要自己编译源码,对于普通用户来说无异于天方夜谭...别灰心,我们还有eAccelerator! <br/><br/>1.首先,我们下载编译好了的Module <br/><a href="http://www.arnot.info/eaccelerator/" target="_blank">http://www.arnot.info/eaccelerator/</a> <br/>选择下载对应您的系统和PHP版本的eAccelerator <br/><br/>2.将其重命名为 eaccelerator.dll (win版) 或者 eaccelerator.so (linux版) 然后移至您的 php 的 extentions文件夹,其路径定义在您系统所用的的 php.ini 中 <br/><br/>3.根据您系统的情况,一般有两种安装方式,一种按照Zend的扩展,一种是PHP扩展 <br/><br/>推荐按照Zend的扩展,打开php.ini文件, 找到extension=php_zip.dll, 在下面添加 <br/>win版 <br/><br/><br/>CODE:[Copy to clipboard]zend_extension_ts="c:&#92;php&#92;extensions&#92;eaccelerator.dll"&nbsp;&nbsp;&nbsp;&nbsp; //路径根据您系统的情况而定,文件扩展名也是 <br/>eaccelerator.shm_size="16"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //根据你的系统内存来，默认16M，可以改成64M <br/>eaccelerator.cache_dir="C:&#92;php&#92;tmp"&nbsp;&nbsp;&nbsp;&nbsp; //需要手动创建,WIN下例如C:&#92;php&#92;tmp,确保他的权限为可读写,并且以后不要动这个目录哦 <br/>eaccelerator.enable="1" <br/>eaccelerator.optimizer="1" <br/>eaccelerator.check_mtime="1" <br/>eaccelerator.debug="0" <br/>eaccelerator.filter="" <br/>eaccelerator.shm_max="0" <br/>eaccelerator.shm_ttl="0" <br/>eaccelerator.shm_prune_period="0" <br/>eaccelerator.shm_only="0" <br/>eaccelerator.compress="1" <br/>eaccelerator.compress_level="9" <br/>linux版 <br/><br/><br/>CODE:[Copy to clipboard]zend_extension="/usr/lib/php4/eaccelerator.so"&nbsp;&nbsp;&nbsp;&nbsp; //路径根据您系统的情况而定,文件扩展名也是 <br/>eaccelerator.shm_size="16"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //根据你的系统内存来，默认16M，可以改成64M <br/>eaccelerator.cache_dir="/tmp/eaccelerator"&nbsp;&nbsp;&nbsp;&nbsp; //需要手动创建,确保他的权限为可读写,并且以后不要动这个目录哦 <br/>eaccelerator.enable="1" <br/>eaccelerator.optimizer="1" <br/>eaccelerator.check_mtime="1" <br/>eaccelerator.debug="0" <br/>eaccelerator.filter="" <br/>eaccelerator.shm_max="0" <br/>eaccelerator.shm_ttl="0" <br/>eaccelerator.shm_prune_period="0" <br/>eaccelerator.shm_only="0" <br/>eaccelerator.compress="1" <br/>eaccelerator.compress_level="9" <br/>如果打开了安全模式,必须使用, "zend_extension_ts" 取代 "zend_extension". <br/><br/>附：linux下创建缓存目录 <br/><br/><br/>CODE:[Copy to clipboard]mkdir /tmp/eaccelerator <br/>chmod 0777 /tmp/eaccelerator <br/>PHP扩展安装模式,打开php.ini文件, 找到extension=php_zip.dll, 在下面添加 <br/><br/><br/>CODE:[Copy to clipboard]extension="eaccelerator.so"&nbsp;&nbsp;&nbsp;&nbsp; //路径根据您系统的情况而定,文件扩展名也是,Win系统下是dll(例如c:&#92;php&#92;extensions&#92;eaccelerator.dll) <br/>eaccelerator.shm_size="16" <br/>eaccelerator.cache_dir="/tmp/eaccelerator"&nbsp;&nbsp;&nbsp;&nbsp; //需要手动创建,WIN下例如C:&#92;php&#92;tmp,确保他的权限为可读写,并且以后不要动这个目录哦 <br/>eaccelerator.enable="1" <br/>eaccelerator.optimizer="1" <br/>eaccelerator.check_mtime="1" <br/>eaccelerator.debug="0" <br/>eaccelerator.filter="" <br/>eaccelerator.shm_max="0" <br/>eaccelerator.shm_ttl="0" <br/>eaccelerator.shm_prune_period="0" <br/>eaccelerator.shm_only="0" <br/>eaccelerator.compress="1" <br/>eaccelerator.compress_level="9" <br/>eAccelerator可以和Zend兼容,但是上面的代码在 php.ini 必须定义与 Zend 的相关代码之前,虽然官方强烈建议,除非您必须使用Zend过的代码,否则最好不同时使用Zend和eAccelerator，但是两个一起用也不冲突，还能加速，为什么不用呢，呵呵 <br/><br/>完成上面的工作以后保存您的 php.ini , 然后重新启动 apache或者IIS, 看看 phpinfo 是不是不一样了?然后看看 phpwind 页脚的执行时间是不是快了许多? <br/>正确安装后，可以在phpinfo上的Zend部分看到类似如下的信息：(PHP版本不同，信息可能不同，我的是PHP4.3.11，一般出现with eAccelerator就是成功了) <br/><br/><br/>CODE:[Copy to clipboard]This program makes use of the Zend Scripting Language Engine: <br/>Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies with eAccelerator v0.9.3, Copyright (c) 2004-2005 eAccelerator, by eAccelerator with Zend Extension Manager v1.0.6, Copyright (c) 2003-2004, by Zend Technologies with Zend Optimizer v2.5.7, Copyright (c) 1998-2004, by Zend Technologies <br/>很简单的。操作前只要做好php.ini的备份即可，失败了大不了将备份的恢复过去。重起 apache或者IIS服务就行，呵呵，风险不是很大。 <br/><br/><br/>再看论坛经过加载eAccelerator以后运行,页脚执行时间由 0.02X 秒缩短至 0.01X秒...快了一倍多^_^ <br/>特别说明 ： <br/><br/>1、如果您的系统已经装了ZEND加速器，那么上述配置在PHP.INI中必须放在ZEND的前面，否则Apache不能启动； <br/>2、eAccelerator.shm_size="64"，这里的64是加速系统使用做CACHE的内存，默认是16M；根据您系统内存调整； <br/>3、eAccelerator.cache_dir="C:&#92;php&#92;tmp"，这个是加速器工作时候产生临时文件的目录，请在对应目录建立文件夹以存放缓存文件并且给予读写权限，如果安装时候默认目录空间小了建议调整 <br/><br/>效果：现在系统同时有ZEND与eAccelerator加速器，PHP执行速度比原来是要快一些；ZEND优化已经开到最大；在PHP系统上感觉最明显的就是BBS，以及软件下载后台程序输出HTML静态页面速度非常快，而仅有ZEND的时候有些停顿。 <br/>Tags - <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=zend" rel="tag">zend</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=optimizer" rel="tag">optimizer</a>
]]>
</description>
</item><item>
<link>http://vir.jxstnu.edu.cn/xieyunc/read.php?121</link>
<title><![CDATA[PHP5新增的部分常用函数列表]]></title> 
<author>xieyunc &lt;xieyunc@jxstnu.cn&gt;</author>
<category><![CDATA[PHP&amp;MySQL]]></category>
<pubDate>Tue, 29 May 2007 02:30:17 +0000</pubDate> 
<guid>http://vir.jxstnu.edu.cn/xieyunc/read.php?121</guid> 
<description>
<![CDATA[ 
	PHP5新增一些函数，简单说明如下。<br/><br/><strong>1. 数组</strong><br/><br/>· array_combine() 使用一个包含关键字的数组和一个包含关键字值的数组来创建一个新数组。<br/><br/>· array_diff_uassoc() jie 借助于索引检测（由用户提供的回调函数来实现）来计算数组的偏差。<br/><br/>· array_udiff() 通过数据比较的的回调函数来技术数组的偏差。<br/><br/>· array_udiff_assoc() 借助于其他索引检测来计算数组的偏差。使用回调函数进行数据比较。<br/><br/>· array_udiff_uassoc() 借助于其他索引检测来计算数组的偏差。使用回调函数进行数据比较。索引检测也是使用回调函数实现的。<br/><br/>· array_walk_recursive() 对数组中每个元素递归的应用用户数。<br/><br/><strong>2. InterBase</strong><br/><br/>· ibase_affected_rows() 返回以前查询影响的数据行的数目。<br/><br/>· ibase_backup() 在服务管理器中启动一个备份任务，并立即返回。<br/><br/>· ibase_commit_ret() 提交一个事务，但不关闭之。<br/><br/>· ibase_db_info() 请求数据库的统计数据。<br/><br/>· ibase_drop_db() 删除数据库。<br/><br/>· ibase_errcode() 返回错误代码。<br/><br/>· ibase_free_event_handler() 取消已经注册的事件处理程序。<br/><br/>· ibase_gen_id() 递增命名产生器，并返回最新值。<br/><br/>· ibase_maintain_db() 在数据库服务器上执行维护命令。<br/><br/>· ibase_name_result() 给结果集分配一个名称。<br/><br/>· ibase_num_params() 返回已经准备查询中参数的数量。<br/><br/>· ibase_param_info() 返回已经准备查询中参数的信息。<br/><br/>· ibase_restore() 在服务器中启动一个恢复命令，并立即返回。<br/><br/>· ibase_rollback_ret() 回滚事务，并返回其事务上下文。<br/><br/>· ibase_server_info() 请求有关数据库的统计数据。<br/><br/>· ibase_service_attach() 连接到服务管理器。<br/><br/>· ibase_service_detach() 与服务管理起断开连接。<br/><br/>· ibase_set_event_handler() 注册发出事件时需要调用的回调函数。<br/><br/>· ibase_wait_evnt() 等待数据库发出事件。<br/><br/><strong>3. Iconv</strong><br/><br/>· iconv_mime_decode() 对某个MIME头字段进行解码。<br/><br/>· iconv_mime_decode_headers() 立即对多个MIME头字段进行解码骗码。<br/><br/>· iconv_mime_encode() 对某个MIME头字段进行编码。<br/><br/>· iconv_strlen() 返回字符串的字符数量。<br/><br/>· iconv_strpos() 确定在字符串中某子串第一次出现的位置。<br/><br/>· iconv_strrpos() 确定在指定字符串范围内某子串最后一次出现的位置。<br/><br/>· iconv_substr() 返回字符串中指定范围的子串。<br/><br/><strong>4. Streams</strong><br/><br/>· stream_copy_to_stream() 在流之间复制数据。<br/><br/>· stream_get_line() 从某流获取到指定定位符的信息。<br/><br/>· stream_socket_accept() 接受stream_sockt_server()建立的套接字符连接。<br/><br/>· stream_socket_client() 打开Internet 或者 UNIX 域套接字连接。<br/><br/>· stream_socket_get_name() 检索本地或者远程套接字的名称。<br/><br/>· stream_socket_recvfrom() 从某套接子（不管是否已经建立连接）获取数据。<br/><br/>· stream_socket_sendto() 向某套接字（不管是否已经建立连接）发送消息。<br/><br/>· stream_socket_server() 创建一个Internet或者UNIX域服务器套接字。<br/><br/><strong>5. 其他</strong><br/><br/>· convert_uudecode() 对未编码的字符串进行解码。<br/><br/>· convert_uuencode() 不对字符串进行编码。<br/><br/>· curl_copy_handle() 复制某cURL处理器及其所有选项。<br/><br/>· dba_key_split() 把字符串表达式中的关键字拆分到数组表达式中。<br/><br/>· dbase_get_header_info() 获取dBase数据库的头信息。<br/><br/>· dbx_fetch_row() 从已经设置DBX_RESULT_UNBUFFERED 标识位的查询结果集中检索数据行。<br/><br/>· fbsql_set_password() 更改用户的密码。<br/><br/>· file_put_contents() 把字符串写到文件中。<br/><br/>· ftp_alloc() 给即将上载的文件分配空间。<br/><br/>· get_declared_interfaces() 返回所有已声明接口的数组。<br/><br/>· get_headers() 检索服务器发送的所有信息，以响应HTTP请求。<br/><br/>· headers_list() 返回已发送或者即将发送的响应的列表。<br/><br/>· http_build_query() 产生 URL 编码的查询字符串。<br/><br/>· idate(): 把本地时间/日期格式化位整数。<br/><br/>· image_type_to_extension() 获取 getimagesize(),exif_red_data(),exif_thumbnail(),exif_imagetype() 等函数返回的图象类文件的文件扩展名。<br/><br/>· imagefilter() 使用定制角度来过滤图象。<br/><br/>· imap_getacl() 获取指定邮箱的 ACL。<br/><br/>· ldap_sasl_bind() 使用 SASL 绑定到 LDAP 目录。<br/><br/>· mb_list_encodings() 返回所有支持的编码的数组。<br/><br/>· pcntl_getpriority() 获取任何进程的优先级。<br/><br/>· pcntl_wait() 返回或者等待 waitpid() 系统调用的子进程的状态。<br/><br/>· pg_version() 返回包含客户端、协议和服务器版本的数组。<br/><br/>· php_check_syntax() 检查指定文件的语法。<br/><br/>· php_strip_whitespace() 返回包含空格和注释的源代码。<br/><br/>· proc_nice() 更改当前进程的优先级。<br/><br/>· pspell_config_data_dir() 更改语言数据文件的位置。<br/><br/>· pspell_config_dict_dir() 更改主单词列表的位置。<br/><br/>· setrawcookie() 用非 URL 编码方式发送Cookie。<br/><br/>· snmp_read_mib() 读取 MIB 文件，并解析到活动的 MIB 树中。<br/><br/>· sqlite_fetch_column_types() 返回特定表的列类数组。<br/><br/>· str_split() 把字符串转换成数组。<br/><br/>· strpbrk() 在字符赚中搜索特定字符集中的任意一个字符。<br/><br/>· substr_compare() 比较字符串，大小写不敏感。<br/><br/>· time_nanosleep() 延迟等待一段时间。<br/><br/>Tags - <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=php5" rel="tag">php5</a>
]]>
</description>
</item><item>
<link>http://vir.jxstnu.edu.cn/xieyunc/read.php?17</link>
<title><![CDATA[PHP 5.0 的变化与PHP 6.0 展望]]></title> 
<author>xieyunc &lt;xieyunc@jxstnu.cn&gt;</author>
<category><![CDATA[PHP&amp;MySQL]]></category>
<pubDate>Mon, 30 Apr 2007 06:50:36 +0000</pubDate> 
<guid>http://vir.jxstnu.edu.cn/xieyunc/read.php?17</guid> 
<description>
<![CDATA[ 
	　　 目前，大多数PHP安装还是使用PHP 4.x版本。实际上，PHP 5.0已经出台一段时间了，而如今PHP 5.1.1也刚刚发行。如果你还没有升级到这些新版本，那么让我们一同看一下在新版的PHP中的变化，并在最后讨论对于PHP 6所期望的特性。<br/><br/>　　一、PHP 5.0中的变化<br/><br/>　　作为一个全新的版本号，在PHP 4和PHP 5之间存在许多实质性的区别。大多数的炒作主要围绕被重新改写过的新的对象模型。PHP 5版本更为完整并且运行性能更为良好。在PHP 4中，对象其实仅是一个粗糙的数据类型，并且是值引用的。在试图保持尽可能多的向后兼容性的同时，在PHP 5中，设置zend.ze1_compatibility_mode可以允许与版本4中方法的兼容。当然，PHP 5也存在一些向后不兼容的改变，具体包括：<br/><br/>　　·新的保留下来的关键字大多数与对象模型相关(exception，final， php_user_filter,interface,implements,extends,public,private,protected,abstract,clone,try,catch,throw)。在PHP 4中保留的两个单词不再存在(cfunction，old_function)。<br/><br/>　　·如果一个对象没有任何属性，那么它不再为空（empty）。<br/><br/>　　·现在array_merge()函数只接收数组。<br/><br/>　　·类可以在使用前声明（依赖于具体情况）。<br/><br/>　　·get_class()，get_parent_class()和get_class_methods()现在能够返回一个大小写敏感的结果，而以前的返回结果都是小写的。<br/><br/>　　·strrpos()和strripos()现在使用整个字符串。例如，var_dump(strrpos('ABCDEF'，'DAF'))将在PHP 4中返回int(3)，而在PHP 5中返回bool(false)<br/><br/>　　·如果$_SERVER存在，它将用argc和argv进行填充-这就允许CLI版本总是可以存取这些数据。<br/><br/>　　·当传递一个无效的IP地址时，ip2long()返回FALSE而不是-1。<br/><br/>　　·定义在一个包括文件中的函数现在能够在任何时刻为主文件所调用。如果文件两次被包括(这时函数已经被定义了)，PHP 5也将发出一个致命的错误。<br/><br/>　　·require_once()和include_once函数现在考虑到了Windows大小的不敏感性，并且将每次仅包括一个文件-即使该函数以不同大小写的文件名被调用多次。<br/><br/>　　·摆脱了原来PHP 4中的警告。新的PHP 5在遇到一个无效的字符串偏移量时将抛出一个错误。<br/>　　 <br/>　　·Tokenizer扩展不再定义闲置的T_ML_COMMENT常量。<br/><br/>　　注意，这些看似较多的不兼容的变化其实并不大，而且如果你想把原有代码移植到PHP 5中的话，有可能只对你的脚本作极少量的修改即可。PHP 5为做许多事情提供了更好的方法，但是如果你的目的仅是为了能使程序运行，那么你不会遇到太多的麻烦。在PHP 5中的另外一些变化有：<br/><br/>　　·在命令行CLI和CGI脚本作了少许变化，有效地提高了新的CLI地位的重要性。<br/><br/>　　·引入大量的新函数，其中许多是用于处理数组、字符转换和流操作的。<br/><br/>　　·缺省情况下，MySQL客户端库没有与PHP 5绑定到一起。而是，包括了SQLite扩展-它基本上是一微型数据库引擎，其目的是消除任何设置和管理的需要。<br/><br/>　　·新加了mysqli（MySQL增强扩展）（缺省地没有包括在内），为的是充分地利用MySQL 4.1及以上版本的优势。<br/><br/>　　想更全面地了解从PHP 4到PHP 5的变化，你可以参考PHP网站上的官方档案。<br/><br/>　　二、PHP 5.1.x中的变化<br/><br/>　　在本文成文时，刚刚发行PHP 5.1.1（在广为争论的5.1.0出台后不久）。该版本在PHP邮件列表中引起一阵小的骚乱。在5.1.0版本中，某些关键的变化被匆忙地包括进一个随后发行的候选版本中。一切似乎都静悄悄的，直到最后的发行版才引起酣然大波。然而，这些变化在5.1.1中被还原以防止出现pear::date冲突。<br/><br/>　　·如今，闪电般登场的PDO成为PHP核心的一部分。要更多地了解与PHP相关的抽象层知识，可以参考《Database Abstraction in PHP》或者PHP网站上的官方档案。<br/><br/>　　·PDO MySQL驱动程序现在成为存取MySQL的推荐方法-在缺省情况下，并不启用老式的mysqli和mysql扩展。<br/><br/>　　·PHP 5.1比5.0版本在性能上也大大改进。<br/><br/>　　·如前所提及的，日期/时间支持在5.1.0版本中被重写，而在5.1.1版中又被还原。也许以后不久还会有所变化-尽管都是经过仔细计划的。<br/><br/>　　·在PHP 5.0到PHP 5.0.4版本阶段，是支持抽象的私有方法的。然而，现在它们都被取消了。<br/><br/>　　·现在，不允许重复声明一个类常量。下面代码在5.1中不会工作并将抛出一个E_ERROR错误。<br/><br/>＜?php<br/>　class anything &#123;<br/>　　const const_name = 'value';<br/>　　const const_name = 'value2';<br/>　&#125;<br/>?＞ <br/><br/>　　·14个更旧的扩展被从PHP核心删除。这些包括 ext/cpdf,ext/dbx,ext/dio,ext/fam,ext/ingres_ii,ext/ircg,ext/mcve,ext/mnogosearch,ext/oracle,ext/ovrimos,ext/pfpro,ext/w32api,ext/yp,sapi/activescript。所有这些还可用于PECL中，尽管并不是所有这些扩展都能得到积极维护。<br/><br/>　　·在参考引用的管理上也有所变化。以前我们可以以参考引用方式发送、赋值或返回变量-其实它们应该以值的形式返回。这些包括常数、自身以值形式返回的函数或一个表达式的结果。这里有一个例子：<br/><br/>＜?php<br/>$var1 = "value";<br/>function return_val() &#123;<br/>　global $var_name;<br/>　return $var_name;<br/>&#125;<br/>$var2 = &amp;return_val();<br/>?＞ <br/><br/><br/>　　这段代码过去是可以工作的（直到5.0.4版本），但是现在在5.1版本中会抛出一个E_STRICT异常。<br/><br/>　　也许5.1.x不久也会退场，但是其中引入了许多有价值的改进-PDO的引入可能是最值得称道的。要详细了解PHP文档中的更改日志，可以看一下这里有关PHP 5.1(和早些版本)变化的详尽列表。<br/><br/>三、PHP 6.0中要作的改变<br/><br/>　　PHP 6.0估计会是一个相当激动人心的发行。然而，什么东西都是一分为二的。不过，看起来最令我气恼的三个家伙（register_globals，magic_quotes_gpc和safe_mode）可能要退位了。第一个存在一个很大的安全漏洞；第二个由于操作大量数据所以在改变环境时简直就是一场梦魇；而第三个是一个无人能理解的错误的名称并且会给人带来一种安全方面的错觉。在Unicode问题上，还有大量的工作要做。下面是预计的一些新变化： <br/><br/>　　·register_globals，safe_mode和各种魔术引用选项将被删除。<br/>　 <br/>　　·ereg扩展将被删除，而XMLReader，XMLWriter和Fileinfo扩展将被添加到内核上并且在缺省情况下为on状态。<br/>　 <br/>　　·我发现的另外一处令人激动的新变化是，APC(Alternative PHP Cache)将被添加到内核上，尽管在缺省情况下为off状态。APC可以为开发者提供严谨的性能益处。<br/><br/>　　·所有的E_STRICT消息将被合并进E_ALL-这又是针对良好编程实践所作出的一个积极更改。<br/><br/>　　·不再支持ASP风格的标签＜%。<br/><br/>　　·引入了新的64位整型数。当前的整数类型被保留下来-至于是32还是64位将依赖平台而定。<br/><br/>　　·可以结合多维数组使用foreach，例如foreach($array as $k =＞ list($a， $b))。<br/><br/>　　·在php.ini新引入的一个开关将允许你禁止Unicode语义(缺省地，它们被置为on状态)。<br/><br/>　　·还有各种针对Unicode的字符串操作上的改进。<br/>　 <br/>　　·microtime()函数将返回完整的浮点数，而不是象目前的微秒值unix_timestamp。这样更可能有利于大多数人的使用。<br/><br/>　　·不再支持用于字符串索引的&#123;&#125;注释，而[]版本将被添加到substr()和array_slice()功能中。以前的[]为许多人所批评，但是大多数的开发者，包括我在内，都一直使用[]。<br/><br/>　　·在针对CGI SAPI情形时，将一直启用FastCGI，并且不会被禁止。<br/><br/>　　·不再支持古老的HTTP_*_VARS全局变量。<br/><br/>　　·var将有一个新的别名public。在PHP4 类中Var是被允许的，但是在PHP 5中，这将会引发一个警告。在PHP 6中，var将仅是public的一个别名，因此将不会再出现警告。<br/><br/>　　·ze1兼容性模式将被删除-这一方式原来试图保留PHP 4的行为但是却存在一些错误。<br/><br/>　　·不再允许用静态语法来调用动态函数。<br/><br/>　　另外，还存在许多要决定的问题，例如命名空间可能更为重要，但是目前基本上还没有得到同意。你可以读一下最近的PHP开发者会议上对于PHP 6的详细讨论。尽管PHP 6尚未出台，但是我相信在其最终发行之前一定存在不少周折。尽管如此，PHP所做出的贡献已得到业界的充分认可，其前途是一片光明的。<br/><br/><br/>Tags - <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=php" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://vir.jxstnu.edu.cn/xieyunc/read.php?6</link>
<title><![CDATA[两个简单的画验证码图形程序]]></title> 
<author>xieyunc &lt;xieyunc@jxstnu.cn&gt;</author>
<category><![CDATA[PHP&amp;MySQL]]></category>
<pubDate>Sat, 28 Apr 2007 14:38:24 +0000</pubDate> 
<guid>http://vir.jxstnu.edu.cn/xieyunc/read.php?6</guid> 
<description>
<![CDATA[ 
	 &nbsp; &nbsp;其实，生成验证码比较简单，画图也不难，不过大家都不喜欢读手册，也不喜欢自己动手，一般是网上抄一段代码了事，我一直如此，偶尔画图，其实发现画图挺有趣。 <br/> &nbsp; &nbsp;不过拿普通字体生成的验证码，是没有太大的“战斗力”的，很轻易的就会验证码识别程序识别内容，然后轻易被灌水，要生成好的验证码图片不是简单的事情，有些大公司专门一个部门去做这么一件事情，不过我这里只是了解演示，一般用途应该就够用了吧，呵呵。<br/><br/> &nbsp; &nbsp;下面两个函数，一个能够画出中文内容，另外一个能够画出英文内容，按照需要使用。<br/><textarea name="code" class="php" rows="15" cols="100">
/**
 * 生成中文字符，
 *
 * 必须有GD库、iconv或者mbstring库、相应的字体文件
 */
function makeChineseCharPic($str = '中文字符')&#123;
 &nbsp; &nbsp;//转码
 &nbsp; &nbsp;if (function_exists('iconv'))&#123;
 &nbsp; &nbsp; &nbsp; &nbsp;$str = iconv('gbk', 'utf-8', $str);
 &nbsp; &nbsp;&#125;elseif (function_exists('mb_convert_encoding'))&#123;
 &nbsp; &nbsp; &nbsp; &nbsp;$str = mb_convert_encoding($str, 'utf-8', 'gbk');
 &nbsp; &nbsp;&#125;else&#123;
 &nbsp; &nbsp; &nbsp; &nbsp;exit("Not iconv charset");
 &nbsp; &nbsp;&#125;

 &nbsp; &nbsp;//产生图片
 &nbsp; &nbsp;$im = imageCreate(80, 30);
 &nbsp; &nbsp;//背景色
 &nbsp; &nbsp;$bkg = imageColorAllocate($im, 0, 255, 255);
 &nbsp; &nbsp;//字体色
 &nbsp; &nbsp;$clr = imageColorAllocate($im, 0, 128, 255);
 &nbsp; &nbsp;//字体文件路径
 &nbsp; &nbsp;$font = "c:/windows/fonts/simhei.ttf";
 &nbsp; &nbsp;//使用字体来画TTF内容
 &nbsp; &nbsp;imageTTFText($im, 13, 0, 5, 20, $clr, $font, $str);
 &nbsp; &nbsp;//--------------------------------------------------
 &nbsp; &nbsp;// 黑体:simhei.ttf, 宋体:simsun.ttc, 隶书:simli.ttf, 楷体:simkai.ttf, 幼圆:simyou.ttf
 &nbsp; &nbsp;// 华文行楷:stxingka.ttf, 华文新魏:stxinwei.ttf, 华文彩云:stcaiyun.ttf, 华文仿宋:stfangso.ttf
 &nbsp; &nbsp;// 方正姚体:fzytk, 方正舒体:fzstk.ttf
 &nbsp; &nbsp;//-------------------------------------------------- &nbsp; &nbsp;

 &nbsp; &nbsp;//输出后清除资源
 &nbsp; &nbsp;header("Content-type: image/png");
 &nbsp; &nbsp;imagePng($im);
 &nbsp; &nbsp;imageDestroy($im);
&#125;

/**
 * 画英文字符 (必须有GB库)
 */
function makeEnglishCharPic($str = 'ABCD12')&#123;

 &nbsp; &nbsp;//生成图片
 &nbsp; &nbsp;$im = imageCreateTrueColor(65, 20);
 &nbsp; &nbsp;//背景色
 &nbsp; &nbsp;$bg = imageColorAlLocate($im, 0, 0, 0);
 &nbsp; &nbsp;//字体色
 &nbsp; &nbsp;$textColor = imageColorAlLocate($im, 0, 255, 255);
 &nbsp; &nbsp;//画图
 &nbsp; &nbsp;imageString($im, 5, 5, 2, $str, $textColor);

 &nbsp; &nbsp;//输出后清除资源
 &nbsp; &nbsp;header("Content-type: image/jpeg");
 &nbsp; &nbsp;imageJpeg($im);
 &nbsp; &nbsp;imageDestroy($im);
&#125;
</textarea><br/> &nbsp; &nbsp;当然，我们可以加入一些干扰因子，或者是对图片进行变形，让那些图片识别程序无法识<br/><br/>Tags - <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=%25E5%25B0%258F%25E5%25AE%2587%25E9%25A3%259E%25E5%2588%2580" rel="tag">小宇飞刀</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=php" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://vir.jxstnu.edu.cn/xieyunc/read.php?39</link>
<title><![CDATA[PHP程序员的优化调试技术和技巧]]></title> 
<author>xieyunc &lt;xieyunc@jxstnu.cn&gt;</author>
<category><![CDATA[PHP&amp;MySQL]]></category>
<pubDate>Mon, 02 Apr 2007 02:04:48 +0000</pubDate> 
<guid>http://vir.jxstnu.edu.cn/xieyunc/read.php?39</guid> 
<description>
<![CDATA[ 
	<p style="text-indent: 2em">使用调试器，可以设置断点并查看 PHP 代码到所设断点之前的浏览器输出。然后可以继续代码的执行并查看到下一断点之前的浏览器输出，然后再到下一个，直到 PHP 脚本完成。</p><p style="text-indent: 2em">　　现在把 &ldquo;设置&rdquo; 一节中在 php.ini 中注释掉的行取消注释，并重新启动 Apache。现在装入了调试器，Eclipse 能够和它挂上了。</p><p style="text-indent: 2em">　　现在在 Eclipse 中设计调试环境。请创建新的 test4.php 文件，先保持为空。现在单击 Run &gt; Debug。在左侧面板中选择 PHP DBG Script，并单击 New。现在转到 File 选项卡，输入当前项目 debugArticle 以及想要调试的文件 test4.php。现在转到 Environment 选项卡，然后再到 Interpreter 子选项卡。在 PHP 的安装目录中找到 php.exe 文件（我的是 c:&#92;apps&#92;php5.0.3&#92;php.exe）。现在单击 Remote Debug 子选项卡，选择 Remote Debug，如果没有使用 Windows，请取消 &ldquo;Open with DBGSession URL in internal browser box&rdquo; 复选框。把 Remote Source 路径设置成与要测试的 PHP 脚本的绝对路径（不是 Web 路径）相同（我的设置是 c:&#92;www&#92;debugArticle&#92;test4.php）。现在单击 Debug。</p><p style="text-indent: 2em">　　现在应当装入 Debug 透视图，如图 8 所示。否则，请单击 Window &gt; Open Perspective &gt; Other，并选择 Debug。</p><p style="text-indent: 2em">图 8. Eclipse 中的 Debug 透视图</p><p style="text-indent: 2em"><img src="http://dev.yesky.com/imagelist/06/01/she1r3j441k6.jpg" border="0" width="600" height="530" /></p><p style="text-indent: 2em">　　现在可以设置断点了。</p><p style="text-indent: 2em">　　对于本文中使用的插件和扩展的版本，断点功能是必需的，因为 PHP 在把输出发送到浏览器之前会缓冲它。除此之外，需要做的不仅仅是设置一个断点把当前显示数据刷新到 Web 浏览器，所以要像下面和图 8 所示那样定义 test4.php。</p><p style="text-indent: 2em">清单 4. 设置和创建断点</p><table border="1" width="100%" bgcolor="#e3e3e3" bordercolor="#cccccc"><tbody><tr><td><p></p><p style="text-indent: 2em">&lt;?php function break-point()&#123; ob_flush(); flush(); sleep(.1); debugBreak(); &#125; print(&quot;This will get shown first, &quot;); print(&quot;as will this&lt;br&gt;&quot;); breakpoint(); print(&quot;This won't get shown until after &quot;); print(&quot;continuing the break-point&lt;br&gt;&quot;); breakpoint(); print(&quot;END!&quot;); ? </p></td></tr></tbody></table><p style="text-indent: 2em">　　breakpoint() 函数会把缓冲的输出和其他缓冲的数据刷新到 Web 浏览器。对 sleep(.1) 的调用是必需的，这样代码中止于 debugBreak() 之前，服务器才有足够的时间把数据刷新到 Web 浏览器，这个函数是前面下载的 PHP 调试器扩展的内部函数。这样，调用 breakpoint() 会把 HTML 块、print() 和 echo() 语句的数据刷新到浏览器，然后中止代码执行。</p><p style="text-indent: 2em">　　在像清单 4 那样编写完代码之后，可以打开浏览器并指向 test4.php，或者可以查看 PHP 浏览器窗口（我的是 <a href="http://localhost/debugArticle/test4.php" target="_blank">http://localhost/debugArticle/test4.php</a>）。每次输入和保存文件时，在 PHP 浏览器窗口中就已经启动了调试序列。如果不使用 Windows，请通过浏览器查看 test4.php。在保存了文件之后，用 F8 或单击 Run &gt; Resume 继续代码执行。持续这么做，直到最后一行输出是 END! 为止（参见图 9、10 和 11）。</p><p style="text-indent: 2em">图 9. 初始的到第一个断点的 PHP 浏览器输出</p><p style="text-indent: 2em"><img src="http://dev.yesky.com/imagelist/06/01/4839k54jwmx5.jpg" border="0" width="572" height="538" /></p><p style="text-indent: 2em">　　请注意图 9 中的 Debug 窗口如何把执行显示为挂起的。</p><p style="text-indent: 2em">图 10. 第一个断点之后到第二个断点之前的 PHP 浏览器输出</p><p style="text-indent: 2em"><img src="http://dev.yesky.com/imagelist/06/01/wnesg13wc2w8.jpg" border="0" width="600" height="564" /></p><p style="text-indent: 2em">　　图 10 的 Debug 窗口仍然把执行显示为挂起，而第二组数据显示在 PHP 浏览器中。</p><p style="text-indent: 2em">图 11. 完整的 PHP 浏览器输出</p><p style="text-indent: 2em"><img src="http://dev.yesky.com/imagelist/06/01/t78v45yd65c8.jpg" border="0" width="572" height="538" /></p><p style="text-indent: 2em">　　注意，图 11 的 Debug 窗口中的代码不再挂起，整个脚本已经执行，如图 11 中的 PHP 浏览器所示。</p><p style="text-indent: 2em">　　既然已经看到了用 PHPEclipse 和调试器扩展进行开发的优势，那么很难想像没有它会怎么样。</p><p style="text-indent: 2em">　　结束语</p><p style="text-indent: 2em">　　现在已经向 PHP 的调试技术集中添加了错误报告的运用、print 语句、PHPEclipse 和调试器扩展，您可以通过减少每行代码的错误数量，成为更有效的 PHP 编码人员。请参阅 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-debug/#resources">参考资料</a> 获得一些 PHP 教程，可以在上面测试这些新技能。</p><br/>Tags - <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=php" rel="tag">php</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=%25E8%25B0%2583%25E8%25AF%2595" rel="tag">调试</a>
]]>
</description>
</item><item>
<link>http://vir.jxstnu.edu.cn/xieyunc/read.php?38</link>
<title><![CDATA[致初学者:PHP比ASP优秀的七个理由 ]]></title> 
<author>xieyunc &lt;xieyunc@jxstnu.cn&gt;</author>
<category><![CDATA[PHP&amp;MySQL]]></category>
<pubDate>Thu, 07 Dec 2006 02:01:53 +0000</pubDate> 
<guid>http://vir.jxstnu.edu.cn/xieyunc/read.php?38</guid> 
<description>
<![CDATA[ 
	　　ASP是微软公司实现动态网页的一种技术。ASP支持一些脚本语言，主要以VBScripp为主。与ASP相比较，你还可以选择另一中开放源代码编程语言——PHP，PHP可以运行在多种操作系统下，其中包括Linux和windows。<br/><br/>　　虽然ASP是一种不错的技术，但从长远考虑我相信PHP在将来的技术领域里会有不凡的表现。<br/><br/>　　我认为有七个理由可以说明PHP比ASP更优秀:<br/><br/>　　1、速度、速度、速度<br/><br/>　　当我第一次运行PHP脚本程序时，我不禁对自己说:“太快了”，当时我是在仪态166MHZ的机器上运行我的程序的，但运行的速度仍然很快。<br/><br/>　 　ASP是永远也不会象PHP这样快的，因为ASP是建立在COM体系结构之上的。当用vb script写ASP脚本时，实际上实在使用COM的对象，当 向用户浏览器发送信息时，它用的是Response对象的write方法，当它访问数据库和文件系统的时候，它用的是其他的COM对象。这些COM对象的 使用使运行速度下降。<br/><br/>　　在PHP代码中，所有的工作都运行在PHP的内存空间中，也就是说PHP不是基于COM对象的，所以的他的运行速度会快一些。<br/><br/>　　下面是我们在MSSQL7 40次运行一个查询语句的执行时间统计:<br/><br/>　　PHP Querying MSSQL7 时间(秒)<br/><br/>　　用　MSSQL extension 01.88<br/><br/>　　用　ODBC extension 09.54<br/><br/>　　用　ODBC via COM (ADO) 17.28<br/><br/>　　用　OLEDB via COM 06.19<br/><br/>　　当我们使用PHP.ODBC,访问数据库用了9.54秒，而用COM接口去连接数据库需要比PHP所用的时间高80%。<br/><br/>　　OLEDB是微软的一种高速访问数据库的技术，他比ODBC要快。但当我们所PHP和OLEDB的效率实验时，结果是PHP的整体性能比OLEDB高200%，如此的出一个结论，如果不采用COM可以获得较快的执行速度。<br/><br/>　　当然PHP的执行速度还不是最快的，但我们才刚刚开始起步，我们会逐步的完善他，而且PHP是一种开放源代码编程语言，世界上许多程序员在不断的完善他的技术，相信他一定会比非开放源代码系统获得更高的执行速度的。<br/><br/>　　2、高级内存管理<br/><br/>　 　在IIS4下，一个ASP脚本header.asp，如果被20个页面所包含，那么运行的时候，在内存当中会保留这20个header.asp的编译副 本，IIS5解决了这个问题，但只有windows2000才支持IIS5，由于这种IIS5的不能向下兼容的原因，许多服务器仍然要使用IIS4下的低 级的内存管理。<br/><br/>　　而在PHP中，不会存在这种问题，只有当require时，才会调用某个include文件。<br/><br/>　　3、没有后顾之忧<br/><br/>　　我非常憎恨的一件事情就是会买到一件不放心的产品，比如当你买了一辆汽车，但由于发动机是坏的，你需要更换他;当你买了一栋房子的时候，你要去修补漏雨的屋顶。<br/><br/>　　那么ASP旧乡这些产品一样，当你买了ASP之后，如果你需要加密技术，你就要买ASPEncrypt;当你需要Email管理时，你就要买ServerObjets Qmail;当你需要文件上传时，你还要买Artisans SA-FileUp.<br/><br/>　　4、MySQL使PHP更精彩<br/><br/>　　PHP与MySQL的组合既简单又精彩。PHP有许多管理和维护MySQL的工具，对MySQk的支持是最全面的。许多有用的函数如mysql_insert_id和mysql_affected_rows等，其他的数据库则没有。<br/><br/>　　ASP和PHP都是中型网站的较理想的解决方案，但PHP与MySQL的紧密结合使PHP更加优越。<br/><br/>　　MySQL的虚度比Microsoft Access速度快，Mssql和Oracle速度比MySQL要快，可是费用较高。<br/><br/>　　5、Java和C++的变成风格<br/><br/>　　这个优点只是一个看法。<br/><br/>　　我知道你不会相信一个Visual Basic程序员会因为PHP有Java和C++的编程风格而转向使用PHP，但你会相信有许多人还是喜欢Java和C++的，PHP是一种具有这两种语言的编程风格的较容易学习的语言。<br/><br/>　　PHP支持结构化编程，在VB因为他的继承性使用类还是较少的。而PHP的象Java和C++一样的继承性使一个大型的程序中到处都充满了类的影子。<br/><br/>　　6、Bug的处理<br/><br/>　　你是否曾经要求Microsoft修改ASP的一些Bug呢?如果你不是一个象Boeing一样的组织，你无法获得迅速而恰当的修改，把么当你遇到Bug而停止工作时，如果这个Bug不修改，你将无法继续你的工作的。<br/><br/>　　PHP，当你发现Bug时，你可以修改他，如果你没有专家的水平，你可以请专家修改，并且你的修改会得到开放代码组织的接受和认可。<br/><br/>　　7、移植性<br/><br/>　　Microsoft经常修改ASP，下一版本叫ASP+，现在已经开始测试。我相信他们会修改许多我曾经提到过的问题。但也无庸质疑的，Microsoft会将你限制在他们的产品范围之内的。<br/><br/>　　我曾经是一个苹果机的程序员，当windows95问世后，我开始转变，但许多原来的代码都无法在windows95下运行，这些代码现在被放在一边，我非常的遗憾。所以我不希望在windows下再出现这样的悲剧。<br/><br/>　　不要忘记Novell曾经也象Microsoft的网络操作系统一样热及一时，但现在已经没有许多人用了，那么Microsoft也会这样的。<br/><br/>　　我找到了PHP，我仍旧在windows下工作，但我知道PHP代码可以运行在Solaris、Linux和许多其他的操作系统中，我的心里感到安慰。<br/><br/> <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;----------转自<a href="http://www.linuxeden.com/doc/24887.html" target="_blank">http://www.linuxeden.com/doc/24887.html</a><br/><br/><br/><br/><br/><br/>Tags - <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=php" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://vir.jxstnu.edu.cn/xieyunc/read.php?124</link>
<title><![CDATA[Apache,php,mysql整合安装包 for Windows 2000/xp/2003]]></title> 
<author>xieyunc &lt;xieyunc@jxstnu.cn&gt;</author>
<category><![CDATA[PHP&amp;MySQL]]></category>
<pubDate>Tue, 03 Oct 2006 07:03:55 +0000</pubDate> 
<guid>http://vir.jxstnu.edu.cn/xieyunc/read.php?124</guid> 
<description>
<![CDATA[ 
	软件介绍: APMServ 5.2.0 是一款拥有图形界面的快速搭建Apache 2.2.3、PHP 5.2.0、MySQL 5.0.27＆4.0.26、SQLite、ZendOptimizer、OpenSSL、phpMyAdmin、SQLiteManager，以及 ASP、CGI、Perl网站服务器平台的绿色软件。无需安装，具有灵活的移动性，将其拷贝到其它目录、分区或别的电脑时，均只需点击 APMServ.exe中的启动按钮，即可自动进行相关设置，将Apache和MySQL安装为系统服务并启动。APMServ集合了Apache稳定安全的优点，并拥有跟IIS一样便捷的图形管理界面，同时支持MySQL 5.0 & 4.0两个版本，虚拟主机、虚拟目录、端口更改、SMTP、上传大小限制、自动全局变量、SSL证书制作、缓存性能优化等设置，只需鼠标一点即可完成。 <br/><br/>　　1、注意事项：APMServ程序所在路径不能含有汉字和空格。 <br/>　　2、MySQL默认用户名：root，密码为空 <br/>　　3、MySQL数据库文件存放目录：MySQL5.0data或MySQL4.0data <br/>　　4、网站根目录[HTML,PHP]wwwhtdocs [ASP]wwwasp [CGI,Perl]wwwcgi-bin <br/>　　5、访问本机请用<a href="http://127.0.0.1/" target="_blank">http://127.0.0.1/</a>或<a href="https://127.0.0.1/" target="_blank">https://127.0.0.1/</a> (如果开启SSL) <br/>　　6、非默认端口，网址为<a href="http://127.0.0.1:" target="_blank">http://127.0.0.1:</a>端口/或<a href="https://127.0.0.1:" target="_blank">https://127.0.0.1:</a>端口/ <br/>　　7、APMServ集成了以下软件： <br/><br/>　　Apache 2.2.3 [HTTP服务器] <br/>　　NetBox 2.8 Build 4128 [HTTP服务器＋ASP脚本解释引擎] <br/>　　PHP 5.2.0 [PHP脚本解释引擎] <br/>　　MiniPerl 5.8 [Perl脚本解释器] <br/>　　MySQL 5.0.27 [MySQL数据库服务器] <br/>　　MySQL 4.0.26 [MySQL数据库服务器] <br/>　　SQLite 3.3.8 [SQLite数据库服务器] <br/>　　phpMyAdmin 2.9.1.1 [MySQL数据库在线管理工具] <br/>　　SQLiteManager 1.2.0 [SQLite数据库在线管理工具] <br/>　　ZendOptimizer 3.2.0 [PHP脚本加速引擎] <br/>　　OpenSSL 0.9.8d [HTTPS(SSL)安全传输协议]<br/><br/>　　<a href="http://www.meiu.cn/download/download.php?id=40&down=1" target="_blank">整合安装包APMServ 5.2.0 下载</a><br/><br/><br/>Tags - <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=alpha" rel="tag">alpha</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=mysql" rel="tag">mysql</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=php" rel="tag">php</a> , <a href="http://vir.jxstnu.edu.cn/xieyunc/tag.php?tag=%25E6%2595%25B4%25E5%2590%2588%25E5%25AE%2589%25E8%25A3%2585%25E5%258C%2585" rel="tag">整合安装包</a>
]]>
</description>
</item>
</channel>
</rss>