<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>phpdo&#124;学习PHP的笔记</title>
	<atom:link href="http://www.phpdo.net/index.php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.phpdo.net</link>
	<description>心有多大，世界有多大</description>
	<lastBuildDate>Tue, 08 May 2012 05:20:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>JavaScript 调试工具</title>
		<link>http://www.phpdo.net/index.php/javascript_tool.html</link>
		<comments>http://www.phpdo.net/index.php/javascript_tool.html#comments</comments>
		<pubDate>Tue, 08 May 2012 05:20:22 +0000</pubDate>
		<dc:creator>老张</dc:creator>
				<category><![CDATA[老张的碎嘴]]></category>
		<category><![CDATA[JavaScript 调试工具]]></category>

		<guid isPermaLink="false">http://www.phpdo.net/?p=2177</guid>
		<description><![CDATA[JavaScript被称作以原型(prototype)为基础的语言。这种语言有很多特色，比如动态和弱类型，它还有一等函数（first class function）。另一个特点是它是一个多范型(multi-paradigm)语言，支持面向对象、声明式、函数式的编程风格。 JavaScript最初被用作客户端语言，浏览器实现它用来提供增强的用户接口。JavaScript在很多现代的网站和Web应用程序中都有应用。JavaScript的一个很棒的功能也很重要，就是我确实可以用它来提高或改善网站的用户体验。JavaScript也可以提供丰富的功能和交互的组件。 JavaScript在这技术高速发展的同时变得非常受欢迎。因为受欢迎JavaScript也改进了许多，修改JavaScript脚本有很多事要做。这次我们为开发者带来了几个非常有用的JavaScript调试工具。 1）Drosera 可以调试任何WebKit程序，不仅仅是Safari浏览器。 2)Dragonfly 源代码视图有语法高亮，可以设置断点。强大的搜索功能，支持正则表达式。 3）Getfirebug 可以在任何网页编辑、调试和实时监视CSS、HTML和JavaScript。 4)Debugbar 5)Venkman Venkman是Mozilla的JavaScript调试器名称。它旨在为以Mozilla为基础的浏览器（Firefox, Netscape 7.x/9.x and SeaMonkey）提供一个强大的JavaScript调试环境。]]></description>
			<content:encoded><![CDATA[<p>JavaScript被称作以原型(prototype)为基础的语言。这种语言有很多特色，比如动态和弱类型，它还有一等函数（first class function）。另一个特点是它是一个多范型(multi-paradigm)语言，支持面向对象、声明式、函数式的编程风格。</p>
<p>JavaScript最初被用作客户端语言，浏览器实现它用来提供增强的用户接口。JavaScript在很多现代的网站和Web应用程序中都有应用。JavaScript的一个很棒的功能也很重要，就是我确实可以用它来提高或改善网站的用户体验。JavaScript也可以提供丰富的功能和交互的组件。</p>
<p>JavaScript在这技术高速发展的同时变得非常受欢迎。因为受欢迎JavaScript也改进了许多，修改JavaScript脚本有很多事要做。这次我们为开发者带来了几个非常有用的JavaScript调试工具。</p>
<p>1）<a title="Drosera" href="http://www.webkit.org/blog/61/introducing-drosera/" target="_blank">Drosera</a></p>
<p>可以调试任何WebKit程序，不仅仅是Safari浏览器。</p>
<p>2)<a title="Dragonfly" href="http://www.opera.com/dragonfly/" target="_blank">Dragonfly</a></p>
<p>源代码视图有语法高亮，可以设置断点。强大的搜索功能，支持正则表达式。</p>
<p>3）<a title="Getfirebug" href="http://www.oschina.net/p/firebug" target="_blank">Getfirebug</a></p>
<p>可以在任何网页编辑、调试和实时监视CSS、HTML和JavaScript。</p>
<p>4)<a title="Debugbar" href="http://www.debugbar.com/" target="_blank">Debugbar</a></p>
<p>5)<a title="Venkman" href="https://developer.mozilla.org/en/Venkman" target="_blank">Venkman</a></p>
<p>Venkman是Mozilla的JavaScript调试器名称。它旨在为以Mozilla为基础的浏览器（Firefox, Netscape 7.x/9.x and SeaMonkey）提供一个强大的JavaScript调试环境。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpdo.net/index.php/javascript_tool.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>让PHP更快提供文件下载</title>
		<link>http://www.phpdo.net/index.php/php-use-module-mod_xsendfile.html</link>
		<comments>http://www.phpdo.net/index.php/php-use-module-mod_xsendfile.html#comments</comments>
		<pubDate>Mon, 07 May 2012 05:18:22 +0000</pubDate>
		<dc:creator>老张</dc:creator>
				<category><![CDATA[php-基础语法]]></category>
		<category><![CDATA[让PHP更快提供文件下载]]></category>

		<guid isPermaLink="false">http://www.phpdo.net/?p=2175</guid>
		<description><![CDATA[一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件. 但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作. 于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载. $file = "/tmp/dummy.tar.gz"; header("Content-type: application/octet-stream"); header('Content-Disposition: attachment; filename="' . basename($file) . '"'); header("Content-Length: ". filesize($file)); readfile($file); 但是这个有一个问题, 就是如果文件是中文名的话, 有的用户可能下载后的文件名是乱码. 于是, 我们做一下修改(参考: $file = "/tmp/中文名.tar.gz"; $filename = basename($file); header("Content-type: application/octet-stream"); //处理中文文件名 $ua = $_SERVER["HTTP_USER_AGENT"]; $encoded_filename = urlencode($filename); $encoded_filename = str_replace("+", "%20", $encoded_filename); if [...]]]></description>
			<content:encoded><![CDATA[<p>一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件.</p>
<p>但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作. 于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载.<br />
<code><br />
$file = "/tmp/dummy.tar.gz";<br />
header("Content-type: application/octet-stream");<br />
header('Content-Disposition: attachment; filename="' . basename($file) . '"');<br />
header("Content-Length: ". filesize($file));<br />
readfile($file);<br />
</code><br />
但是这个有一个问题, 就是如果文件是中文名的话, 有的用户可能下载后的文件名是乱码.</p>
<p>于是, 我们做一下修改(参考:<br />
<code><br />
$file = "/tmp/中文名.tar.gz";<br />
$filename = basename($file);<br />
header("Content-type: application/octet-stream");<br />
//处理中文文件名<br />
$ua = $_SERVER["HTTP_USER_AGENT"];<br />
$encoded_filename = urlencode($filename);<br />
$encoded_filename = str_replace("+", "%20", $encoded_filename);<br />
if (preg_match("/MSIE/", $ua)) {<br />
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');<br />
} else if (preg_match("/Firefox/", $ua)) {<br />
header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');<br />
} else {<br />
header('Content-Disposition: attachment; filename="' . $filename . '"');<br />
}<br />
header('Content-Disposition: attachment; filename="' . $filename . '"');<br />
header("Content-Length: ". filesize($file));<br />
readfile($file);<br />
</code><br />
输出的时候, 如果是Apache + PHP mod, 那么还需要发送到Apache的输出缓冲区. 最后才发送给用户. 而对于Nginx + fpm如果他们分开部署的话, 那还会带来额外的网络IO.</p>
<p>恩, 现在看起来好多了, 不过还有一个问题, 那就是readfile, 虽然PHP的readfile尝试实现的尽量高效, 不占用PHP本身的内存, 但是实际上它还是需要采用MMAP(如果支持), 或者是一个固定的buffer去循环读取文件, 直接输出.</p>
<p>那么, 能不能不经过PHP这层, 直接让Webserver直接把文件发送给用户呢?</p>
<p>今天, 我看到了一个有意思的文章: How I PHP: X-SendFile.</p>
<p>我们可以使用Apache的module mod_xsendfile, 让Apache直接发送这个文件给用户:<br />
<code><br />
$file = "/tmp/中文名.tar.gz";<br />
$filename = basename($file);<br />
header("Content-type: application/octet-stream");<br />
//处理中文文件名<br />
$ua = $_SERVER["HTTP_USER_AGENT"];<br />
$encoded_filename = urlencode($filename);<br />
$encoded_filename = str_replace("+", "%20", $encoded_filename);<br />
if (preg_match("/MSIE/", $ua)) {<br />
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');<br />
} else if (preg_match("/Firefox/", $ua)) {<br />
header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');<br />
} else {<br />
header('Content-Disposition: attachment; filename="' . $filename . '"');<br />
}<br />
header('Content-Disposition: attachment; filename="' . basename($file) . '"');<br />
//让Xsendfile发送文件<br />
header("X-Sendfile: $file");<br />
</code><br />
Lighttpd和Nginx也有类似的模块, 大家有兴趣的可以去找找看<br />
X-Sendfile头将被Apache处理, 并且把响应的文件直接发送给Client.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpdo.net/index.php/php-use-module-mod_xsendfile.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP soap拓展(转)</title>
		<link>http://www.phpdo.net/index.php/soap.html</link>
		<comments>http://www.phpdo.net/index.php/soap.html#comments</comments>
		<pubDate>Sun, 06 May 2012 05:23:47 +0000</pubDate>
		<dc:creator>老张</dc:creator>
				<category><![CDATA[php-基础语法]]></category>
		<category><![CDATA[老张的碎嘴]]></category>
		<category><![CDATA[PHP soap拓展]]></category>

		<guid isPermaLink="false">http://www.phpdo.net/?p=2170</guid>
		<description><![CDATA[SOAP 1. Simple Object Access Protocol 简单对象访问协议 主要包括下面四部分: a) SOAP 封装: 用于将传输数据中的内容, 发送端消息, 接收端信息和处理方式等信息封装起来以准备数据传输. b) SOAP 编码规则: 用于表示传输数据中各项的数据类型等信息 c) SOAP 远程过程调用协定: 用于进行远程过程调用及应答的协议 d) SOAP 绑定协议: 用于表示信息交换的底层协议 PHP5 中SOAP 应用及配置 ========================================================================= 1. PHP 5 中新增了内置的 SOAP 扩展，我们称之为 ext/soap 。它是作为 PHP 的一部分提供的，因此不需要下载、安装和管理单独的包。 2. ext/soap 可能已经编译但没有加载，因此需要更新 PHP 配置，以便加载 ext/soap 。编辑 php.ini 并找到 Dynamic Extensions 部分，在这里增加一行代码来自动加载该扩展。 在 Windows 上，这一代码行是：extension=php_soap.dll [...]]]></description>
			<content:encoded><![CDATA[<p><a title="soap" href="http://www.phpdo.net/index.php/soap.html" target="_blank"><strong>SOAP</strong></a></p>
<p>1. Simple Object Access Protocol 简单对象访问协议</p>
<p>主要包括下面四部分:</p>
<p>a) SOAP 封装: 用于将传输数据中的内容, 发送端消息, 接收端信息和处理方式等信息封装起来以准备数据传输.<br />
b) SOAP 编码规则: 用于表示传输数据中各项的数据类型等信息<br />
c) SOAP 远程过程调用协定: 用于进行远程过程调用及应答的协议<br />
d) SOAP 绑定协议: 用于表示信息交换的底层协议</p>
<p><strong><a title="PHP" href="http://www.phpdo.net" target="_blank">PHP</a></strong>5 中SOAP 应用及配置</p>
<p>=========================================================================</p>
<p>1. PHP 5 中新增了内置的 SOAP 扩展，我们称之为 ext/soap 。它是作为 PHP 的一部分提供的，因此不需要下载、安装和管理单独的包。<br />
2. ext/soap 可能已经编译但没有加载，因此需要更新 PHP 配置，以便加载 ext/soap 。编辑 php.ini 并找到 Dynamic Extensions 部分，在这里增加一行代码来自动加载该扩展。 在 Windows 上，这一代码行是：extension=php_soap.dll<br />
如果以前没有加载过任何可选的扩展，可能还要设置 extension_dir 指令，让它指向包含扩展库（其中包括 php_soap ）的目录:<br />
extension_dir=”C:/php/ext/” （在 Windows 上使用正斜杠）<br />
3. 完成配置后ext/soap 显示为:<br />
<code><br />
[soap]<br />
; Enables or disables WSDL caching feature.<br />
soap.wsdl_cache_enabled=1<br />
; Sets the directory name where SOAP extension will put cache files.<br />
soap.wsdl_cache_dir=”/tmp”<br />
; (time to live) Sets the number of second while cached file will be used<br />
; instead of original one.<br />
soap.wsdl_cache_ttl=86400<br />
</code><br />
这段配置控制了 SOAP 扩展的 WSDL 缓存特性。默认情况下，WSDL 描述文件在 24 小时（86400 秒）内都缓存在 /tmp 目录下。现在要设置 soap.wsdl_cache_enabled=0 ，否则，在开发代码时，您会遇到一些莫名其妙的行为。完成开发之后，要记得打开 WSDL 缓存 ，使代码运行得更快。<br />
========================================================================<br />
SOAP 扩展库( 主要包括三种对象)</p>
<p>1. SoapServer : 用于在创建PHP 服务端页面时定义可被调用的函数及返回响应数据.</p>
<p>格式为: $soap = new SoapServer($wsdl, $array);</p>
<p>说明:$wsdl 为SOAP 使用的WSDL 文件, 是描述WebService 的一种标准格式. 设为NULL 表示不使用WSDL 模式. 如果想用的话可以用ZED 生成.</p>
<p>$array 是SoapServer 的属性信息, 是一个数组.</p>
<p>注意 :$array 中包括一个uri, 和encoding, 如果是客户端程序中还要包含一个location.</p>
<p>其中’uri ‘ 选项是必须的 ，但其值可以随便填 ，可以为空(”), 但不可以为null .</p>
<p>‘encoding ‘ 对于中文的处理，是必须的，一般填’gb2312′ ( 否则会出错, 因为默认为’utf-8′ ).</p>
<p>该对象的addFunction 方法用来声明哪个函数可以被客户端调用,</p>
<p>语法格式为:$soap -&gt; addFunction($function_name);</p>
<p>该对象的handle 方法用来处理用户的输入并调用相应的函数, 最后返回给客户端处理后的结果,</p>
<p>语法格式为:$soap -&gt; handle([$soap_request]);</p>
<p>说明:$soap_request 是一个可选参数, 用来表示用户的请求信息, 如果不指定, 则表示服务器将接收用户的全部请求 .</p>
<p>2. SoapClient : 用于调用远程服务器上的SoapServer 页面, 并实现了对相应函数的调用.</p>
<p>语法格式为:$soap = new SoapClient($wsdl, $array);</p>
<p>注意 : 对于soap client,’location ‘ 和’uri’ 选项都是必须的 ; 其中’location ‘ 必须为soap server 的URL , 必须准确, 但uri 似乎可以随便填，不过最好与soap server 中的uri 一致. 而’encoding ‘ 对于中文用户是必须的<br />
创建该对象后, 调用服务器页面中的函数相当于调用SoapClient 的方法</p>
<p>语法格式为:$soap -&gt; user_function($params);</p>
<p>说明:user_function 是服务器端定义的可以被调用中的函数中的一个或几个函数.</p>
<p>3. SoapFault : 用于生成在SOAP 访问过程中可能出现的错误.</p>
<p>语法格式为:$fault = new SoapFault($faultcode, $faultstring);</p>
<p>说明:$faultcode 是用户自定义的错误代码, 如果没有定义的话应该是HTTP( 印象中),$faultstring 是用户自定义的错误信息.</p>
<p>该对象会在服务器端页面出现错误时自动生成, 或者通过用户自行创建SoatFault 对象来获得相应的错误信息.</p>
<p>在客户端捕获SoapFault 对象后, 可以通过下面的代码获得错误代码的错误信息<br />
<code><br />
$fault -&gt; faultcode; // 错误代码<br />
$fault -&gt; faultstring; // 错误信息<br />
</code><br />
下面的例子：</p>
<p>soapserver.php<br />
<code><br />
&lt;?php<br />
function reserve($arr){<br />
return http_build_query($arr);<br />
}<br />
$soap = new SoapServer(NULL,array('uri'=&gt;'http://www.xhbin.com'));<br />
//为对象添加一个用户自定义的函数<br />
$soap-&gt;addFunction('reserve');<br />
$soap-&gt;handle();<br />
?&gt;<br />
</code><br />
soapclient.php<br />
<code><br />
&lt;?php<br />
try{<br />
$client = new SoapClient(NULL,array('location'=&gt;'http://localhost/exercise/soap/soapserver.php','uri'=&gt;'http://www.xhbin.com'));<br />
$arr = array('id'=&gt;3,"tag"=&gt;"PHP MYSQL","search"=&gt;"soap");<br />
echo $string = $client-&gt;reserve($arr);<br />
}catch(SoapFault $fault){<br />
echo "FAULT!Code:".$fault-&gt;faultcode."String:".$fault-&gt;faultstring;<br />
}<br />
?&gt;<br />
</code><br />
输出的结果为：id=3&amp;tag=PHP+MYSQL&amp;search=soap.</p>
<p>成功。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpdo.net/index.php/soap.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP加密方法－Zend Encoder</title>
		<link>http://www.phpdo.net/index.php/php-zend-encoder.html</link>
		<comments>http://www.phpdo.net/index.php/php-zend-encoder.html#comments</comments>
		<pubDate>Sat, 05 May 2012 05:16:59 +0000</pubDate>
		<dc:creator>老张</dc:creator>
				<category><![CDATA[老张的碎嘴]]></category>
		<category><![CDATA[PHP加密方法－Zend Encoder]]></category>

		<guid isPermaLink="false">http://www.phpdo.net/?p=2165</guid>
		<description><![CDATA[在发布一个你写好的PHP程序时，你是不是担心自已辛苦写出来的成果会被别人占为已有呢？其实我们可以用Zend Encoder为我们的PHP文件加上一层保护壳。]]></description>
			<content:encoded><![CDATA[<p>在发布一个你写好的<strong><a title="PHP" href="http://www.phpdo.net" target="_blank">PHP</a></strong>程序时，你是不是担心自已辛苦写出来的成果会被别人占为已有呢？其实我们可以用<strong><a title="zend-encoder" href="http://www.phpdo.net/index.php/php-zend-encoder.html" target="_blank">Zend Encoder</a> </strong>为我们的PHP文件加上一层保护壳。</p>
<p>软件版本：2.0.1</p>
<p>软件大小：10.2M</p>
<p>适用平台：Win9X/2000/XP</p>
<p>官方网址：http://www.zend.com/store/products/zend-encoder.php</p>
<p>软件的使用方法非常简单，首先选择“File”－“New Project”新建一个项目，然后在该项目下添加你要加密的文件或文件夹。在右边的“Target Directory”选项里输入保存加密PHP文件的路径。然后点“Encode”按钮就可以对当前项目中的PHP文件进行加密了。你还可以将当前项目保存起来，以便你的<strong><a title="PHP" href="http://www.phpdo.net" target="_blank">PHP</a></strong>文件更新后重新加密。PHP文件加密后，文件大小也变得小多了，以前一个30K的文件加密后只有14K。<br />
技巧：在“Tools”－“Settings”对话框的“Extensions to Encoder”文本框中你可以对要加密的文件扩展名进行指定（多个扩展名用空格分隔），使Zend Encoder只对这些文件进行加密。</p>
<p>加密后的<strong><a title="PHP" href="http://www.phpdo.net" target="_blank">PHP</a></strong>文件需要服务器上有Zend Optimizer才能正常显示，而一般在“Zend Encoder”压缩包的“optimizer_packages”目录中都能够找到该文件，如果没有的话可以到www.zend.com免费下载。安装完成后重新启动WEB服务器就可以正常浏览加密的PHP文件了。而一般的PHP空间都是应该支持Zend Optimizer的。</p>
<p>PHP 优化配置之一</p>
<p>让论坛速度更快 PHP加速设置 PHP加速：Zend Optimizer优化PHP程序</p>
<p>Zend Optimizer V2.5.7 For Windows</p>
<p>软件语言：英文</p>
<p>运行环境：Win9x/NT/2000/XP</p>
<p>Zend Optimizer V2.5.7 For Windows软件介绍：</p>
<p>Zend Optimizer用优化代码的方法来提高PHP 4.0应用程序的执行速度。实现的原理是对那些在被最终执行之前由运行编译器(Run-Time Compiler)产生的代码进行优化。一般情况下，执行使用Zend Optimizer的PHP程序比不使用的要快40%到100%。这意味着网站的访问者可以更快的浏览网页，从而完成更多的事务，创造更好的客户满意度。更快的反应同时也意味着可以节省硬件投资，并增强网站所提供的服务。所以，使用Zend Optimizer，就等于提高了电子商务的盈利能力。Zend Optimizer能给PHP用户带来很多益处，特别是那些运营网站的人。快速运行PHP程序可以显著降低服务器的CPU负载，并可以减少一半的反应时间，也就是从访问者点击链接到服务器开始读取页面之间的时间。</p>
<p>安装Zend Optimizer优化PHP程序</p>
<p>Zend Optimizer是由PHP核心引擎“Zend” http://www.zend.com 创建者Zend技术公司所开的免费PHP优化软件。据Zend公司透露使用这个软件某些情况下至少可以提高性能30%以上！现在我们来看看如何配置这套软件。</p>
<p>Zend Optimizer的安装很简单<br />
1、运行安装文件，首先提示你选择安装目录，选择一个你喜欢的目录，单击“Next”。<br />
2、安装向导会要求你选择当前使用的WEB服务器（Apache、IIS或其它），选择好服务器后单击“Next”<br />
3、安装向导提示您确认php.ini的位置（默认是C:\WINDOWS\）单击“Next”，提示“备份php.ini到C:\WINDOWS\php.ini-Optimizer-bak,当卸载该软件时可以恢复到原始的php.ini）单击“Next”。<br />
4、安装向导提示“为了继续安装程序需要重新启动IIS服务）单击“是”，安装程序开始重新启动IIS服务，然后安装程序会提示“IIS服务顺利重新启动了”单击“确定”，再单击“finish”完成安装。<br />
5、安装完毕后程序会自动根据你的选择来修改php.ini帮助你启动这个引擎。下面我们来介绍Zend Optimizer的配置选项，帮助你最大化自定义合理的配置。<br />
<code><br />
[Zend]<br />
zend_optimizer.optimization_level=15 //我的配置文件中zend_optimizer.optimization_level = 1023<br />
zend_extension_ts="C:\Inetpub\Zend\lib\ZendExtensionManager.dll" //这个与你的安装路径有关<br />
zend_extension_manager.optimizer_ts="C:\Inetpub\Zend\lib\Optimizer-2.5.5"<br />
</code><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 />
优化过程 zend_optimizer.optimization_level 详细解释</p>
<p>这里最为重点的部分，仔细看！Zend Opt总共有10个优化过程，从理论上说开的越多性能越好。当然，理论和实际永远都存在着差距。优化过程开启的越多对性能消耗也相对也越大，Zend Opt的10个优化过程并不相同也就是说效果不是平均的。Zend公司定义的最高值(High模式)为15，这里15指的是开启1-4号优化过程。当然，很多朋友并不满足于此，毕竟最高也只开启4个优化过程连总数的一半都没有。各个优化过程的对应的数字代码（值）如下：</p>
<p>不使用 0 &lt;= 如果这样不如不装，还能节约点内存说！<br />
<code><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 />
</code><br />
以何种方式开启优化过程是通过这些数字代码（值）相加所得的和作为此参数的参数值来控制的。如我的配置文件中 zend_optimizer.optimization_level = 1023，这里的1023是优化过程1到优化过程10全部数字代码（值）相加得到的和，表示开启全部10个优化过程。刚才所提到的Zend公司定义的High模式值为15，15表示同时开启优化过程1-4。<br />
加密代码支持 zend_optimizer.encoder_loader 详细解释</p>
<p>对于这个参数，我想如果没有看过Zend Opt FAQ文档的朋友大多数并不知道。这个参数用来告诉Zend Opt是否去支持被Zend Encoder加密过的代码。默认情况下Zend Opt将支持加密过的代码。如果不使用被加密过的代码我推荐你关闭此选项。这个功能牵扯到解包反码的过程，会导致系统负荷的加重。我的朋友已经开发完毕相应的反编译工具，预计春节之后推出。</p>
<p>这个参数的值只有两个 0 关闭， 1 开启。默认为1，推荐设置为0。</p>
<p>模块定位 zend_extension_ts 、zend_extension_manager.optimizer_ts无需解释，这些参数就是Zend Optimizer相关模块在硬盘上的安装路径。</p>
<p>6、如何获知Zend Optimizer是否在运行？</p>
<p>答案很简单，只要用PHP的函数phpinfo()来检测便知，如下所示：<br />
<code><br />
&lt;?<br />
phpinfo();<br />
?&gt;<br />
</code><br />
显示的结果中关于Zend Optimizer的部分就象下面这样：(PHP版本不同，信息可能不同，我的是PHP4.3.11)<br />
<code><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<br />
</code><br />
表示 Zend Optimizer for PHP优化成功了。</p>
<p>PHP 优化配置之二</p>
<p>用eAccelerator(前身Truck MMCache)加速<br />
<code><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 />
eAccelerator is a fork of TurckMMCache<br />
eAccelerator(前身Truck MMCache)<br />
</code><br />
相信很多朋友都知道MMCache,不过很久前开发者就被Zend招安了,因此MMCache一直没有官方的新版本&#8230;要支持最新的 PHP4.4.0或者PHP5.04都需要自己编译源码,对于普通用户来说无异于天方夜谭&#8230;别灰心,我们还有eAccelerator!</p>
<p>1.首先,我们下载编译好了的Module</p>
<p>http://www.arnot.info/eaccelerator/</p>
<p>选择下载对应您的系统和PHP版本的eAccelerator</p>
<p>2.将其重命名为 eaccelerator.dll (win版) 或者 eaccelerator.so (linux版) 然后移至您的 php 的 extentions文件夹,其路径定义在您系统所用的的 php.ini 中</p>
<p>3.根据您系统的情况,一般有两种安装方式,一种按照Zend的扩展,一种是PHP扩展</p>
<p>推荐按照Zend的扩展,打开php.ini文件, 找到extension=php_zip.dll, 在下面添加</p>
<p>win版<br />
<code><br />
CODE:[Copy to clipboard]zend_extension_ts="c:\php\extensions\eaccelerator.dll" //路径根据您系统的情况而定,文件扩展名也是<br />
eaccelerator.shm_size="16" //根据你的系统内存来，默认16M，可以改成64M<br />
eaccelerator.cache_dir="C:\php\tmp" //需要手动创建,WIN下例如C:\php\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 />
</code><br />
linux版<br />
<code><br />
CODE:[Copy to clipboard]zend_extension="/usr/lib/php4/eaccelerator.so" //路径根据您系统的情况而定,文件扩展名也是<br />
eaccelerator.shm_size="16" //根据你的系统内存来，默认16M，可以改成64M<br />
eaccelerator.cache_dir="/tmp/eaccelerator" //需要手动创建,确保他的权限为可读写,并且以后不要动这个目录哦<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 />
</code><br />
如果打开了安全模式,必须使用, “zend_extension_ts” 取代 “zend_extension”.</p>
<p>附：linux下创建缓存目录<br />
<code><br />
CODE:[Copy to clipboard]mkdir /tmp/eaccelerator<br />
chmod 0777 /tmp/eaccelerator<br />
</code><br />
<strong><a title="PHP" href="http://www.phpdo.net" target="_blank">PHP</a></strong>扩展安装模式,打开php.ini文件, 找到extension=php_zip.dll, 在下面添加<br />
<code><br />
CODE:[Copy to clipboard]extension="eaccelerator.so" //路径根据您系统的情况而定,文件扩展名也是,Win系统下是dll(例如c:\php\extensions\eaccelerator.dll)<br />
eaccelerator.shm_size="16"<br />
eaccelerator.cache_dir="/tmp/eaccelerator" //需要手动创建,WIN下例如C:\php\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 />
</code><br />
完成上面的工作以后保存您的 php.ini , 然后重新启动 apache或者IIS, 看看 phpinfo 是不是不一样了?然后看看 phpwind 页脚的执行时间是不是快了许多?</p>
<p>正确安装后，可以在phpinfo上的Zend部分看到类似如下的信息：(PHP版本不同，信息可能不同，我的是PHP4.3.11，一般出现with eAccelerator就是成功了)<br />
<code><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 />
</code><br />
很简单的。操作前只要做好php.ini的备份即可，失败了大不了将备份的恢复过去。重起 apache或者IIS服务就行，呵呵，风险不是很大。</p>
<p>再看论坛经过加载eAccelerator以后运行,页脚执行时间由 0.02X 秒缩短至 0.01X秒&#8230;快了一倍多^_^</p>
<p>特别说明 ：</p>
<p>1、如果您的系统已经装了ZEND加速器，那么上述配置在PHP.INI中必须放在ZEND的前面，否则Apache不能启动；</p>
<p>2、eAccelerator.shm_size=”64&#8243;，这里的64是加速系统使用做CACHE的内存，默认是16M；根据您系统内存调整；</p>
<p>3、eAccelerator.cache_dir=”C:\php\tmp”，这个是加速器工作时候产生临时文件的目录，请在对应目录建立文件夹以存放缓存文件并且给予读写权限，如果安装时候默认目录空间小了建议调整</p>
<p>效果：现在系统同时有ZEND与eAccelerator加速器，PHP执行速度比原来是要快一些；ZEND优化已经开到最大；在PHP系统上感觉最明显的就是BBS，以及软件下载后台程序输出HTML静态页面速度非常快，而仅有ZEND的时候有些停顿。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpdo.net/index.php/php-zend-encoder.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>google QR API</title>
		<link>http://www.phpdo.net/index.php/google-qr-api.html</link>
		<comments>http://www.phpdo.net/index.php/google-qr-api.html#comments</comments>
		<pubDate>Sat, 28 Apr 2012 04:58:24 +0000</pubDate>
		<dc:creator>老张</dc:creator>
				<category><![CDATA[老张的碎嘴]]></category>
		<category><![CDATA[google QR API]]></category>

		<guid isPermaLink="false">http://www.phpdo.net/?p=2162</guid>
		<description><![CDATA[google QR API,如： https://chart.googleapis.com/chart?cht=qr&#038;chs=200&#215;200&#038;choe=UTF-8&#038;chld=L&#124;4&#038;chl=http://www.cnblogs.com/hooray 然后将它放到img标签里，就能自动生成QR码图片了 下面就具体说下链接里的参数吧 https://chart.googleapis.com/chart?　这是Google Chart API的头部，直接照抄就行 &#38;cht=qr　这是说图表类型为qr也就是二维码 &#38;chs=200&#215;200　这是说生成图片尺寸为200*200，是宽*高，这并不是生成图片的真实尺寸，应该是最大尺寸吧 &#38;choe=UTF-8　这是说内容的编码格式为UTF-8，此值默认为UTF-8（其他的编码格式请参考Google API文档） &#38;chld=L&#124;4　L代表默认纠错水平，4代表二维码边界空白大小，可自行调节（具体参数请参考Google API文档） &#38;chl=XXXX　这是QR内容，也就是解码后看到的信息，包含中文时请使用UTF-8编码汉字，否则将出现问题 参数就是这么多了，利用google的QR API就可以制作类似博客签名的东东（参考文章结束部分） 优点：不占用服务器资源，速度稳定，生成图片 缺点：不能设置QR码颜色 &#160;]]></description>
			<content:encoded><![CDATA[<p><strong><a title="google QR API" href="http://www.phpdo.net/index.php/google-qr-api.html" target="_blank">google QR API</a></strong>,如：</p>
<p>https://chart.googleapis.com/chart?cht=qr&#038;chs=200&#215;200&#038;choe=UTF-8&#038;chld=L|4&#038;chl=http://www.cnblogs.com/hooray</p>
<p>然后将它放到img标签里，就能自动生成QR码图片了</p>
<div id="attachment_2163" class="wp-caption aligncenter" style="width: 210px"><a href="http://www.phpdo.net/wp-content/uploads/2012/04/14.png"><img class="size-full wp-image-2163" title="1" src="http://www.phpdo.net/wp-content/uploads/2012/04/14.png" alt="google QR API" width="200" height="200" /></a><p class="wp-caption-text">google QR API</p></div>
<p>下面就具体说下链接里的参数吧</p>
<p>https://chart.googleapis.com/chart?　这是Google Chart API的头部，直接照抄就行</p>
<p>&amp;cht=qr　这是说图表类型为qr也就是二维码</p>
<p>&amp;chs=200&#215;200　这是说生成图片尺寸为200*200，是宽*高，这并不是生成图片的真实尺寸，应该是最大尺寸吧</p>
<p>&amp;choe=UTF-8　这是说内容的编码格式为UTF-8，此值默认为UTF-8（其他的编码格式请参考Google API文档）</p>
<p>&amp;chld=L|4　L代表默认纠错水平，4代表二维码边界空白大小，可自行调节（具体参数请参考Google API文档）</p>
<p>&amp;chl=XXXX　这是QR内容，也就是解码后看到的信息，包含中文时请使用UTF-8编码汉字，否则将出现问题</p>
<p>参数就是这么多了，利用google的QR API就可以制作类似博客签名的东东（参考文章结束部分）</p>
<p>优点：不占用服务器资源，速度稳定，生成图片</p>
<p>缺点：不能设置QR码颜色</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpdo.net/index.php/google-qr-api.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>apache中伪静态配置和使用(转)</title>
		<link>http://www.phpdo.net/index.php/apache.html</link>
		<comments>http://www.phpdo.net/index.php/apache.html#comments</comments>
		<pubDate>Fri, 27 Apr 2012 05:07:55 +0000</pubDate>
		<dc:creator>老张</dc:creator>
				<category><![CDATA[老张的碎嘴]]></category>
		<category><![CDATA[apache中伪静态配置和使用]]></category>

		<guid isPermaLink="false">http://www.phpdo.net/?p=2159</guid>
		<description><![CDATA[一 打开 Apache 的配置文件 httpd.conf 。 二 将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉 三 在 httpd.conf中添加： &#60;IfModule mod_rewrite.c&#62; RewriteEngine On #RewriteCond %{ENV:SCRIPT_URL} (?:index&#124;dispbbs)[-0-9]+\.html RewriteRule ^(.*?(?:index&#124;dispbbs))-([-0-9]+)\.html$ $1.php?__is_apache_rewrite=1&#38;__rewrite_arg=$2 &#60;/IfModule&#62; 四 要实现asp帖子URL到php帖子的映射，在 第三步的&#60;IfModule mod_rewrite.c&#62;和&#60;/IfModule&#62;之间添加： RewriteMap tolowercase int:tolower RewriteCond %{QUERY_STRING} (?:boardid&#124;page&#124;id&#124;replyid&#124;star&#124;skin)\=\d+ [NC] RewriteRule ^(.*(?:index&#124;dispbbs))\.asp$ $1.php?${tolowercase:%{QUERY_STRING}}&#38;__is_apache_rewrite=1 五 保存httpd.conf并重启Apache。 六、mod_rewrite 简介 Rewirte主要的功能就是实现URL的跳转和隐藏真实地址，基于Perl语言的正则表达式规范。平时帮助我们实现伪静态，拟目录，域名跳转，防止盗链等等 七、mod_rewrite 规则的使用 RewriteEngine on RewriteCond %{HTTP_HOST} !^www.phpdo.net [NC] RewriteRule ^/(.*) http://www.phpdo.net/ [L] [...]]]></description>
			<content:encoded><![CDATA[<p>一 打开 Apache 的配置文件 httpd.conf 。<br />
二 将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉<br />
三 在 httpd.conf中添加：<br />
<code><br />
&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine On<br />
#RewriteCond %{ENV:SCRIPT_URL} (?:index|dispbbs)[-0-9]+\.html<br />
RewriteRule ^(.*?(?:index|dispbbs))-([-0-9]+)\.html$ $1.php?__is_apache_rewrite=1&amp;__rewrite_arg=$2<br />
&lt;/IfModule&gt;<br />
</code><br />
四 要实现asp帖子URL到php帖子的映射，在 第三步的&lt;IfModule mod_rewrite.c&gt;和&lt;/IfModule&gt;之间添加：<br />
<code><br />
RewriteMap tolowercase int:tolower<br />
RewriteCond %{QUERY_STRING} (?:boardid|page|id|replyid|star|skin)\=\d+ [NC]<br />
RewriteRule ^(.*(?:index|dispbbs))\.asp$ $1.php?${tolowercase:%{QUERY_STRING}}&amp;__is_apache_rewrite=1<br />
</code><br />
五 保存httpd.conf并重启Apache。<br />
六、mod_rewrite 简介<br />
Rewirte主要的功能就是实现URL的跳转和隐藏真实地址，基于Perl语言的正则表达式规范。平时帮助我们实现伪静态，拟目录，域名跳转，防止盗链等等</p>
<p>七、mod_rewrite 规则的使用<br />
<code><br />
RewriteEngine on<br />
RewriteCond %{HTTP_HOST} !^www.phpdo.net [NC]<br />
RewriteRule ^/(.*) http://www.phpdo.net/ [L]<br />
--------<br />
RewriteEngine on<br />
RewriteRule ^/test([0-9]*).html$ /test.php?id=$1<br />
RewriteRule ^/new([0-9]*)/$ /new.php?id=$1 [R]<br />
</code><br />
八、mod_rewrite 规则修正符</p>
<p>1) R 强制外部重定向<br />
2) F 禁用URL,返回403HTTP状态码。<br />
3) G 强制URL为GONE，返回410HTTP状态码。<br />
4) P 强制使用代理转发。<br />
5) L 表明当前规则是最后一条规则，停止分析以后规则的重写。<br />
6) N 重新从第一条规则开始运行重写过程。<br />
7) C 与下一条规则关联8) T=MIME-type(force MIME type) 强制MIME类型<br />
9) NS 只用于不是内部子请求<br />
10) NC 不区分大小写<br />
11) QSA 追加请求字符串<br />
12) NE 不在输出转义特殊字符 \%3d$1 等价于 =$1</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpdo.net/index.php/apache.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>session和cache的区别</title>
		<link>http://www.phpdo.net/index.php/session-and-cache.html</link>
		<comments>http://www.phpdo.net/index.php/session-and-cache.html#comments</comments>
		<pubDate>Thu, 26 Apr 2012 05:21:10 +0000</pubDate>
		<dc:creator>老张</dc:creator>
				<category><![CDATA[php实例]]></category>
		<category><![CDATA[session和cache的区别]]></category>

		<guid isPermaLink="false">http://www.phpdo.net/?p=2154</guid>
		<description><![CDATA[以前实现数据的缓存有很多种方法，有客户端的Cookie，有服务器端的Session和Application]]></description>
			<content:encoded><![CDATA[<p>以前实现数据的缓存有很多种方法，有客户端的Cookie，有服务器端的<strong><a title="Session和Application" href="http://www.phpdo.net/index.php/session-and-cache.html">Session和Application</a></strong>。</p>
<p>其中Cookie是保存在客户端的一组数据，主要用来保存用户名等个人信息。</p>
<p>Session则保存对话信息。Application则是保存在整个应用程序范围内的信息，相当于全局变量。</p>
<p>Session</p>
<p>Session用来保存每一个用户的专有信息</p>
<p>Session的生存期是用户持续请求时间加上一段时间（一般是20分钟左右）</p>
<p>Session信息是保存在Web服务器内存中的，保存数据量可大可小<br />
由于用户停止使用应用程序之后它仍在内存中存留一段时间，因此这种方法效率较低</p>
<p>代码：<br />
<code><br />
Session[“UserID”]=”test”;<br />
String UserName=Session[“UserID”].ToString();<br />
</code><br />
Cookie</p>
<p>Cookie用来保存客户浏览器请求服务器页面的请求信息</p>
<p>我们可以存放非敏感的用户信息，保存时间可以根据需要设置</p>
<p>如果没有设置Cookie失效日期，它的生命周期保存到关闭浏览器为止</p>
<p>Cookie对象的Expires属性设置为MinValue表示永不过期</p>
<p>Cookie存储的数据量受限制，大多数的浏览器为4K因此不要存放大数据</p>
<p>由于并非所有的浏览器都支持Cookie，数据将以明文的形式保存在客户端</p>
<p>代码：<br />
<code><br />
Resopnse.Cookies[“UserID”]=”test”;<br />
String UserName= Resopnse.Cookies [“UserID”].ToString();<br />
</code><br />
Cache</p>
<p>Cache用于在Http请求期间保存页面或者数据</p>
<p>Cache的使用可以大大的提高整个应用程序的效率</p>
<p>它允许将频繁访问的服务器资源存储在内存中，当用户发出相同的请求后,服务器不是再次处理而是将Cache中保存的数据直接返回给用户</p>
<p>可以看出Cache节省的是时间—服务器处理时间</p>
<p>Cache实例是每一个应用程序专有的，其生命周期==该应用程序周期</p>
<p>应用程序重启将重新创建其实例</p>
<p>注意：如果要使用缓存的清理、到期管理、依赖项等功能必须使用Insert 或者Add方法方法添加信息</p>
<p>代码：<br />
<code><br />
Cache[”ID”]=”cc”;或者Cache.Insert(“ID”,”test”);<br />
String ID =Cache[“ID”].ToString();<br />
</code><br />
通常使用最频繁的是Session，那么Session和Cache又有什么区别呢？</p>
<p>Session缓存和Cache缓存的区别。</p>
<p>（1）最大的区别是Cache提供缓存依赖来更新数据，而Session只能依靠定义的缓存时间来判断缓存数据是否有效。</p>
<p>（2）即使应用程序终止，只要Cache.Add方法中定义的缓存时间未过期，下次开启应用程序时，缓存的数据依然存在。而Session缓存只是存在于一次会话中，会话结束后，数据也就失效了。</p>
<p>（3）Session容易丢失，导致数据的不确定性，而Cache不会出现这种情况。</p>
<p>（4）由于Session是每次会话就被加载，所以不适宜存放大量信息，否则会导致服务器的性能降低。而Cache则主要用来保存大容量信息，如数据库中的多个表。</p>
<p>（5）Session目前只能保存在内存中，对其性能有影响。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpdo.net/index.php/session-and-cache.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正则表达式全部符号解释</title>
		<link>http://www.phpdo.net/index.php/regular.html</link>
		<comments>http://www.phpdo.net/index.php/regular.html#comments</comments>
		<pubDate>Wed, 25 Apr 2012 04:49:42 +0000</pubDate>
		<dc:creator>老张</dc:creator>
				<category><![CDATA[php-基础语法]]></category>
		<category><![CDATA[正则表达式全部符号解释]]></category>

		<guid isPermaLink="false">http://www.phpdo.net/?p=2152</guid>
		<description><![CDATA[正则表达式全部符号解释 字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如，&#8217;n&#8217; 匹配字符 “n”。&#8217;\n&#8217; 匹配一个换行符。序列 &#8216;\\&#8217; 匹配 “\” 而 “\(” 则匹配 “(“。 ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 &#8216;\n&#8217; 或 &#8216;\r&#8217; 之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 &#8216;\n&#8217; 或 &#8216;\r&#8217; 之前的位置。 * 匹配前面的子表达式零次或多次。例如，zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。 + 匹配前面的子表达式一次或多次。例如，&#8217;zo+&#8217; 能匹配 “zo” 以及 “zoo”，但不能匹配 “z”。+ 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。例如，”do(es)?” [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a title="正则表达式" href="http://www.phpdo.net" target="_blank">正则表达式</a>全部符号解释</strong></p>
<table width="1308" border="0" cellspacing="0" cellpadding="0">
<colgroup>
<col width="212" />
<col width="1096" /> </colgroup>
<tbody>
<tr>
<td width="212" height="19">字符</td>
<td width="1096">描述</td>
</tr>
<tr>
<td width="212" height="75">\</td>
<td width="1096">将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如，&#8217;n&#8217; 匹配字符 “n”。&#8217;\n&#8217; 匹配一个换行符。序列 &#8216;\\&#8217; 匹配 “\” 而 “\(” 则匹配 “(“。</td>
</tr>
<tr>
<td width="212" height="45">^</td>
<td width="1096">匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 &#8216;\n&#8217; 或 &#8216;\r&#8217; 之后的位置。</td>
</tr>
<tr>
<td width="212" height="45">$</td>
<td width="1096">匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 &#8216;\n&#8217; 或 &#8216;\r&#8217; 之前的位置。</td>
</tr>
<tr>
<td width="212" height="30">*</td>
<td width="1096">匹配前面的子表达式零次或多次。例如，zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。</td>
</tr>
<tr>
<td width="212" height="45">+</td>
<td width="1096">匹配前面的子表达式一次或多次。例如，&#8217;zo+&#8217; 能匹配 “zo” 以及 “zoo”，但不能匹配 “z”。+ 等价于 {1,}。</td>
</tr>
<tr>
<td width="212" height="45">?</td>
<td width="1096">匹配前面的子表达式零次或一次。例如，”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。</td>
</tr>
<tr>
<td width="212" height="45">{n}</td>
<td width="1096">n 是一个非负整数。匹配确定的 n 次。例如，&#8217;o{2}&#8217; 不能匹配 “Bob” 中的 &#8216;o&#8217;，但是能匹配 “food” 中的两个 o。</td>
</tr>
<tr>
<td width="212" height="60">{n,}</td>
<td width="1096">n 是一个非负整数。至少匹配n 次。例如，&#8217;o{2,}&#8217; 不能匹配 “Bob” 中的 &#8216;o&#8217;，但能匹配 “foooood” 中的所有 o。&#8217;o{1,}&#8217; 等价于 &#8216;o+&#8217;。&#8217;o{0,}&#8217; 则等价于 &#8216;o*&#8217;。</td>
</tr>
<tr>
<td width="212" height="75">{n,m}</td>
<td width="1096">m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，”o{1,3}” 将匹配 “fooooood” 中的前三个 o。&#8217;o{0,1}&#8217; 等价于 &#8216;o?&#8217;。请注意在逗号和两个数之间不能有空格。</td>
</tr>
<tr>
<td width="212" height="105">?</td>
<td width="1096">当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 “oooo”，&#8217;o+?&#8217; 将匹配单个 “o”，而 &#8216;o+&#8217; 将匹配所有 &#8216;o&#8217;。</td>
</tr>
<tr>
<td width="212" height="45">.</td>
<td width="1096">匹配除 “\n” 之外的任何单个字符。要匹配包括 &#8216;\n&#8217; 在内的任何字符，请使用象 &#8216;[.\n]&#8216; 的模式。</td>
</tr>
<tr>
<td width="212" height="75">(pattern)</td>
<td width="1096">匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0…$9 属性。要匹配圆括号字符，请使用 &#8216;\(&#8216; 或 &#8216;\)&#8217;。</td>
</tr>
<tr>
<td width="212" height="90">(?:pattern)</td>
<td width="1096">匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如， &#8216;industr(?:y|ies) 就是一个比 &#8216;industry|industries&#8217; 更简略的表达式。</td>
</tr>
<tr>
<td width="212" height="135">(?=pattern)</td>
<td width="1096">正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，&#8217;Windows (?=95|98|NT|2000)&#8217; 能匹配 “Windows 2000&#8243; 中的 “Windows” ，但不能匹配 “Windows 3.1&#8243; 中的 “Windows”。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。</td>
</tr>
<tr>
<td width="212" height="135">(?!pattern)</td>
<td width="1096">负向预查，在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如&#8217;Windows (?!95|98|NT|2000)&#8217; 能匹配 “Windows 3.1&#8243; 中的 “Windows”，但不能匹配 “Windows 2000&#8243; 中的 “Windows”。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始</td>
</tr>
<tr>
<td width="212" height="45">x|y</td>
<td width="1096">匹配 x 或 y。例如，&#8217;z|food&#8217; 能匹配 “z” 或 “food”。&#8217;(z|f)ood&#8217; 则匹配 “zood” 或 “food”。</td>
</tr>
<tr>
<td width="212" height="30">[xyz]</td>
<td width="1096">字符集合。匹配所包含的任意一个字符。例如， &#8216;[abc]&#8216; 可以匹配 “plain” 中的 &#8216;a&#8217;。</td>
</tr>
<tr>
<td width="212" height="30">[^xyz]</td>
<td width="1096">负值字符集合。匹配未包含的任意字符。例如， &#8216;[^abc]&#8216; 可以匹配 “plain” 中的&#8217;p'。</td>
</tr>
<tr>
<td width="212" height="45">[a-z]</td>
<td width="1096">字符范围。匹配指定范围内的任意字符。例如，&#8217;[a-z]&#8216; 可以匹配 &#8216;a&#8217; 到 &#8216;z&#8217; 范围内的任意小写字母字符。</td>
</tr>
<tr>
<td width="212" height="45">[^a-z]</td>
<td width="1096">负值字符范围。匹配任何不在指定范围内的任意字符。例如，&#8217;[^a-z]&#8216; 可以匹配任何不在 &#8216;a&#8217; 到 &#8216;z&#8217; 范围内的任意字符。</td>
</tr>
<tr>
<td width="212" height="45">\b</td>
<td width="1096">匹配一个单词边界，也就是指单词和空格间的位置。例如， &#8216;er\b&#8217; 可以匹配”never” 中的 &#8216;er&#8217;，但不能匹配 “verb” 中的 &#8216;er&#8217;。</td>
</tr>
<tr>
<td width="212" height="30">\B</td>
<td width="1096">匹配非单词边界。&#8217;er\B&#8217; 能匹配 “verb” 中的 &#8216;er&#8217;，但不能匹配 “never” 中的 &#8216;er&#8217;。</td>
</tr>
<tr>
<td width="212" height="60">\cx</td>
<td width="1096">匹配由 x 指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 &#8216;c&#8217; 字符。</td>
</tr>
<tr>
<td width="212" height="19">\d</td>
<td width="1096">匹配一个数字字符。等价于 [0-9]。</td>
</tr>
<tr>
<td width="212" height="19">\D</td>
<td width="1096">匹配一个非数字字符。等价于 [^0-9]。</td>
</tr>
<tr>
<td width="212" height="19">\f</td>
<td width="1096">匹配一个换页符。等价于 \x0c 和 \cL。</td>
</tr>
<tr>
<td width="212" height="19">\n</td>
<td width="1096">匹配一个换行符。等价于 \x0a 和 \cJ。</td>
</tr>
<tr>
<td width="212" height="19">\r</td>
<td width="1096">匹配一个回车符。等价于 \x0d 和 \cM。</td>
</tr>
<tr>
<td width="212" height="30">\s</td>
<td width="1096">匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</td>
</tr>
<tr>
<td width="212" height="30">\S</td>
<td width="1096">匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</td>
</tr>
<tr>
<td width="212" height="19">\t</td>
<td width="1096">匹配一个制表符。等价于 \x09 和 \cI。</td>
</tr>
<tr>
<td width="212" height="19">\v</td>
<td width="1096">匹配一个垂直制表符。等价于 \x0b 和 \cK。</td>
</tr>
<tr>
<td width="212" height="30">\w</td>
<td width="1096">匹配包括下划线的任何单词字符。等价于&#8217;[A-Za-z0-9_]&#8216;。</td>
</tr>
<tr>
<td width="212" height="30">\W</td>
<td width="1096">匹配任何非单词字符。等价于 &#8216;[^A-Za-z0-9_]&#8216;。</td>
</tr>
<tr>
<td width="212" height="75">\xn</td>
<td width="1096">匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，&#8217;\x41&#8242; 匹配 “A”。&#8217;\x041&#8242; 则等价于 &#8216;\x04&#8242; &amp; “1&#8243;。正则表达式中可以使用 ASCII 编码。.</td>
</tr>
<tr>
<td width="212" height="45">\num</td>
<td width="1096">匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，&#8217;(.)\1&#8242; 匹配两个连续的相同字符。</td>
</tr>
<tr>
<td width="212" height="60">\n</td>
<td width="1096">标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为向后引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。</td>
</tr>
<tr>
<td width="212" height="105">\nm</td>
<td width="1096">标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式，则 nm 为向后引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。</td>
</tr>
<tr>
<td width="212" height="45">\nml</td>
<td width="1096">如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。</td>
</tr>
<tr>
<td width="212" height="45">\un</td>
<td width="1096">匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.phpdo.net/index.php/regular.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php常用易混淆概念</title>
		<link>http://www.phpdo.net/index.php/php-idea.html</link>
		<comments>http://www.phpdo.net/index.php/php-idea.html#comments</comments>
		<pubDate>Tue, 24 Apr 2012 05:11:13 +0000</pubDate>
		<dc:creator>老张</dc:creator>
				<category><![CDATA[老张的碎嘴]]></category>
		<category><![CDATA[php常用易混淆概念]]></category>

		<guid isPermaLink="false">http://www.phpdo.net/?p=2148</guid>
		<description><![CDATA[PHP中 HTTP_HOST 和 SERVER_NAME
相同点：

当满足以下三个条件时，两者会输出相同信息。

1. 服务器为80端口
2. apache的conf中ServerName设置正确
3. HTTP/1.1协议规范

不同点：]]></description>
			<content:encoded><![CDATA[<p>1.echo和print的区别</p>
<p><a title="PHP" href="http://www.phpdo.net" target="_blank">PHP</a>中echo和print的功能基本相同（输出），但是两者之间还是有细微差别的。</p>
<p>echo输出后没有返回值，但print有返回值，当其执行失败时返回flase。</p>
<p>因此可以作为一个普通函数来使用，例如执行下面的代码后变量$r的值将为1。</p>
<p><code>$r = print "Hello World";</code></p>
<p>这意味着print可用在一些复杂的表达式中，而echo则不行。</p>
<p>但是，因为echo语句不要求返回任何数值，所已在代码中echo语句的运行效率要略微快于print语句。</p>
<p>2.空字符串(”)和NULL的区别</p>
<p>PHP中空字符串和NULL都是以值为0存储的，但是他们的类型并不一样，你可以试一下echo gettype(”);和echo gettype(NULL);</p>
<p>你会发现他们打印出来的分别是string和NULL，当然还有0也容易混淆，你可以试试echo gettype(0);打印一下类型，会发现0的类型是integer（整型），可见字符串(”)、NULL和0是“等值”但不等类型。</p>
<p>3.isset和 empty的区别</p>
<p>从字面意思上我们就可以明白：empty是判断一个变量是否为“空”，而isset 则是判断一个变量是否已经设置。</p>
<p>但是这里有一点绝对要注意起来：当一个变量值为0，empty 认为这个变量同等于空，即相当于没有设置。</p>
<p>比如当我们检测＄id 变量的时候，当＄id=0 ，用empty和isset来检测变量＄id是否已经配置，两都将返回不同的值：empty 认为没有配置，isset 则能够取得 ＄id 的值</p>
<p>看下边例子：<br />
<code><br />
$id=0;<br />
empty($id)?print "我是空的":print "我是$id ."; //结果：我是空的<br />
!isset($id)?print "我是空的":print "我是$id .";//结果：我是0<br />
</code><br />
4.==（等）和===（恒等）的区别</p>
<p>回顾上面第2条空字符串(“”)和NULL的区别，再来看一个例子：<br />
<code><br />
'' == NULL;<br />
'' === NULL;<br />
</code><br />
运行之后你会发现第一个为true，而第二个则为false！可见==只是比较值是否相等，而===则不但比较值，还会比较类型，更为严格。</p>
<p>5.self :: 和 this-&gt; 的区别</p>
<p>在访问PHP类中的成员变量或方法时，如果被引用的变量或者方法被声明成const（定义常量）或者static（声明静态）,那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者static,那么就必须使用操作符-&gt;。</p>
<p>另外，如果从类的内部访问const或者static变量或者方法,那么就必须使用自引用的self，反之如果从类的内部访问不为const或者static变量或者方法,那么就必须使用自引用的$this。</p>
<p>6.<a title="PHP" href="http://www.phpdo.net" target="_blank">PHP</a>中 HTTP_HOST 和 SERVER_NAME</p>
<p>相同点：</p>
<p>当满足以下三个条件时，两者会输出相同信息。<br />
<code><br />
1. 服务器为80端口<br />
2. apache的conf中ServerName设置正确<br />
3. HTTP/1.1协议规范<br />
</code><br />
不同点：</p>
<p>1. 通常情况：</p>
<p>_SERVER["HTTP_HOST"] 在HTTP/1.1协议规范下，会根据客户端的HTTP请求输出信息。</p>
<p>_SERVER["SERVER_NAME"] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。</p>
<p>2. 当服务器为非80端口时：</p>
<p>_SERVER["HTTP_HOST"] 会输出端口号</p>
<p>_SERVER["SERVER_NAME"] 会直接输出ServerName值</p>
<p>因此在这种情况下，可以理解为：HTTP_HOST = SERVER_NAME : SERVER_PORT</p>
<p>3. 当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时：</p>
<p>httpd.conf配置如下：<br />
<code><br />
ServerName phpdo.net<br />
ServerAlias www.phpdo.net<br />
</code><br />
客户端访问域名www.phpdo.net<br />
<code><br />
_SERVER["HTTP_HOST"] 输出 www.phpdo.net<br />
_SERVER["SERVER_NAME"] 输出 phpdo.net<br />
</code><br />
所以，在实际程序中，应尽量使用_SERVER["HTTP_HOST"] ，比较保险和可靠。</p>
<p>如果在端口映射的情况下，并且在内网访问，用“$_SERVER['HTTP_X_FORWARDED_HOST']”比较好。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpdo.net/index.php/php-idea.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP生成条形码(转)</title>
		<link>http://www.phpdo.net/index.php/php-barcode.html</link>
		<comments>http://www.phpdo.net/index.php/php-barcode.html#comments</comments>
		<pubDate>Mon, 23 Apr 2012 04:57:57 +0000</pubDate>
		<dc:creator>老张</dc:creator>
				<category><![CDATA[老张的碎嘴]]></category>
		<category><![CDATA[PHP生成条形码]]></category>

		<guid isPermaLink="false">http://www.phpdo.net/?p=2139</guid>
		<description><![CDATA[百度百科定义：条形码(barcode)是将宽度不等的多个黑条和空白，按照一定的编码规则排列，用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条（简称条）和白条（简称空）排成平行线的图案。在日常生活中，条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件地点起止、类别、日期等许多信息。条形码编码格式具体请参考]]></description>
			<content:encoded><![CDATA[<p>1.<strong><a title="什么是条形码" href="http://www.phpdo.net">什么是条形码</a></strong>？</p>
<p>百度百科定义：条形码(barcode)是将宽度不等的多个黑条和空白，按照一定的编码规则排列，用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条（简称条）和白条（简称空）排成平行线的图案。在日常生活中，条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件地点起止、类别、日期等许多信息。条形码编码格式具体请参考</p>
<p>打印出来的优惠券，商家需要用验证器读取条形码，来获得其有效性。</p>
<p>2.如何生成条形码？</p>
<p>首先找到强大的开源资料，在barcode官网下载barcodegen.1d-php5.v5.0.1.zip版本，然后解压文件放到你的Apache服务器的根目录下。</p>
<p>2.1<br />
<div id="attachment_2144" class="wp-caption aligncenter" style="width: 176px"><a href="http://www.phpdo.net/wp-content/uploads/2012/04/11.jpg"><img class="size-full wp-image-2144" title="1" src="http://www.phpdo.net/wp-content/uploads/2012/04/11.jpg" alt="文件结构" width="166" height="163" /></a><p class="wp-caption-text">文件结构</p></div></p>
<p>2.2具体解析</p>
<p>（1）class文件夹是已封装好生成条形码的类，只需要调用即可。</p>
<p>（2）index.php是一个可选择条件生成条形码的功能，是主程序的入口，而html文件夹是提供的被引用的代码，code39.php指的是指向默认的编码格式。<br />
<code><br />
&lt;?php<br />
header('Location: html/code39.php');<br />
?&gt;<br />
</code><br />
当直接访问http://localhost/barcodegen/index.php时，用户体验可以体验该功能，任意选择项，生成对应的条形码。需要的话可以将它改版成module来使用。</p>
<div id="attachment_2140" class="wp-caption aligncenter" style="width: 847px"><a href="http://www.phpdo.net/wp-content/uploads/2012/04/21.jpg"><img class="size-full wp-image-2140" title="2" src="http://www.phpdo.net/wp-content/uploads/2012/04/21.jpg" alt="PHP生成条形码" width="837" height="669" /></a><p class="wp-caption-text">PHP生成条形码</p></div>
<p>（3）test.php是另外一个例子，通过代码直接生成HELLO条形码。</p>
<p>当访问http://localhost/barcodegen/test.php时，HELLO.PNG图片生成</p>
<p><a href="http://www.phpdo.net/wp-content/uploads/2012/04/4.jpg"><img class="aligncenter size-full wp-image-2142" title="4" src="http://www.phpdo.net/wp-content/uploads/2012/04/4.jpg" alt="" width="307" height="142" /></a><br />
<code><br />
&lt;?php<br />
// 引用class文件夹对应的类<br />
require_once('class/BCGFontFile.php');<br />
require_once('class/BCGColor.php');<br />
require_once('class/BCGDrawing.php');<br />
// 条形码的编码格式<br />
require_once('class/BCGcode39.barcode.php');<br />
// 加载字体大小<br />
$font = new BCGFontFile('./class/font/Arial.ttf', 18);<br />
//颜色条形码<br />
$color_black = new BCGColor(0, 0, 0);<br />
$color_white = new BCGColor(255, 255, 255);<br />
$drawException = null;<br />
try {<br />
$code = new BCGcode39();<br />
$code-&gt;setScale(2);<br />
$code-&gt;setThickness(30); // 条形码的厚度<br />
$code-&gt;setForegroundColor($color_black); // 条形码颜色<br />
$code-&gt;setBackgroundColor($color_white); // 空白间隙颜色<br />
$code-&gt;setFont($font); //<br />
$code-&gt;parse('HELLO'); // 条形码需要的数据内容<br />
} catch(Exception $exception) {<br />
$drawException = $exception;<br />
}<br />
//根据以上条件绘制条形码<br />
$drawing = new BCGDrawing('', $color_white);<br />
if($drawException) {<br />
$drawing-&gt;drawException($drawException);<br />
} else {<br />
$drawing-&gt;setBarcode($code);<br />
$drawing-&gt;draw();<br />
}<br />
// 生成PNG格式的图片<br />
header('Content-Type: image/png');<br />
$drawing-&gt;finish(BCGDrawing::IMG_FORMAT_PNG);<br />
?&gt;<br />
</code><br />
3.实际应用</p>
<p>对于上面有个大概的了解后，下面我们可以重新整合下代码，更加方便的使用它。</p>
<p>首先新建buildcode.php文件中，根据test.php文件进行改写，从请求的文件中获取数据：</p>
<p>1.条形码的编码格式</p>
<p>2.条形码需要的数据内容<br />
<code><br />
&lt;?php<br />
// Including all required classes<br />
require_once('class/BCGFontFile.php');<br />
require_once('class/BCGColor.php');<br />
require_once('class/BCGDrawing.php');<br />
$codebar = $_REQUEST['codebar']; //条形码将要数据的内容<br />
// Including the barcode technology<br />
require_once('class/'.$codebar.'.barcode.php');<br />
// Loading Font<br />
$font = new BCGFontFile('./class/font/Arial.ttf', 12);<br />
// The arguments are R, G, B for color.<br />
$color_black = new BCGColor(0, 0, 0);<br />
$color_white = new BCGColor(255, 255, 255);<br />
$drawException = null;<br />
try {<br />
$code = new $codebar();//实例化对应的编码格式<br />
$code-&gt;setScale(2); // Resolution<br />
$code-&gt;setThickness(23); // Thickness<br />
$code-&gt;setForegroundColor($color_black); // Color of bars<br />
$code-&gt;setBackgroundColor($color_white); // Color of spaces<br />
$code-&gt;setFont($font); // Font (or 0)<br />
$text = $_REQUEST['text']; //条形码将要数据的内容<br />
$code-&gt;parse($text);<br />
} catch(Exception $exception) {<br />
$drawException = $exception;<br />
}<br />
/* Here is the list of the arguments<br />
1 - Filename (empty : display on screen)<br />
2 - Background color */<br />
$drawing = new BCGDrawing('', $color_white);<br />
if($drawException) {<br />
$drawing-&gt;drawException($drawException);<br />
} else {<br />
$drawing-&gt;setBarcode($code);<br />
$drawing-&gt;draw();<br />
}<br />
// Header that says it is an image (remove it if you save the barcode to a file)<br />
header('Content-Type: image/png');<br />
// Draw (or save) the image into PNG format.<br />
$drawing-&gt;finish(BCGDrawing::IMG_FORMAT_PNG);<br />
?&gt;<br />
</code><br />
然后新建test.html文件，向buildcode.php请求数据<br />
<code><br />
&lt;!DOCTYPE html&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Test with embedded image&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;img src="buildcode.php?codebar=BCGcode39&amp;text=abc123"/&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
</code><br />
最后访问http://localhost/barcodegen/test.html或访问http://localhost/barcodegen/buildcode.php?codebar=BCGcode39&amp;text=abc123，浏览器直接生成png格式的条形码</p>
<p><a href="http://www.phpdo.net/wp-content/uploads/2012/04/5.jpg"><img class="aligncenter size-full wp-image-2143" title="5" src="http://www.phpdo.net/wp-content/uploads/2012/04/5.jpg" alt="" width="217" height="70" /></a></p>
<p>其中codebar支持的编码格式可以由用户请求所得：<br />
<code><br />
/*'BCGcodabar','BCGcode11','BCGcode39','BCGcode39extended','BCGcode93',<br />
'BCGcode128','BCGean8','BCGean13','BCGisbn','BCGi25','BCGs25','BCGmsi',<br />
'BCGupca','BCGupce','BCGupcext2','BCGupcext5','BCGpostnet','BCGothercode'*/<br />
</code><br />
4.验证</p>
<p>我们如何验证条形码是否有效，即能否读出条形码中的内容。</p>
<p>先将图片保存下来，然后访问官网提供的验证功能，将图片上传就Ok了！</p>
<p><a href="http://www.phpdo.net/wp-content/uploads/2012/04/6.jpg"><img class="aligncenter size-full wp-image-2141" title="6" src="http://www.phpdo.net/wp-content/uploads/2012/04/6.jpg" alt="" width="355" height="331" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpdo.net/index.php/php-barcode.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

