﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-远风工作室</title><link>http://www.cppblog.com/amazon/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:16:20 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 10:16:20 GMT</pubDate><ttl>60</ttl><item><title>array_key_exists、empty、isset的比较</title><link>http://www.cppblog.com/amazon/archive/2011/12/12/161983.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 12 Dec 2011 11:59:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/12/12/161983.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/161983.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/12/12/161983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/161983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/161983.html</trackback:ping><description><![CDATA[<div><strong>1. array_key_exists<br /></strong>原型：bool array_key_exists ( mixed key, array search )<br />描述：给定的key存在于数组中时返回TRUE，即使key对应的键值为NULL也返回true。array_key_exists() 也可用于对象<br /><br /><strong>2. empty<br /></strong>原型：bool empty ( mixed var )<br />描述：如果 var 是非空或非零的值，则 empty() 返回 FALSE。换句话说，""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的，如果 var 为空，则返回 TRUE。 <br />注意：<br />A. empty是语句而不是函数；<br />B. empty只能用于变量，诸如empty(addslashes($var))的用法是错误的，因为addslashes($var)返回常量。<br /><br /><strong>3. isset<br /></strong>原型：bool isset ( mixed var [, mixed var [, ...]] )<br />描述：如果var存在则返回TRUE，否则返回FALSE；若使用 isset()测试一个被设置成 NULL 的变量，将返回 FA<span>LS</span><span>E。</span><br /><span>注</span><span>意：<br />A. </span><span>isset是</span><span>语句而不是</span><span>函数；<br />B. isset只</span>能用于变量，若想检测常量是否设置可以使用defined()函数。<br />C. 使用unset实际上就是将var置为NULL。<br /><br /><strong>性能比较：<br /></strong>结论：isset ~ empty &gt; array_key_exists<br />原因：isset和empty是语句，而array_key_exists是函数，后者比前者多了函数调用，因此性能上要稍差。而isset和empty的范围是不一样的，主要区别在于值为NULL的情况，需要特别注意。<br /><br /></div><img src ="http://www.cppblog.com/amazon/aggbug/161983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-12-12 19:59 <a href="http://www.cppblog.com/amazon/archive/2011/12/12/161983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP调用外部程序的方法</title><link>http://www.cppblog.com/amazon/archive/2011/12/01/161281.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 01 Dec 2011 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/12/01/161281.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/161281.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/12/01/161281.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/161281.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/161281.html</trackback:ping><description><![CDATA[<div>很多情况下需要php调用其他程序如shell命令、shell脚本、可执行程序等等，此时需要使用到诸如exec/system/popen/proc_open等函数，每种函数有各自适合使用的场景以及需要注意的地方。<br /><br /><strong>前提：PHP没有运行在安全模式<br /></strong>如果PHP运行在安全模式下，那么在执行外部命令、打开文件、连接数据库、基于HTTP的认证这4个方面将会受到制约，可能在调用外部程序时无法获取预期的结果，此时需要设置特定目录，可以在php.ini中编辑safe_mode_exec_dir参数来指定。<br /><br /><strong>1. exec<br /></strong>原型：string exec ( string command [, array &amp;output [, int &amp;return_var]] )<br />描述：返回值保存最后的输出结果，而所有输出结果将会保存到$output数组，$return_var用来保存命令执行的状态码（用来检测成功或失败）。<br />例子：$ret&nbsp;= exec("ls -al", $output, $var);<br />注意：<br />A. 输出结果会逐行追加到$output中，因此在调用exec之前需要unset($output)，特别是循环调用的时候。<br />B. 如果想通过exec调用外部程序后马上继续执行后续代码，仅仅在命令里加"&amp;"是不够的，此时exec依然会等待命令执行完毕；需要再将标准输出做重定向才可以，例如：exec("ls -al &gt;/dev/null &amp;", $output, $var);<br />C. 要学会善用EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字符串 中所有可能瞒过Shell而去执行另外一个命令的字符转义。这些字符在Shell中是有特殊含义的，象分号（|），重定向（&gt;）和从文件读入 （&lt;）等。函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号，并把字符串中的单引号转义，这样这个字符串 就可以安全地作为命令的参数。<br /><br /><strong>2. system<br /></strong>原型：string system ( string command [, int &amp;return_var] )<br />描述：执行给定的命令，返回最后的输出结果；第二个参数是可选的，用来得到命令执行后的状态码。<br />例子：$ret = system("ls -al", $var);<br />注意：略。<br /><br /><strong>3. passthru<br /></strong>原型：void passthru (string command [, int return_var])<br />描述：执行给定的命令，但不返回任何输出结果，而是直接输出到显示设备上；第二个参数可选，用来得到命令执行后的状态码。<br />例子：passthru("ls -al", $var);<br />注意：略。<br /><br /><strong>4. popen<br /></strong>原型：resource popen ( string command, string mode )<br />描述：打开一个指向进程的管道，该进程由派生给定的 command 命令执行而产生。 返回一个和 fopen() 所返回的相同的文件指针，只不过它是单向的（只能用于读或写）并且必须用 pclose() 来关闭。此指针可以用于 fgets()，fgetss() 和 fwrite()。 <br />例子：$fd = popen("command", 'r'); $ret = fgets($fd);<br />注意：只能打开单向管道，不是'r'就是'w'；并且需要使用pclose()来关闭。<br /><br /><strong>5. proc_open<br /></strong>原型：resource proc_open ( string cmd, array descriptorspec, array &amp;pipes [, string cwd [, array env [, array other_options]]] )<br />描述：与popen类似，但是可以提供双向管道。具体的参数读者可以自己翻阅资料，比如该博客：<a href="http://hi.baidu.com/alex_wang58/blog/item/a28657de16fec55195ee372a.html">http://hi.baidu.com/alex_wang58/blog/item/a28657de16fec55195ee372a.html</a>。<br />注意：<br />A. 后面需要使用proc_close()关闭资源，并且如果是pipe类型，需要用pclose()关闭句柄。<br />B. proc_open打开的程序作为php的子进程，php退出后该子进程也会退出。<br />C. <span style="color: red">笔者在使用的时候遇到获取外部程序输出阻塞的问题，也就是在例子中的fgets($pipes[1])语句阻塞了，无法继续进行。经过多方查证后发现，问题一般出在外部程序中，比如外部程序是C程序，使用fprintf(stdin, "**** \n");输出结果，此时需要加上fflush(stdout);才行，否则输出结果可能会暂留缓存中，无法真正输出，而php也就无法获取输出了。</span><br />例子： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #008000">//</span><span style="color: #008000">/&lt;&nbsp;打开管道</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$pwd</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">*****</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$pipes</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">array</span><span style="color: #000000">();<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$command</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">*****</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$desc</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">array</span><span style="color: #000000">(</span><span style="color: #0000ff">array</span><span style="color: #000000">(</span><span style="color: #000000">'</span><span style="color: #000000">pipe</span><span style="color: #000000">'</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">r</span><span style="color: #000000">'</span><span style="color: #000000">)</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">array</span><span style="color: #000000">(</span><span style="color: #000000">'</span><span style="color: #000000">pipe</span><span style="color: #000000">'</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">w</span><span style="color: #000000">'</span><span style="color: #000000">)</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">array</span><span style="color: #000000">(</span><span style="color: #000000">'</span><span style="color: #000000">pipe</span><span style="color: #000000">'</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">w</span><span style="color: #000000">'</span><span style="color: #000000">));<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$handle</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #008080">proc_open</span><span style="color: #000000">(</span><span style="color: #800080">$command</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$desc</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$pipes</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$pwd</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #008080">is_resource</span><span style="color: #000000">(</span><span style="color: #800080">$handle</span><span style="color: #000000">))&nbsp;{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">fprintf</span><span style="color: #000000">(STDERR</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">proc_open&nbsp;failed.\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">(</span><span style="color: #000000">1</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />}<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">/&lt;&nbsp;读写</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008080">fwrite</span><span style="color: #000000">(</span><span style="color: #800080">$pipes</span><span style="color: #000000">[</span><span style="color: #000000">0</span><span style="color: #000000">]</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">*****\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$ret</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #008080">rtrim</span><span style="color: #000000">(</span><span style="color: #008080">fgets</span><span style="color: #000000">(</span><span style="color: #800080">$pipes</span><span style="color: #000000">[</span><span style="color: #000000">1</span><span style="color: #000000">])</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">/&lt;&nbsp;关闭管道</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008080">fclose</span><span style="color: #000000">(</span><span style="color: #800080">$pipes</span><span style="color: #000000">[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008080">fclose</span><span style="color: #000000">(</span><span style="color: #800080">$pipes</span><span style="color: #000000">[</span><span style="color: #000000">1</span><span style="color: #000000">]);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008080">fclose</span><span style="color: #000000">(</span><span style="color: #800080">$pipes</span><span style="color: #000000">[</span><span style="color: #000000">2</span><span style="color: #000000">]);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008080">proc_close</span><span style="color: #000000">(</span><span style="color: #800080">$handle</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span></div><br /><br /></div><img src ="http://www.cppblog.com/amazon/aggbug/161281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-12-01 15:34 <a href="http://www.cppblog.com/amazon/archive/2011/12/01/161281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>smarty模板基础总结</title><link>http://www.cppblog.com/amazon/archive/2011/11/21/160638.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 21 Nov 2011 06:36:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/11/21/160638.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/160638.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/11/21/160638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/160638.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/160638.html</trackback:ping><description><![CDATA[<p><strong>前提：<br /></strong>1. 部署smarty模板目录；<br />2. 编写Smarty类的子类，定制好template_dir、compile_dir、config_dir、cache_dir、left_delimiter、right_delimiter、compile_check、caching等配置信息。<br />3. 在BaseAction类中定义该类对象，然后便可使用。<br />4. 暂定delimiter使用{和}<br /><br /><strong>一. &nbsp;变量</strong></p>
<p>1. php变量<br />&nbsp;&nbsp; A. 普通变量：{$var}<br />&nbsp;&nbsp; B. 关联数组：{$array.var1.var2}<br />&nbsp;&nbsp; C. 数字数组：{$array[0][1]}<br />&nbsp;&nbsp; D. 对象：{$object-&gt;var}<br />&nbsp;&nbsp; E. 在引号内的使用方法，以关联数组为例，其他类似：{function var="{$array.var1.var2}"}<br />2. conf变量<br />&nbsp;&nbsp; A. {#var#}<br />&nbsp;&nbsp; B. 在引号内的使用方法：{function var="{#var#}"}<br />3. smarty保留变量：略。<br /><br /><strong>二. 变量调节器</strong></p>
<p>1. capitalize / lower / upper<br />&nbsp;&nbsp; 用途：首字母大写 / 转为小写 / 转为大写<br />&nbsp;&nbsp; 用法：{$var|capitalize} / {$var|lower} / {$var|upper}<br />2. count_characters / count_paragraphs / count_sentences / count_words<br />&nbsp;&nbsp; 用途：计算字节数，默认不计算空格符 / 计算段落数量 / 计算句子数量 / 计算词数<br />&nbsp;&nbsp; 用法：{$var|count_characters}&nbsp; {$var|count_characters:true} / {$article|count_paragraphs} / {$article|count_sentences} / {$sentence|count_words}<br />3. cat<br />&nbsp;&nbsp; 用途：字符串连接<br />&nbsp;&nbsp; 用法：{$var|cat:" is a boy."}<br />4. nl2br<br />&nbsp;&nbsp; 用途：换行符替换为&lt;br/&gt;<br />&nbsp;&nbsp; 用法：{$var|nl2br}<br />5. regex_replace / replace<br />&nbsp;&nbsp; 用途：正则替换 / 普通替换<br />&nbsp;&nbsp; 用法：{$var|regex_replace:"/\[old\]/":"[new]"} / {$var|replace:"old":"new"}<br />6. spacify<br />&nbsp;&nbsp; 用途：在每个字符间插入指定字符<br />&nbsp;&nbsp; 用法：{$var|spacify:"^_^"}<br />7. date_format<br />&nbsp;&nbsp; 用途：格式化日期，类似"-1 days ago"、"201111010000"、时间戳等都可以，与strftime()功能类似<br />&nbsp;&nbsp; 用法：{$time|date_format:"%H:%M:%S"}<br />8. default<br />&nbsp;&nbsp; 用途：当变量为空时，设置默认值<br />&nbsp;&nbsp; 用法：{$var|default:"no value"}<br />9. escape<br />&nbsp;&nbsp; 用途：转码，包括：html,htmlall,url,quotes,hex,hexentity,javascript<br />&nbsp;&nbsp; 用法：{$articleTitle|escape:"html"}<br />10.indent<br />&nbsp;&nbsp; 用途：文字缩进，可以制定缩进字符数和使用什么字符代替<br />&nbsp;&nbsp; 用法：{$var|indent}&nbsp; {$var|indent:4}&nbsp; {$var|indent:4:"\t"}<br />11.string_format<br />&nbsp;&nbsp; 用途：类似用sprintf<br />&nbsp;&nbsp; 用法：{$var|string_format:"%.2f"}<br />12.strip / strip_tags<br />&nbsp;&nbsp; 用途：去除多余空白符，可以指定去除的字符 / 去除&lt;&gt;以及包含在里面的所有字符<br />&nbsp;&nbsp; 用法：{$var|strip}&nbsp; {$var|strip:"&amp;nbsp;"} / {$var|strip_tags}<br />13.truncate<br />&nbsp;&nbsp; 用途：字符串截取，默认截取80字符，可以指定追加的字符串<br />&nbsp;&nbsp; 用法：{$var|truncate:40}&nbsp; {$var|truncate:40:"...":true}<br />14.组合修改器<br />&nbsp;&nbsp; 用途：顾名思义，可以将多个变量调节器组合使用，中间用|来代替<br />&nbsp;&nbsp; 例子：{$articleTitle|lower|spacify|truncate:30:"..."}<br /><br /><strong>三. 内建函数</strong></p>
<p>1. capture<br />&nbsp;&nbsp; 用途：捕获模板内容到某变量var，并不进行输出<br />&nbsp;&nbsp; 用法：<br />&nbsp;&nbsp; 在{capture}{/capture}中间的数据被捕获，可以使用$smarty.capture.var来使用，不指定name的话，默认为default<br />&nbsp;&nbsp; {capture name=banner}<br />&nbsp;&nbsp; This is a test.<br />&nbsp;&nbsp; {/capture}<br />2. foreach<br />&nbsp;&nbsp; 用途：循环处理<br />&nbsp;&nbsp; 用法：<br />&nbsp;&nbsp; from: 数组，需要用$<br />&nbsp;&nbsp; item: 单元元素名称，不需要用$<br />&nbsp;&nbsp; key: key名称，不需要用$<br />&nbsp;&nbsp; name: 该循环的名称，可以用于访问该循环，例如：{$smarty.foreach.foreachname.varname}<br />&nbsp;&nbsp; {foreach item=contact from=$contacts}<br />&nbsp;&nbsp; {foreach key=key item=item from=$contact}<br />&nbsp;&nbsp; {$key}: {$item}&lt;br&gt;<br />&nbsp;&nbsp; {/foreach}<br />&nbsp;&nbsp; {/foreach}<br />&nbsp;&nbsp; 注意：在foreach中有一些特殊的变量，需要使用{$smarty.foreach.foreachname.***}来访问：<br />&nbsp;&nbsp; iteration: 表示当前循环的执行次数，初始为1<br />&nbsp;&nbsp; first: 循环第一次执行时被置为true<br />&nbsp;&nbsp; last: 同上<br />&nbsp;&nbsp; total: 用于显示循环执行的次数，在循环中或者循环后皆可使用<br />&nbsp;&nbsp; show: 是foreach的一个标签，用于决定是否显示该foreach的内容<br />3. include / insert<br />&nbsp;&nbsp; 用途：包含其他模板 / 与include不同， insert 所包含的内容不会被缓存，每次调用该模板都会重新执行该函数.<br />&nbsp;&nbsp; 用法：{include file="footer.tpl" title="Main menu" logo="<a href="http://my.domain.com/logo.gif">http://my.domain.com/logo.gif</a>"}<br />4. if elseif else<br />&nbsp;&nbsp; 用途：分之判断<br />&nbsp;&nbsp; 用法：<br />&nbsp;&nbsp; {if $name eq "Fred"}<br />&nbsp;&nbsp; Welcome Sir.<br />&nbsp;&nbsp; {elseif $name eq "Wilma"}<br />&nbsp;&nbsp; Welcome Ma'am.<br />&nbsp;&nbsp; {else}<br />&nbsp;&nbsp; Welcome, whatever you are.<br />&nbsp;&nbsp; {/if}<br />5. ldelim / rdelim<br />&nbsp;&nbsp; 用途：分别表示左括号、右括号，因为这两个符号被用作smarty模板的标识符<br />&nbsp;&nbsp; 用法：<br />&nbsp;&nbsp; {ldelim}&nbsp; {rdelim}<br />6. literal<br />&nbsp;&nbsp; 用途：在内部的数据当做文本处理，不使用smarty模板解析，主要用于javascript脚本等<br />&nbsp;&nbsp; 用法：<br />&nbsp;&nbsp; {literal}<br />&nbsp;&nbsp; ......<br />&nbsp;&nbsp; {/literal}<br />7. section<br />&nbsp;&nbsp; 用途：循环处理<br />&nbsp;&nbsp; 用法：<br />&nbsp;&nbsp; name: 该循环的名称<br />&nbsp;&nbsp; loop：决定循环次数的数组，注意这里的使用方法比较特别，可以使用section来对多个数组进行处理，但必须先用可以决定循环次数的数组给loop赋值<br />&nbsp;&nbsp; {section name=customer loop=$custid}<br />&nbsp;&nbsp; id: {$custid[customer]}&lt;br&gt;<br />&nbsp;&nbsp; name: {$name[customer]}&lt;br&gt;<br />&nbsp;&nbsp; address: {$address[customer]}&lt;br&gt;<br />&nbsp;&nbsp; {section name=contact loop=$contact_type[customer]}<br />&nbsp;&nbsp; {$contact_type[customer][contact]}: {$contact_info[customer][contact]}&lt;br&gt;<br />&nbsp;&nbsp; {/section}<br />&nbsp;&nbsp; &lt;p&gt;<br />&nbsp;&nbsp; {/section}<br />&nbsp;&nbsp; 如果要遍历多维关联数组，需要这样来使用：<br />&nbsp;&nbsp; {section name=customer loop=$contacts}<br />&nbsp;&nbsp; name: {$contacts[customer].name}&lt;br&gt;<br />&nbsp;&nbsp; home: {$contacts[customer].home}&lt;br&gt;<br />&nbsp;&nbsp; cell: {$contacts[customer].cell}&lt;br&gt;<br />&nbsp;&nbsp; e-mail: {$contacts[customer].email}&lt;p&gt;<br />&nbsp;&nbsp; {/section}<br />&nbsp;&nbsp; 注意：与foreach类似，在section中同样有一些特殊变量可供使用，使用方法是：{$smarty.section.sectionname.***}<br />&nbsp;&nbsp; index: 显示当前循环的索引，默认从0或者start开始<br />&nbsp;&nbsp; index_prev: 显示上一个循环索引值，默认从-1开始<br />&nbsp;&nbsp; index_next: 同上，直至最后都比上一次大1<br />&nbsp;&nbsp; ineration: 同foreach，与index不同，后者是索引<br />&nbsp;&nbsp; first: 同foreach<br />&nbsp;&nbsp; last: 同foreach<br />&nbsp;&nbsp; show: 同foreach<br />&nbsp;&nbsp; total: 同foreach<br />8. strip<br />&nbsp;&nbsp; 用途：将位于{strip}{/strip}内部html标签外的所有空格和回车清除干净，并以html标签开头和结尾<br />&nbsp;&nbsp; 用法：<br />&nbsp;&nbsp; {strip}<br />&nbsp;&nbsp; &lt;table border=0&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />&nbsp;&nbsp;&nbsp; &lt;td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;A HREF="{$url}"&gt;<br />&nbsp;&nbsp; &lt;font color="red"&gt;This is a test&lt;/font&gt;<br />&nbsp;&nbsp; &lt;/A&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />&nbsp; &lt;/tr&gt;<br />&nbsp;&nbsp; &lt;/table&gt;<br />&nbsp;&nbsp; {/strip}<br />&nbsp;&nbsp; 上述输出为：<br />&nbsp;&nbsp; &lt;table border=0&gt;&lt;tr&gt;&lt;td&gt;&lt;A HREF="<a href="http://my.domain.com%22%3e%3cfont/">http://my.domain.com"&gt;&lt;font</a> color="red"&gt;This is a test&lt;/font&gt;&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;<br /><br /><strong>四. 程序员需要注意的地方</strong></p>
<p>1. 常量<br />&nbsp;&nbsp; SMARTY_DIR：SMARTY_DIR常量用于定位smarty类文件的完整系统路径，必须以斜杠结束，也可以不定义，smarty模板会自动创建合适的值。<br />2. 类属性<br />&nbsp;&nbsp; $template_dir: 模板目录，也就是各html文件放置目录，默认为"./templates"<br />&nbsp;&nbsp; $compile_dir: 编译后的模板目录，经过smarty解析后的html文件放置目录，默认为"./templates_c"<br />&nbsp;&nbsp; $config_dir: 模板配置文件目录，默认为"./configs"<br />&nbsp;&nbsp; $plugins_dir: 插件目录，默认为SMARTY_DIR 。 "plugins"<br />&nbsp;&nbsp; $cache_dir: 存放模板缓存的目录，默认为"./cache"<br />&nbsp;&nbsp; $debugging: 可以启动调试控制台，默认为false，很有用啊！！！<br />&nbsp;&nbsp; $debug_tpl: 定义用于调试控制台的模板文件名字，默认为SMARTY_DIR . "libs/debug.tpl"<br />&nbsp;&nbsp; $global_assign: 用于定义全局变量，例如：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; php里：$this-&gt;tpl-&gt;global_assign = array('my_global_1' =&gt; .....);<br />&nbsp;&nbsp;&nbsp; 在template里：{$smarty.my_global_1.***}<br />&nbsp;&nbsp; $compile_check: 自动编译模板，默认设置为true，投入产品后为性能起见，可以设置为false。<br />&nbsp;&nbsp; $force_compile: 强迫每次调用时重新编译模板，默认为false，不受$compile_check的限制，一旦设置为true后会强迫重新编译。<br />&nbsp;&nbsp; $caching: 是否缓存模板输出，默认为false，有利于增强性能。<br />&nbsp;&nbsp; $caching_lifetime: 缓存生存时间，只在$caching为true时有效，-1表示永远有效，0表示永远需要重新生成。单位是秒。<br />&nbsp;&nbsp; 注意：$compile_check、$force_compile、$caching三者的关系如下：<br />&nbsp;&nbsp; A. 如果设置了$compile_check，如果任何模板文件或配置文件更新，都会重新编译，缓存也会重新生成；<br />&nbsp;&nbsp; B. 如果设置了$force_compile，则$compile_check不起作用，而缓存也总会重新生成；<br />&nbsp;&nbsp; C. 如果没有设置$caching，则没有缓存，性能受一定影响。<br /><br /><strong>五. smarty的method</strong></p>
<p>1. assign: 对模板使用到的php变量进行赋值<br />2. assign_by_ref: 也是赋值，不过是引用赋值<br />3. clear_all_assign: 清除所有赋值<br />4. clear_all_cache: 清除所有缓存，参数可以指定阈值时间<br />5. clear_assign: 清除某个赋值，可以指定单个变量名或者数组<br />6. clear_cache: 清除某个template的缓存，需要指定template的名称<br />7. clear_config: 清除所有配置变量，如果指定则清除特定配置变量<br />8. config_load: 加载某配置文件并将数据输出到模板<br />9. display: 显示某个模板<br />10.fetch: 捕获某个模板的输出，与display不同的是，模板输出内容并不会直接显示出来（有什么用呢？？？）<br />11.get_config_vars: 获取所有配置变量的值，也可以指定某个具体的变量名<br />12.get_template_vars: 获取所有模板变量的值，也可以指定某个具体的变量名<br />13.is_cached: 判断某模板的缓存是否存在，只有在$caching设置为true时才有效<br />14.template_exists: 判断某模板是否存在<br /><br /></p><img src ="http://www.cppblog.com/amazon/aggbug/160638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-11-21 14:36 <a href="http://www.cppblog.com/amazon/archive/2011/11/21/160638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP的EditPlus调试环境【转载】</title><link>http://www.cppblog.com/amazon/archive/2011/11/20/160557.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sun, 20 Nov 2011 06:54:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/11/20/160557.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/160557.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/11/20/160557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/160557.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/160557.html</trackback:ping><description><![CDATA[<div>懒了点，直接贴原文地址吧：<a href="http://www.cnblogs.com/lemtree/articles/1836266.html">http://www.cnblogs.com/lemtree/articles/1836266.html</a><br /><br />根据上面列出来的条目进行配置之后，返现Editplus已经像个标准的IDE了，而且启动速度很快，赞一个~<br /><br /></div><img src ="http://www.cppblog.com/amazon/aggbug/160557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-11-20 14:54 <a href="http://www.cppblog.com/amazon/archive/2011/11/20/160557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>insert时出现主键冲突的处理方法【转载】</title><link>http://www.cppblog.com/amazon/archive/2011/11/02/159489.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 02 Nov 2011 02:20:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/11/02/159489.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/159489.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/11/02/159489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/159489.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/159489.html</trackback:ping><description><![CDATA[<strong>原文出处：</strong><a href="http://hi.baidu.com/ytjwt/blog/item/1ccc2c26022b0608908f9d8c.html"><strong>http://hi.baidu.com/ytjwt/blog/item/1ccc2c26022b0608908f9d8c.html</strong></a><br /><br />
<p>使用"insert into"语句进行数据库操作时可能遇到主键冲突，用户需要根据应用场景进行忽略或者覆盖等操作。总结下，有三种解决方案来避免出错。<br /><br /><strong>1. insert ignore into<br /></strong>遇主键冲突，保持原纪录，忽略新插入的记录。<br />mysql&gt; select * from device ;<br />+-------+--------+-------------+<br />| devid | status | spec_char&nbsp;&nbsp; |<br />+-------+--------+-------------+<br />|&nbsp;&nbsp;&nbsp;&nbsp; 1 | dead&nbsp;&nbsp; | zhonghuaren | <br />|&nbsp;&nbsp;&nbsp;&nbsp; 2 | dead&nbsp;&nbsp; | zhong&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />+-------+--------+-------------+<br />2 rows in set (0.00 sec)</p>
<p>mysql&gt; insert into device values (1,'alive','yangting');<br />ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'</p>
<p>mysql&gt; insert ignore&nbsp; into device values (1,'alive','yangting');<br />Query OK, 0 rows affected (0.00 sec)</p>
<p>mysql&gt; select * from device ;<br />+-------+--------+-------------+<br />| devid | status | spec_char&nbsp;&nbsp; |<br />+-------+--------+-------------+<br />|&nbsp;&nbsp;&nbsp;&nbsp; 1 | dead&nbsp;&nbsp; | zhonghuaren | <br />|&nbsp;&nbsp;&nbsp;&nbsp; 2 | dead&nbsp;&nbsp; | zhong&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />+-------+--------+-------------+<br />2 rows in set (0.00 sec)<br />可见 insert ignore&nbsp; into当遇到主键冲突时，不更改原纪录，也不报错<br /></p>
<p><strong>2. replace into<br /></strong>遇主键冲突，替换原纪录，即先删除原纪录，后insert新纪录</p>
<p>mysql&gt; replace&nbsp; into device values (1,'alive','yangting');<br />Query OK, 2 rows affected (0.00 sec)</p>
<p>mysql&gt; select * from device ;<br />+-------+--------+-----------+<br />| devid | status | spec_char |<br />+-------+--------+-----------+<br />|&nbsp;&nbsp;&nbsp;&nbsp; 1 | alive&nbsp; | yangting&nbsp; | <br />|&nbsp;&nbsp;&nbsp;&nbsp; 2 | dead&nbsp;&nbsp; | zhong&nbsp;&nbsp;&nbsp;&nbsp; | <br />+-------+--------+-----------+<br />2 rows in set (0.00 sec)</p>
<p><br /><strong>3. insert into&nbsp;... ON DUPLICATE KEY UPDATE<br /></strong>其实这个是原本需要执行3条SQL语句（SELECT,INSERT,UPDATE），缩减为1条语句即可完成。<br />即<br />IF (SELECT * FROM where 存在) {<br />&nbsp;&nbsp;&nbsp; UPDATE&nbsp; SET&nbsp; WHERE ;<br />} else {<br />&nbsp;&nbsp;&nbsp; INSERT INTO;<br />}<br />如：mysql&gt; insert into device values (1,'readonly','yang') ON DUPLICATE KEY UPDATE status ='drain';<br />Query OK, 2 rows affected (0.00 sec)</p>
<p>上面语句伪代码表示即为<br />if (select * from device where devid=1) { <br />&nbsp;&nbsp;&nbsp; update device set status ='drain' where devid=1 <br />} else {<br />&nbsp;&nbsp;&nbsp; insert into device values (1,'readonly','yang')<br />}<br />很明显，devid=1&nbsp; 是有的，这样就执行update操作<br />mysql&gt; select * from device ;<br />+-------+--------+-----------+<br />| devid | status | spec_char |<br />+-------+--------+-----------+<br />|&nbsp;&nbsp;&nbsp;&nbsp; 1 | drain&nbsp; | yangting&nbsp; | <br />|&nbsp;&nbsp;&nbsp;&nbsp; 2 | dead&nbsp;&nbsp; | zhong&nbsp;&nbsp;&nbsp;&nbsp; | <br />+-------+--------+-----------+<br />2 rows in set (0.00 sec)<br />&nbsp;</p>
<p>测试表：<br />CREATE TABLE `device` (<br />`devid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,<br />`status` enum('alive','dead','down','readonly','drain') DEFAULT NULL,<br />`spec_char` varchar(11) DEFAULT '0',<br />PRIMARY KEY (`devid`)<br />) ENGINE=InnoDB </p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/amazon/aggbug/159489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-11-02 10:20 <a href="http://www.cppblog.com/amazon/archive/2011/11/02/159489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP类继承间的方法调用关系</title><link>http://www.cppblog.com/amazon/archive/2011/10/11/158016.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Tue, 11 Oct 2011 02:32:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/10/11/158016.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/158016.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/10/11/158016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/158016.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/158016.html</trackback:ping><description><![CDATA[<br />PHP和C++一样允许类的继承，但存在一些自有的特性：<br />1. 仅允许继承一个类，或者继承多个接口；<br />2. 默认类中的所有方法都具有C++中虚函数的特性，可以被子类重新覆盖；除非使用final关键字，此时子类不可重新覆盖该方法。<br /><br />在类中通常使用$this-&gt;... 来访问类的属性或者方法，此时$this实际上是实例化对象的映射，因此$this是不可能出现在静态方法中的，这一点与C++很类似。除此之外，还能在类中使用self::... h和parent::... 来分别调用自身类方法和父类的方法，这些是PHP中特有的关键字。<br /><br />接下来需要解答具体的问题了。<br /><strong>1. 如何在子类中调用自身的方法？<br /></strong>答：使用$this-&gt;... 或者 self::... 来调用即可，但在静态方法中只能使用self::... ，而且需要被调用方法中也没有使用到$this关键字。<br /><strong>2. 如何在子类中调用父类的方法？<br /></strong>答：无论是子类未覆盖的方法，直接使用$this-&gt;... 即可调用父类方法；如果是子类覆盖了的方法，需要使用到parent::.. 来调用。<br /><strong>3. 如何在父类中调用子类的方法？<br /></strong>答：如之前所述，默认类中所有方法都具有C++中虚函数的特性，因此如果父类中使用$this-&gt;... 调用某方法，无论该方法是否在父类中存在，而该方法被子类定义了，那么实际上调用的就是子类的方法。<br />具体见以下代码：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;x()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">echo</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">A::x()&nbsp;was&nbsp;called.\n</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;y()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self</span><span style="color: #000000">::</span><span style="color: #000000">x();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">echo</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">A::y()&nbsp;was&nbsp;called.\n</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;z()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">x();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">echo</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">A::z()&nbsp;was&nbsp;called.\n</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;}<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />}<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;B&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;A&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;x()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">echo</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">B::x()&nbsp;was&nbsp;called.\n</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;}<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />}<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #800080">$b</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;B();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #800080">$b</span><span style="color: #000000">-&gt;</span><span style="color: #000000">y();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">echo</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">--\n</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #800080">$b</span><span style="color: #000000">-&gt;</span><span style="color: #000000">z();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div><br />
<p>该例中，A::y()调用了A::x()，而B::x()覆盖了A::x()，那么当调用B::y()时，B::y()应该调用A::x()还是 B::x()呢？在C++中，如果A::x()未被定义为虚函数，那么B::y()（也就是A::y()）将调用A::x()，而如果A::x()使用 virtual关键字定义成虚函数，那么B::y()将调用B::x()。<br />然而，在PHP5中，虚函数的功能是由 self 和 $this 关键字实现的。如果父类中A::y()中使用 self::x() 的方式调用了 A::x()，那么在子类中不论A::x()是否被覆盖，A::y()调用的都是A::x()；而如果父类中A::y()使用 $this-&gt;x() 的方式调用了 A::x()，那么如果在子类中A::x()被B::x()覆盖，A::y()将会调用B::x()。</p>
<p>上例的运行结果如下：</p>
<p>A::x() was called. A::y() was called. <br />--<br />B::x() was called. A::z() was called. </p><br /><img src ="http://www.cppblog.com/amazon/aggbug/158016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-10-11 10:32 <a href="http://www.cppblog.com/amazon/archive/2011/10/11/158016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP类的静态方法和静态变量</title><link>http://www.cppblog.com/amazon/archive/2011/10/10/157966.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 10 Oct 2011 06:54:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/10/10/157966.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/157966.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/10/10/157966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/157966.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/157966.html</trackback:ping><description><![CDATA[<br />在php中，访问类的方法/变量有两种方法：<br />1. 创建对象$object = new Class()，然后使用"-&gt;"调用：$object-&gt;attribute/function，前提是该变量/方法可访问。<br />2. 直接调用类方法/变量：class::attribute/function，无论是静态/非静态都可以。但是有前提条件：<br />&nbsp;&nbsp;&nbsp; A. 如果是变量，需要该变量可访问。<br />&nbsp;&nbsp;&nbsp; B. 如果是方法，除了该方法可访问外，还需要满足：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b1) 如果是静态方法，没有特殊条件；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b2) 如果是非静态方法，需要改方法中没有使用$this，即没有调用非静态的变量/方法，当然，调用静态的变量/方法没有问题。<br /><br />然后我们再看一下使用$object-&gt;... 和使用class::... 都有什么区别：<br />1. 使用$object-&gt;... ，需要执行构造函数创建对象；<br />2. 使用class::... 调用静态方法/变量，不需要执行构造函数创建对象；<br />3. 使用class::... 调用非静态方法/变量，也不需要执行构造函数创建对象。<br /><br />然后奇怪的地方就出来了，既然2和3都一样，那静态方法/变量存在还有什么意义呢？<br />差异还是显然存在的，如下：<br />1. 静态变量<br />静态成员只保留一个变量值，而这个变量值对所有的实例都是有效，也就是说，所有的实例共享这个成员。<br />2. 静态方法<br />静态方法可以直接使用class::... 来调用，而非静态方法需要满足一定限制条件才能使用class::.. 的方法调用，如之前所述。<br /><br /><img src ="http://www.cppblog.com/amazon/aggbug/157966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-10-10 14:54 <a href="http://www.cppblog.com/amazon/archive/2011/10/10/157966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP中基于对象和类的基本函数</title><link>http://www.cppblog.com/amazon/archive/2011/10/10/157955.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 10 Oct 2011 05:13:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/10/10/157955.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/157955.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/10/10/157955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/157955.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/157955.html</trackback:ping><description><![CDATA[<div><strong>1. class_exists($class_name)<br /></strong><br />检查该类是否已经定义，返回true / false。<br /><br /><strong>2. get_class_methods($class_name)<br /></strong><br />返回指定类中定义的public方法名所组成的数组，如果该类不存在返回NULL。<br /><br /><strong>3. get_class_vars($class_name)<br /></strong><br />返回指定类中定义的public属性名所组成的关联数组，其中属性名为key，属性值为value，如果该类不存在返回NULL。<br /><br /><strong>4. get_class($object)<br /></strong><br />返回对象所属类的名称，如果$object不是对象则返回false。<br /><br /><strong>5. method_exists($object / $class_name, $method_name)<br /></strong><br />判断在指定的对象或者类中是否存在该函数（无论public还是protected、private），如果该对象或者类不存在，或者函数不存在，都返回false。<br /><br /><strong>6. get_object_vars($object)<br /></strong><br />返回指定对象中public属性名所组成的关联数组，其中属性名为key，属性值为value，如果该对象不存在返回NULL。<br /><br /><strong>7. get_parent_class($object / $class_name)<br /></strong><br />获取该对象或者类的父类名称。<br /><br /><strong>8. is_subclass_of($object, $class_name) / is_a($object, $class_name)<br /></strong><br />对于is_subclass_of()，如果该对象所属类是某类的子类，返回true，如果对象不存在、类不存在或者无父子关系，一律返回false。<br />对于is_a()，如果该对象所属类与指定类相同或者存在子-&gt;父关系，则返回true，否则一律返回false。<br /><br /></div><img src ="http://www.cppblog.com/amazon/aggbug/157955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-10-10 13:13 <a href="http://www.cppblog.com/amazon/archive/2011/10/10/157955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP的魔术函数和魔术常量</title><link>http://www.cppblog.com/amazon/archive/2011/10/10/157950.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 10 Oct 2011 04:18:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/10/10/157950.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/157950.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/10/10/157950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/157950.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/157950.html</trackback:ping><description><![CDATA[<div><strong style="font-size: 12pt">魔术方法：<br /></strong><strong><br /></strong>PHP把类中所有以__（两个下划线）开头的方法当成魔术方法，一般建议用户不要将自定义的方法前面加上__作为前缀。魔术方法：<br /><br /><strong>1. __construct()<br /><br /></strong>类的默认构造方法，如果__construct()和与类同名的方法共同出现时，默认调用__construct()而不是同类名方法。一般情况下用户自定义构造方法也会使用__construct()。<br /><br /><strong>2. __destruct()<br /></strong><br />类的析构函数，当该对象的所有引用都被删除，或者对象被显式销毁时执行。<br /><br /><strong>3. __get($name)<br /></strong><br />可以简单归纳为：用$object-&gt;a的方式读取对象的属性时，如果属性a存在且是public型，那么直接返回该属性的值；如果属性a不存在或者是protected/private这样的不可直接访问的类型，就会调用__get($name)方法并以返回值为准。一般可以使用该方法使外部可限制性地访问内部属性，或者完成类似java中的反射操作。<br /><br /><strong>4. __set($name, $value)<br /></strong><br />与__get($name)类似，用$object-&gt;a = 17的方式给属性赋值时，如果属性a存在且是public型，那么直接给属性a赋值皆可；如果属性a不存在或者是protected/private型，就会调用__set($name, $value)方法。<br /><br /><strong>5. __call($name, $arguments) / <strong>__callStatic($name, $arguments)</strong><br /></strong><br />当调用不存在或者不可访问的方法时，会调用__call($name, $arguments)方法。而当在静态方法中调用不存在或者不可访问的方法时，会调用__callStatic($name, $arguments)方法。<br /><br /><strong>6. __toString()<br /></strong><br />当打印对象时会被直接调用。如echo $object;<br /><br /><strong>7. __clone()<br /></strong><br />当对象被拷贝时直接调用。如$a = new Action(); $a = $object;<br /><br /><strong>8. __isset($name) / __unset($name)<br /></strong><br />对不存在或者不可访问的属性使用isset()或者empty()时，__isset()会被调用；当unset一个不存在或者不可访问的属性时，__unset()会被调用，否则直接unset该属性皆可。<br /><br /><strong>9. __set_state()<br /></strong><br /><span>用var_export()输出一个对象时，__set_state()会被调用，输出内容以该魔术方法的返回值为准。注：var_export()和var_dump()类似，只是var_export()输出的内容符合php语法。</span><font color="#ff0000"><span>注意使用方法：</span><br /></font>
<p><span style="font-size: 10pt">$test = new Test();</span><br /><span style="font-size: 10pt">$b = var_export($test, true);</span><br /><span style="font-size: 10pt">var_dump($b);</span></p>
<p><span style="font-size: 10pt">class Test {</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; public $a;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; public static function __set_state($array) {</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ab = new Test();</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ab-&gt;a = 10;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $ab;</span><br /><span style="color: red">&nbsp;&nbsp;</span>&nbsp;<span style="font-size: 10pt"> }</span><br /><span style="font-size: 10pt">} </span></p><br /><strong>10. __autoload($name)<br /><br /></strong>实例化一个对象时，如果对应的类不存在，则该方法被调用。注意：该方法是全局函数，参数是类的名称。<br /><br /><strong>11. __sleep() / __wakup()<br /><br /></strong>略。<br /><br /><br /><span style="font-size: 12pt"><strong>魔术常量：</strong></span><br /><br /><strong>1. __LINE__<br /></strong><br />返回文件中的当前行号。<br /><br /><strong>2. __FILE__<br /></strong><br />返回所在文件的完整路径。<br /><br /><strong>3. __FUNCTION__<br /></strong><br />返回所在函数名称。<br /><br /><strong>4. __CLASS__<br /></strong><br />返回所在类的名称。<br /><br /><strong>5. __METHOD__<br /></strong><br />返回所在类方法的名称。需要注意__METHOD__返回的是"class::function"的形式，而__FUNCTION__则返回"function"的形式。<br /><br /></div><img src ="http://www.cppblog.com/amazon/aggbug/157950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-10-10 12:18 <a href="http://www.cppblog.com/amazon/archive/2011/10/10/157950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP中引用的解释</title><link>http://www.cppblog.com/amazon/archive/2011/10/10/157941.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 10 Oct 2011 03:01:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/10/10/157941.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/157941.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/10/10/157941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/157941.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/157941.html</trackback:ping><description><![CDATA[<br />这篇随笔主要是对《PHP5中文手册》内容中"引用的解释"一文的摘要。阅读之后让我大致明白了引用在PHP语言中的用途和特性。<br /><br /><strong>1. PHP中引用的特性<br /><br /></strong>首先，PHP中的引用不是C的指针，可以把它想象成UNIX文件系统中对文件的链接，是变量的另外一个别名或者映射。例如：$b = &amp;$a中，$b和$a都只是一个变量名称，此操作使$b和$a都映射到同一个变量内容；$b = &amp;$c则是让$b重新映射到另外一个变量内容，与$a再无关系；unset($a)只是断开了$a到变量内容的映射，但变量内容并没有被释放，依然可以使用$b来访问，一旦$b也unset了，那么该变量内容在没有任何映射的情况下会被释放。<br /><br /><strong>2. 函数中global $a的作用<br /></strong><br />在函数中经常会见到global $a,$b这样的语句，其实质是对$_GLOBAL变量的一种引用，具体可以写成如下语句：<br />$a = &amp;$_GLOBAL['a'];<br />$b = &amp;$_GLOBAL['b'];<br />而$_GLOBAL['a']和$_GLOBAL['b']则分别对应全局作用域中$a和$b变量，在函数中对$a和$b的修改会触发函数外部$a和$b的变量内容的修改。<br />如果在函数内部做如下操作：<br />$c = array(1,2,3);<br />$a = &amp;$c;<br />那么实际上就是改变了$a的映射关系，之前与$_GLOBAL['a']的映射就断开了，再也无法修改函数外部$a的内容。此特性也同样作用在用引用传递函数参数的例子中。<br />另外，需要注意在函数中unset($a)不会真正释放变量内容，可以看做只是断开了函数内部$a的映射而已。<br /><br /><strong>3.函数的引用传递<br /></strong><br />引用传递的定义必须在函数定义中体现，在函数使用中，不要写成foo(&amp;$a)的样子，否则会报"Call-time pass-by-reference过时"的警报。<br />如下情况可以使用引用传递：<br />A. 变量，如foo($a)<br />B. New语句，如foo(new Action())<br />C. 函数的引用返回，如foo(bar())，其中bar()是函数，定义为：function &amp;bar() {$a = 5; return $a;}<br />其余情况不可作为引用传递，较常见的比如表达式、常量、无引用的函数返回。<br /><br /><strong>4.函数的引用返回<br /></strong><br />引用返回需要注意使用形式，在定义时如下：<br />function &amp;bar() {<br />&nbsp;&nbsp;&nbsp;$a = 5;<br />&nbsp;&nbsp;&nbsp;return $a;<br />}<br />在使用时如下：<br />$ret = &amp;bar();<br />也就是说，定义和使用时都需要加&amp;符号。<br /><br /><strong>5.对象的赋值传递<br /></strong><br />尤其需要注意的是，在PHP4和PHP5中对象资源的赋值传递是有区别的。<br />PHP4中：<br />$a = new Object() 实际上$a和new Object()的映射到不同对象实例，所以需要显式地使用$a = &amp; new Object()来进行引用赋值传递。<br />$b = $a 同上。<br />foo(new Object()) / foo($a)&nbsp;同上。<br />foo() {$a = new Object(); return $a} 同上。<br />PHP5中：<br />$a = new Object() 两者映射到同一对象，不需要使用引用符。<br />$b = $a 同上。<br />foo(new Object()) / foo($a) 同上。<br />foo() {$a = new Object(); return $a} 同上。<br />PS：在进行测试的时候，发现一个有趣的现象，$a = new Object(); $b = $a后，如果$a-&gt;attr = 12; $b-&gt;attr = 13，那么最后的结果竟然是$a-&gt;attr和$b-&gt;attr都等于13，而不是想象中的各自独立，笔者估计$a-&gt;attr和$b-&gt;attr并没有做深拷贝，仍是同一块内存的不同映射。该论点待考证。当然，如果是$a = new Object(); $b = &amp;$a; 则不存在该疑惑，因为从头到尾只有一个真实对象，$a和$b都只是映射而已。<br /><br /><strong>6.unset与=null<br /></strong><br />使用unset($a)与$a=null的结果是不一样的。如果该块内存只有$a一个映射，那么unset($a)与$a=null等价，该内存的引用计数变为0，被自动回收；如果该块内存有$a和$b两个映射，那么unset($a)将导致$a=null且$b不变的情况，而$a=null会导致$a=$b=null的情况。<br />原因：某变量赋值为null，将导致该变量对应的内存块的引用计数直接置为0，被自动回收。<br /><br /><br /><img src ="http://www.cppblog.com/amazon/aggbug/157941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-10-10 11:01 <a href="http://www.cppblog.com/amazon/archive/2011/10/10/157941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP常用函数【转载】</title><link>http://www.cppblog.com/amazon/archive/2011/10/08/157780.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sat, 08 Oct 2011 04:46:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/10/08/157780.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/157780.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/10/08/157780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/157780.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/157780.html</trackback:ping><description><![CDATA[<div><strong>原文出处：</strong><a href="http://blog.sina.com.cn/s/blog_5d8945610100i5fq.html"><strong>http://blog.sina.com.cn/s/blog_5d8945610100i5fq.html</strong></a><br /><br />
<p><strong><strong></strong>1.数组函数</strong></p>
<p><a href="http://www.w3school.com.cn/php/func_array_product.asp"><font color="#437b40">array_product()</font></a>&nbsp;<wbr> 计算数组中所有值的乘积。</p>
<p><a href="http://www.w3school.com.cn/php/func_array_search.asp"><font color="#437b40">array_search()</font></a>&nbsp;<wbr> 在数组中搜索给定的值，如果成功则返回相应的键名。</p>
<p><a href="http://www.w3school.com.cn/php/func_array_unique.asp"><font color="#437b40">array_unique()</font></a>&nbsp;<wbr> 删除数组中重复的值。</p>
<p><a href="http://www.w3school.com.cn/php/func_array_extract.asp"><font color="#437b40">extract()</font></a>&nbsp;<wbr> 从数组中将变量导入到当前的符号表。<br /><a href="http://www.w3school.com.cn/php/func_array_in_array.asp"><font color="#437b40">in_array()</font></a>&nbsp;<wbr>&nbsp;<wbr> 检查数组中是否存在指定的值。</p>
<p><a href="http://www.w3school.com.cn/php/func_array_count_values.asp"><font color="#437b40">array_count_values()</font></a>&nbsp;<wbr> 用于统计数组中所有值出现的次数。</p>
<p><a href="http://www.w3school.com.cn/php/func_array_key_exists.asp"><font color="#437b40">array_key_exists()</font></a>&nbsp;<wbr> 检查给定的键名或索引是否存在于数组中。</p>
<p><a href="http://www.w3school.com.cn/php/func_array_sum.asp"><font color="#437b40">array_sum()</font></a>&nbsp;<wbr> 计算数组中所有值的和。</p>
<p><strong>2.文件函数</strong></p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_basename.asp"><font color="#437b40">basename()</font></a>&nbsp;<wbr> 返回路径中的文件名部分。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_dirname.asp"><font color="#437b40">dirname()</font></a>&nbsp;<wbr> 返回路径中的目录名称部分。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_feof.asp"><font color="#437b40">feof()</font></a>&nbsp;<wbr> 测试文件指针是否到了文件结束的位置。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_fflush.asp"><font color="#437b40">fflush()</font></a>&nbsp;<wbr> 向打开的文件输出缓冲内容。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_file.asp"><font color="#437b40">file()</font></a>&nbsp;<wbr> 把文件读入一个数组中。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_file_exists.asp"><font color="#437b40">file_exists()</font></a>&nbsp;<wbr> 检查文件或目录是否存在。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_file_get_contents.asp"><font color="#437b40">file_get_contents()</font></a>&nbsp;<wbr> 将文件读入字符串。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_file_put_contents.asp"><font color="#437b40">file_put_contents</font></a>&nbsp;<wbr> 将字符串写入文件。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_filesize.asp"><font color="#437b40">filesize()</font></a>&nbsp;<wbr> 返回文件大小。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_filetype.asp"><font color="#437b40">filetype()</font></a>&nbsp;<wbr> 返回文件类型。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_flock.asp"><font color="#437b40">flock()</font></a>&nbsp;<wbr> 锁定或释放文件。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_is_dir.asp"><font color="#437b40">is_dir()</font></a>&nbsp;<wbr>判断指定的文件名是否是一个目录。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_is_executable.asp"><font color="#437b40">is_executable()</font></a>&nbsp;<wbr> 判断文件是否可执行。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_parse_ini_file.asp"><font color="#437b40">parse_ini_file()</font></a>&nbsp;<wbr> 解析一个配置文件。</p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_tempnam.asp"><strong><font color="#22b14c">tempnam()</font></strong></a><strong><font color="#22b14c">&nbsp;<wbr> 创建唯一的临时文件。</font></strong></p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_tmpfile.asp"><strong><font color="#22b14c">tmpfile()</font></strong></a><strong><font color="#22b14c">&nbsp;<wbr> 建立临时文件。</font></strong></p>
<p><a href="http://www.w3school.com.cn/php/func_filesystem_touch.asp"><font color="#437b40">touch()</font></a>&nbsp;<wbr> 设置文件的访问和修改时间。<wbr></p>
<p><strong>3.字符串函数</strong></p>
<p><a href="http://www.w3school.com.cn/php/func_string_addslashes.asp"><font color="#437b40">addslashes()</font></a>&nbsp;<wbr> 在指定的预定义字符前添加反斜杠。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_chr.asp"><font color="#437b40">chr()</font></a>&nbsp;<wbr> 从指定的 ASCII 值返回字符。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_convert_uuencode.asp"><font color="#437b40">convert_uuencode()</font></a>&nbsp;<wbr> 使用 uuencode 算法对字符串进行编码。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_convert_uudecode.asp"><font color="#437b40">convert_uudecode()</font></a>&nbsp;<wbr> 对 uuencode 编码的字符串进行解码。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_crc32.asp"><font color="#437b40">crc32()</font></a>&nbsp;<wbr> 计算一个字符串的 32-bit CRC。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_crypt.asp"><font color="#437b40">crypt()</font></a>&nbsp;<wbr> 单向的字符串加密法 (hashing)。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_explode.asp"><font color="#437b40">explode()</font></a>&nbsp;<wbr> 把字符串打散为数组。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_htmlentities.asp"><font color="#437b40">htmlentities()</font></a>&nbsp;<wbr> 把字符转换为 HTML 实体。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_htmlspecialchars_decode.asp"><font color="#437b40">htmlspecialchars_decode()</font></a>&nbsp;<wbr> 把一些预定义的 HTML 实体转换为字符。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_htmlspecialchars.asp"><font color="#437b40">htmlspecialchars()</font></a>&nbsp;<wbr>&nbsp;<wbr> 把一些预定义的字符转换为 HTML 实体。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_implode.asp"><font color="#437b40">implode()</font></a>&nbsp;<wbr> 把数组元素组合为一个字符串。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_md5.asp"><font color="#437b40">md5()</font></a>&nbsp;<wbr> 计算字符串的 MD5 散列。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_md5_file.asp"><font color="#437b40">md5_file()</font></a>&nbsp;<wbr> 计算文件的 MD5 散列。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_nl2br.asp"><font color="#437b40">nl2br()</font></a>&nbsp;<wbr> 在字符串中的每个新行之前插入 HTML 换行符。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_number_format.asp"><font color="#437b40">number_format()</font></a>&nbsp;<wbr> 通过千位分组来格式化数字。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_ord.asp"><font color="#437b40">ord()</font></a>&nbsp;<wbr> 返回字符串第一个字符的 ASCII 值。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_parse_str.asp"><font color="#437b40">parse_str()</font></a>&nbsp;<wbr> 把查询字符串解析到变量中。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_str_ireplace.asp"><font color="#437b40">str_ireplace()</font></a>&nbsp;<wbr> 替换字符串中的一些字符。（对大小写不敏感）</p>
<p><a href="http://www.w3school.com.cn/php/func_string_str_shuffle.asp"><font color="#437b40">str_shuffle()</font></a>&nbsp;<wbr> 随机地打乱字符串中的所有字符。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_str_split.asp"><font color="#437b40">str_split()</font></a>&nbsp;<wbr> 把字符串分割到数组中。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_str_word_count.asp"><font color="#437b40">str_word_count()</font></a>&nbsp;<wbr> 计算字符串中的单词数。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_strcasecmp.asp"><font color="#437b40">strcasecmp()</font></a>&nbsp;<wbr> 比较两个字符串。（对大小写不敏感）</p>
<p><a href="http://www.w3school.com.cn/php/func_string_strchr.asp"><font color="#437b40">strchr()</font></a>&nbsp;<wbr> 搜索字符串在另一字符串中的第一次出现。strstr() 的别名</p>
<p><a href="http://www.w3school.com.cn/php/func_string_strcmp.asp"><font color="#437b40">strcmp()</font></a>&nbsp;<wbr> 比较两个字符串。（对大小写敏感）</p>
<p><a href="http://www.w3school.com.cn/php/func_string_strip_tags.asp"><font color="#437b40">strip_tags()</font></a>&nbsp;<wbr> 剥去 HTML、XML 以及 PHP 的标签。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_stripslashes.asp"><font color="#437b40">stripslashes()</font></a>&nbsp;<wbr> 删除由 addslashes() 函数添加的反斜杠。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_stripos.asp"><font color="#437b40">stripos()</font></a>&nbsp;<wbr> 返回字符串在另一字符串中第一次出现的位置(大小写不敏感)</p>
<p><a href="http://www.w3school.com.cn/php/func_string_strpos.asp"><font color="#437b40">strpos()</font></a>&nbsp;<wbr> 返回字符串在另一字符串中首次出现的位置（对大小写敏感）</p>
<p><a href="http://www.w3school.com.cn/php/func_string_strrev.asp"><font color="#437b40">strrev()</font></a>&nbsp;<wbr> 反转字符串。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_strtolower.asp"><font color="#437b40">strtolower()</font></a>&nbsp;<wbr> 把字符串转换为小写。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_strtoupper.asp"><font color="#437b40">strtoupper()</font></a>&nbsp;<wbr> 把字符串转换为大写。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_substr.asp"><font color="#437b40">substr()</font></a>&nbsp;<wbr> 返回字符串的一部分。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_substr_replace.asp"><font color="#437b40">substr_replace()</font></a>&nbsp;<wbr> 把字符串的一部分替换为另一个字符串。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_ucwords.asp"><font color="#437b40">ucwords()</font></a>&nbsp;<wbr> 把字符串中每个单词的首字符转换为大写。</p>
<p><strong><font color="#22b14c">parse_url(); 解析URL，返回数组，[HOST]="ABC.COM";[PATH]="INDEX.PHP"</font></strong></p>
<p><strong>4.字符串加密</strong></p>
<p><strong>md5</strong></p>
<p><strong>urlencode</strong></p>
<p><strong>urldecode</strong></p>
<p><strong>base64_encode</strong></p>
<p><strong>base64_decode</strong></p>
<p><a href="http://www.w3school.com.cn/php/func_string_convert_uuencode.asp"><font color="#437b40">convert_uuencode()</font></a>&nbsp;<wbr> 使用 uuencode 算法对字符串进行编码。</p>
<p><a href="http://www.w3school.com.cn/php/func_string_convert_uudecode.asp"><font color="#437b40">convert_uudecode()</font></a>&nbsp;<wbr> 对 uuencode 编码的字符串进行解码。</p>
<p><strong>5.正则表达式</strong></p>
<p>[^a-z]&nbsp;<wbr> a-z之外的字符</p>
<p>str_replace();</p>
<p>ereg_replace();</p>
<p>preg_match();</p>
<p>preg_match_all();</p>
<p>preg_replace();</p>
<p>preg_split();</p>
<p><strong>6.数据验证</strong></p>
<p>is_numeric();</p>
<p>is_bool();</p>
<p>is_string();</p>
<p>intval();&nbsp;<wbr> 转化为整数</p>
<p>strval();&nbsp;<wbr> 转化为字符串</p>
<p>settype($input,integer); 设置类型</p>
<p><strong>7.缓冲区控制函数</strong></p>
<p><strong>flush</strong> &#8212; 刷新输出缓冲区<br />保存在输出缓冲区的内容会被发送到浏览器<br /><strong>ob_start</strong> &#8212; 打开输出缓冲区<br />这样所有的输出信息不在直接发送到浏览器，而是保存在输出缓冲区里面<br /><strong>ob_get_contents</strong> &#8212; 返回输出缓冲区的内容<br />如果你想以后处理输出的内容，可以调用这个函数保留一个备份<br /><strong>ob_get_length</strong> &#8212; 返回输出缓冲区的内容长度<br /><strong>ob_end_flush</strong> &#8212; 结束（发送）输出缓冲区的内容，关闭输出缓冲区<br /><strong>ob_end_clean</strong> &#8212; 删除（放弃）输出缓冲区的内容，关闭输出缓冲区<br />如果你的程序发现输出内容有问题，可以放弃所有输出内容，可以防止泄漏某些秘密信息<br /><strong>ob_implicit_flush</strong> &#8212; 打开或关闭直接刷新<br />打开后，每个脚本输出都直接发送到浏览器，不再需要调用 flush(),</p></div><img src ="http://www.cppblog.com/amazon/aggbug/157780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-10-08 12:46 <a href="http://www.cppblog.com/amazon/archive/2011/10/08/157780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>50点提高PHP编程效率【转载】</title><link>http://www.cppblog.com/amazon/archive/2011/10/08/157777.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sat, 08 Oct 2011 04:44:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/10/08/157777.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/157777.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/10/08/157777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/157777.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/157777.html</trackback:ping><description><![CDATA[<strong>原文出处：</strong><a href="http://www.kuqin.com/web/20110726/92745.html"><strong>http://www.kuqin.com/web/20110726/92745.html</strong></a><br /><br />0、用单引号代替双引号来包含字符串，这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量，单引号则不会，注意：只有echo能这么做，它是一种可以把多个字符串当作参数的&#8220;函数&#8221;(译注：PHP手册中说echo是语言结构，不是真正的函数，故把函数加上了双引号)。 <br /><span style="color: red">PS：在单引号中，PHP不会自动搜寻变量、转义字符等，因此效率上快很多。</span><br />
<p>1、如果能将类的方法定义成static，就尽量定义成static，它的速度会提升将近4倍。<br /><span style="color: red">PS：事实上，function、method、static method的速度不会有太大差异。具体可见&#8220;<a id="viewpost1_TitleUrl" href="http://www.cppblog.com/amazon/archive/2011/09/30/157213.html"><font color="#808080"><span style="color: red">PHP函数的实现原理及性能分析【转载】</span></font></a></span><span style="color: red">&#8221;</span><span style="color: red">一文。</span></p>
<p>2、$row[&#8217;id&#8217;] 的速度是$row[id]的7倍。<br /><span style="color: red">PS：不太懂，貌似差异只有后者会先判断id这个宏是否存在，如果不存在则自动转变为字符串。</span></p>
<p>3、echo 比 print 快，并且使用echo的多重参数(译注：指用逗号而不是句点)代替字符串连接，比如echo $str1,$str2。</p>
<p>4、在执行for循环之前确定最大循环数，不要每循环一次都计算最大值，最好运用foreach代替。<br /><span style="color: red">PS：像count、strlen这样的操作其实是O(1)的，因此不会带来太多消耗，当然避免每次循环都计算是比较好的策略。最好用foreach代替for，这个效率更高，如果考虑到foreach($array as $var)每次拷贝的消耗，可以使用foreach($array as &amp;$var)这样的引用。</span></p>
<p>5、注销那些不用的变量尤其是大数组，以便释放内存。<br /><span style="color: red">PS：如果没有记错的话，unset($array)不会立刻释放内存，但随时释放是个好习惯。</span></p>
<p>6、尽量避免使用__get，__set，__autoload。</p>
<p>7、require_once()代价昂贵。<br /><span style="color: red">PS：require_once和include_once需要判重，因此效率上要低，但是5.2版本后效率问题已经基本解决。</span></p>
<p>8、include文件时尽量使用绝对路径，因为它避免了PHP去include_path里查找文件的速度，解析操作系统路径所需的时间会更少。<br /><span style="color: red">PS：支持，尽量少用iniset()来设置include_path。</span></p>
<p>9、如果你想知道脚本开始执行(译注：即服务器端收到客户端请求)的时刻，使用$_SERVER['REQUEST_TIME']要好于time()。<br /><span style="color: red">PS：$_SERVER['REQUEST_TIME']保存了发起该请求时刻的时间戳，而time()则返回当前时刻的Unix时间戳。</span></p>
<p>10、函数代替正则表达式完成相同功能。<br /><span style="color: red">PS：这种函数是指strtok、strstr、strpos、str_replace、substr、explode、implode等等。</span></p>
<p>11、str_replace函数比preg_replace函数快，但strtr函数的效率是str_replace函数的四倍。<br /><span style="color: red">PS：字符串操作比正则替换要快。</span></p>
<p>12、如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只写一行代码接受数组作为查询和替换的参数。<br /><span style="color: red">PS：需要考虑到内置函数和用户自定义函数的开销差异，恐怕这种做法得不偿失。</span><br /></p>
<p>13、使用选择分支语句(译注：即switch case)好于使用多个if，else if语句。<br /><span style="color: red">PS：php中switch支持数值和字符串变量，比C的switch要好用，建议使用。</span></p>
<p>14、用@屏蔽错误消息的做法非常低效，极其低效。<br /><span style="color: red">PS：有什么替代方法吗？没有的话还是不得不用的&#8230;&#8230;</span></p>
<p>15、打开apache的mod_deflate模块，可以提高网页的浏览速度。</p>
<p>16、数据库连接当使用完毕时应关掉，不要用长连接。<br /><span style="color: red">PS：在连接之前，最好设置一下相应的超时机制，例如链接超时、读写超时、等待超时等。</span></p>
<p>17、错误消息代价昂贵。</p>
<p>18、在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。</p>
<p>19、递增一个全局变量要比递增一个局部变量慢2倍。</p>
<p>20、递增一个对象属性(如：$this-&gt;prop++)要比递增一个局部变量慢3倍。</p>
<div class="word">
<p>21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。</p>
<p>22、仅定义一个局部变量而没在函数中调用它，同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。</p>
<p>23、方法调用看来与类中定义的方法的数量无关，因为我(在测试方法之前和之后都)添加了10个方法，但性能上没有变化。</p>
<p>24、派生类中的方法运行起来要快于在基类中定义的同样的方法。</p>
<p>25、调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。</p>
<p>26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。</p>
<p>27、除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。</p>
<p>28、尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运算码 (OP code)的缓存很有用，使得脚本不必为每个请求做重新编译。</p>
<p>29、当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在zval 结构(C的内置数据结构，用于存储PHP变量)中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步骤，如字母小写化(译注：指函数名小写化，PHP不区分函数名大小写)、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset() 技巧加速执行你的代码。</p>
<p>　　(举例如下)</p>
<p>　　if (strlen($foo) &lt; 5) { echo &#8220;Foo is too short&#8221;$$ }</p>
<p>　　(与下面的技巧做比较)</p>
<p>　　if (!isset($foo{5})) { echo &#8220;Foo is too short&#8221;$$ }</p>
<p>　　调用isset()恰巧比strlen()快，因为与后者不同的是，isset()作为一种语言结构，意味着它的执行不需要函数查找和字母小写化。也就是说，实际上在检验字符串长度的顶层代码中你没有花太多开销。<br /><span style="color: red">PS：长见识了。</span><br /></p>
<p>30、当执行变量$i的递增或递减时，$i++会比++$i慢一些。这种差异是PHP特有的，并不适用于其他语言，所以请不要修改你的C或Java代码并指望它们能立即变快，没用的。++$i更快是因为它只需要3条指令(opcodes)，$i++则需要4条指令。后置递增实际上会产生一个临时变量，这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种，正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意，因为并不是所有的指令优化器都会做同样的优化处理，并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。</p>
<p>31、并不是事必面向对象(OOP)，面向对象往往开销很大，每个方法和对象调用都会消耗很多内存。</p>
<p>32、并非要用类实现所有的数据结构，数组也很有用。</p>
<p>33、不要把方法细分得过多，仔细想想你真正打算重用的是哪些代码?</p>
<p>34、当你需要时，你总能把代码分解成方法。<br /><span style="color: red">PS：分解成方法要适当，行数少使用频率高的方法尽量用直接写代码，可以减少函数堆栈开销；且方法嵌套不宜过深，否则大大影响PHP的运行效率。</span></p>
<p>35、尽量采用大量的PHP内置函数。</p></div>
<div class="word">
<p>36、如果在代码中存在大量耗时的函数，你可以考虑用C扩展的方式实现它们。</p>
<p>37、评估检验(profile)你的代码。检验器会告诉你，代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序，评估检验总体上可以显示出代码的瓶颈。</p>
<p>38、mod_zip可作为Apache模块，用来即时压缩你的数据，并可让数据传输量降低80%。</p>
<p>39、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下，尽量用file_get_contents，因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;<br /><span style="color: red">PS：这个要记住，尽量使用file_get_contents和file_put_contents，不需要自己判断文件句柄打开是否成功。</span></p>
<p>40、尽量的少进行文件操作，虽然PHP的文件操作效率也不低的;</p>
<p>41、优化Select SQL语句，在可能的情况下尽量少的进行Insert、Update操作(在update上，我被恶批过);</p>
<p>42、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数，浪费了本可以写出一个自定义函数的时间，经验问题啊!);<br /><span style="color: red">PS：内置函数比用户自定义函数效率高了将近一个数量级。</span></p>
<p>43、循环内部不要声明变量，尤其是大变量：对象(这好像不只是PHP里面要注意的问题吧?);<br /><span style="color: red">PS：这个必须的，变量过多或者过大时，每次重分配的开销就无法忽略。</span></p>
<p>44、多维数组尽量不要循环嵌套赋值;</p>
<p>45、在可以用PHP内部字符串操作函数的情况下，不要用正则表达式;</p>
<p>46、foreach效率更高，尽量用foreach代替while和for循环;</p>
<p>47、用单引号替代双引号引用字符串;<br /><span style="color: red">PS：晕，这个不就是第一条吗？</span></p>
<p>48、&#8220;用i+=1代替i=i+1。符合c/c++的习惯，效率还高&#8221;;</p>
<p>49、对global变量，应该用完就unset()掉;</p></div><br /><img src ="http://www.cppblog.com/amazon/aggbug/157777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-10-08 12:44 <a href="http://www.cppblog.com/amazon/archive/2011/10/08/157777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP访问MySQL查询超时处理【转载】</title><link>http://www.cppblog.com/amazon/archive/2011/09/30/157217.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Fri, 30 Sep 2011 03:50:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/09/30/157217.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/157217.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/09/30/157217.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/157217.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/157217.html</trackback:ping><description><![CDATA[<p><strong>转载出处：</strong><a href="http://blog.csdn.net/heiyeshuwu/article/details/5869813"><strong>http://blog.csdn.net/heiyeshuwu/article/details/5869813</strong></a><br /><br />PHP连接MySQL主要是使用Mysql提供的 libmysqlclient 的客户端库，同时也延伸出来 mysql 和&nbsp; mysqli 两套PHP的扩展，相对来说 mysqli 比 mysql 更好，更稳定。目前两个客户端扩展库连接超时可以设置选项来操作，比如mysqli：</p>
<p>&nbsp;</p>
<blockquote>
<p><span style="font-family: Arial; font-size: 10pt">&lt;?php</span><br /><span style="font-family: Arial; font-size: 10pt">//创建对象</span><br /><span style="font-family: Arial; font-size: 10pt">$mysqli = mysqli_init();</span></p>
<p><span style="font-family: Arial; font-size: 10pt">//设置超时选项</span><br /><span style="font-family: Arial; font-size: 10pt">$mysqli-&gt;options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);</span></p>
<p><span style="font-family: Arial; font-size: 10pt">//连接</span><br /><span style="font-family: Arial; font-size: 10pt">$mysqli-&gt;real_connect('localhost', 'my_user', 'my_password', 'world');</span></p>
<p><span style="font-family: Arial; font-size: 10pt">//如果超时或者其他连接失败打印错误信息</span><br /><span style="font-family: Arial; font-size: 10pt">if (mysqli_connect_errno()) {</span><br /><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp; printf("Connect failed: %s/n", mysqli_connect_error());</span><br /><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp; exit();</span><br /><span style="font-family: Arial; font-size: 10pt">}</span><br /><span style="font-family: Arial; font-size: 10pt">//成功输出连接信息</span><br /><span style="font-family: Arial; font-size: 10pt">printf ("Connection: %s/n.", $mysqli-&gt;host_info);</span></p>
<p><span style="font-family: Arial; font-size: 10pt">$mysqli-&gt;close();</span><br /><span style="font-family: Arial; font-size: 10pt">?&gt; </span></p></blockquote>
<p>&nbsp;</p>
<p>这个是连接超时，但是有些时候我们需要查询读写超时，比如说我们一个数据库压力很大，或者连接很多，那么数据库查询就很缓慢，但是我希望某些不重要的数据，比如说文章点击数这种如果查询超时了就不显示，至少能够保证主体页面正确显示，但是查遍PHP手册没有发现这个操作选项或者函数。手册里只有这么四个选项：</p>
<p>&nbsp;</p>
<p><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_1283878334644u.jpg" width="558" height="169" /></p>
<p>&nbsp;</p>
<p>跟踪 mysqli 的扩展源代码发现它底层调用的是 libmysqlclient 的 mysql_options：</p>
<p><span style="font-size: small"><span style="font-family: Calibri">php-5.2.8/ext/mysqli/mysqli_api.c</span></span></p>
<p><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_1283878334dCK9.jpg" width="603" height="467" /></p>
<p>&nbsp;</p>
<p>并且在mysqli的PHP扩展中就只导出了几个变量：</p>
<p><span style="font-size: small"><span style="font-family: Calibri">php-5.2.8/ext/mysqli/mysqli.c</span></span></p>
<p><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_1283878334NNI3.jpg" width="790" height="88" /></p>
<p>&nbsp;</p>
<p>大概看了一下 libmysqlclient 的代码，发现其实它自带是有读写超时设置的：</p>
<p><span style="font-size: small"><span style="font-family: Calibri">mysql-5.1.30/sql-common/client.c</span></span></p>
<p><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_1283878334cC8A.jpg" width="558" height="224" /></p>
<p>&nbsp;</p>
<p>因为它自己定义了很多操作选项，只是php扩展里没有：</p>
<p><span style="font-size: small"><span style="font-family: Calibri">mysql-5.1.30/include/mysql.h</span></span></p>
<p><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_1283878334PxC2.jpg" width="558" height="171" /></p>
<p>&nbsp;</p>
<p><span style="font-family: Arial">看看mysql中的读写超时是如何实现的：</span></p>
<p><span style="font-size: small"><span style="font-family: Calibri">mysql-5.1.30/sql-common/client.c</span></span></p>
<p><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_1283878334QFRm.jpg" width="558" height="116" /></p>
<p>&nbsp;</p>
<p><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_12838783347615.jpg" width="471" height="181" /></p>
<p>&nbsp;</p>
<p><span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">读写超时真正操作的地方，<span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">超时处理这里重试了两次，还是写死了：</span></span></span></span></p>
<p><span style="font-size: small"><span style="font-family: Calibri">mysql-5.1.30/sql/net_serv.cc</span></span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_1283878334BodB.jpg" width="521" height="318" /></span></span></p>
<p><span style="font-size: small"></span></p>
<p><span style="font-size: small"></span></p>
<p><span style="font-size: small"></span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_1283878335OiD5.jpg" width="687" height="555" /></span></span></p>
<p><span style="font-size: small"></span></p>
<p><span style="font-size: small"></span></p>
<p><span style="font-size: small"></span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"><br /><strong>现在基本得出了结论：</strong></span></span></p>
<p><span style="font-size: small"><span style="font-family: Calibri">
<p style="text-align: left" align="left"><span style="font-family: Arial; color: black; font-size: 10pt">按照上面查看代码来看，目前PHP针对MySQL查询超时以下限制：</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt 12pt" align="left"><span style="font-family: Arial; color: #984806; font-size: 10pt">1. 超时设置单位为秒，最少配置1秒</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt 12pt" align="left"><span style="font-family: Arial; color: #984806; font-size: 10pt">2. 但mysql底层的read会重试两次，所以实际会是 3 秒</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt 12pt" align="left">&nbsp;</p>
<p style="text-align: left; margin: 0cm 0cm 0pt 12pt" align="left"><span style="font-family: Arial; color: #984806; font-size: 10pt">重试两次 +　自身一次 = 3倍超时时间。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Arial; font-size: 10pt">那么就是说最少超时时间是</span><span style="font-family: Arial; font-size: 10pt">3</span><span style="font-family: Arial; font-size: 10pt">秒，不会低于这个值，对于大部分应用来说可以接受，但是对于小部分应用需要优化。</span></span></span></p>
<p><span style="font-size: small"></span></p>
<p><span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">现在我们来看看如果我们自己要设置超时，我们自己压入 <span style="font-family: Arial; color: #984806; font-size: 10pt">MYSQL_OPT_READ_TIMEOUT <span style="font-family: Arial; color: #000000; font-size: 10pt">也是可以达到读写超时效果的，写一段代码来测试一下：</span></span></span></span></p>
<p><span style="font-size: small"></span></p>
<p><span style="font-size: small"></span></p>
<p><span style="font-size: small"></span></p>
<blockquote>
<p><span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">&lt;?php<br /></span><span style="font-family: Arial; font-size: 10pt">//自己定义读写超时常量<br /></span><span style="font-family: Arial; font-size: 10pt">if (!defined('MYSQL_OPT_READ_TIMEOUT')) {<br /></span><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; define('MYSQL_OPT_READ_TIMEOUT',&nbsp; 11);<br /></span><span style="font-family: Arial; font-size: 10pt">}<br /></span><span style="font-family: Arial; font-size: 10pt">if (!defined('MYSQL_OPT_WRITE_TIMEOUT')) {<br /></span><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; define('MYSQL_OPT_WRITE_TIMEOUT', 12);<br /></span><span style="font-family: Arial; font-size: 10pt">}</span></span></p>
<p><span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">//设置超时<br /></span><span style="font-family: Arial; font-size: 10pt">$mysqli = mysqli_init();<br /></span><span style="font-family: Arial; font-size: 10pt">$mysqli-&gt;options(MYSQL_OPT_READ_TIMEOUT, 3);<br /></span><span style="font-family: Arial; font-size: 10pt">$mysqli-&gt;options(MYSQL_OPT_WRITE_TIMEOUT, 1);</span></span></p>
<p><span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">//连接数据库<br /></span><span style="font-family: Arial; font-size: 10pt">$mysqli-&gt;real_connect("localhost", "root", "root", "test");<br /></span><span style="font-family: Arial; font-size: 10pt">if (mysqli_connect_errno()) {<br /></span><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp; printf("Connect failed: %s/n", mysqli_connect_error());<br /></span><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp; exit();<br /></span><span style="font-family: Arial; font-size: 10pt">}</span></span></p>
<p><span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">//执行查询 sleep 1秒不超时<br /></span><span style="font-family: Arial; font-size: 10pt">printf("Host information: %s/n", $mysqli-&gt;host_info);<br /></span><span style="font-family: Arial; font-size: 10pt">if (!($res=$mysqli-&gt;query('select sleep(1)'))) {<br /></span><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp; echo "query1 error: ". $mysqli-&gt;error ."/n";<br /></span><span style="font-family: Arial; font-size: 10pt">} else {<br /></span><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp; echo "Query1: query success/n";<br /></span><span style="font-family: Arial; font-size: 10pt">}</span></span></p>
<p><span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">//执行查询 sleep 9秒会超时<br /></span><span style="font-family: Arial; font-size: 10pt">if (!($res=$mysqli-&gt;query('select sleep(9)'))) {<br /></span><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp; echo "query2 error: ". $mysqli-&gt;error ."/n";<br /></span><span style="font-family: Arial; font-size: 10pt">} else {<br /></span><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp; echo "Query2: query success/n";<br /></span><span style="font-family: Arial; font-size: 10pt">}</span></span></p>
<p><span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">$mysqli-&gt;close();<br /></span><span style="font-family: Arial; font-size: 10pt">echo "close mysql connection/n";<br /></span><span style="font-family: Arial; font-size: 10pt">?&gt;</span><span style="font-family: Arial"><br /></span></span></p></blockquote>
<p><span style="font-size: small"><span style="font-family: Calibri"><br /></span><span style="font-family: Calibri; font-size: 10pt">查看上面代码的执行结果，验证了上面的观点，第一个查询成功了，第二个查询连接被断开了：</span></span></p>
<p><span style="font-size: small"></span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_12838794166woQ.jpg" width="485" height="70" /></span></span></p>
<p><span style="font-size: small"></span></p>
<p>&nbsp;&nbsp;</p>
<p>基本上到这里就基本能够解决PHP在针对MySQL读写查询操作超时的处理了，希望对你有帮助。<br /><br /><br /><span style="color: red">// #####################################################</span><br /><span style="color: red">// #####################################################</span><br /><br /><span style="color: red">本人按照作者的方法编代码，运行时在$mysqli-&gt;options(MYSQL_OPT_READ_TIMEOUT, 3);这一步就返回false了，实际查询时READ_TIMEOUT也没有发挥作用。后来看php-5.3.8\php-5.3.8\ext\mysqli\mysqli_api.c源代码时发现PHP_FUNCTION(mysqli_options)里有一行代码：</span><br /><span style="color: red">expected_type = mysqli_options_get_option_zval_type(mysql_option);</span><br /><span style="color: red">这个函数的作用是判断options值类型，其中有一段：</span><br /><span style="color: red">#ifdef MYSQL_OPT_READ_TIMEOUT</span><br /><span style="color: red">case MYSQL_OPT_READ_TIMEOUT:</span><br /><span style="color: red">case MYSQL_OPT_WRITE_TIMEOUT:</span><br /><span style="color: red">case MYSQL_OPT_GUESS_CONNECTION:</span><br /><span style="color: red">case MYSQL_OPT_USE_EMBEDDED_CONNECTION:</span><br /><span style="color: red">case MYSQL_OPT_USE_REMOTE_CONNECTION:</span><br /><span style="color: red">case MYSQL_SECURE_AUTH:</span><br /><span style="color: red">#endif /* MySQL 4.1.1 */</span><br /><span style="color: red">.........</span><br /><span style="color: red">return IS_LONG;</span><br /><span style="color: red">.........</span><br /><span style="color: red">default:</span><br /><span style="color: red">return IS_NULL;</span><br /><br /><span style="color: red">貌似由于没有定义MYSQL_OPT_READ_TIMEOUT这个宏，所以options等于MYSQL_OPT_READ_TIMEOUT时被归到IS_NULL的返回结果中了，此时PHP_FUNCTION(mysqli_options)会执行如下结果：<br /></span><span style="color: red"><span style="color: red">switch (expected_type) {</span><br /><span style="color: red">case IS_STRING:</span><br /><span style="color: red">&nbsp;&nbsp;&nbsp;ret = mysql_options(mysql-&gt;mysql, mysql_option, Z_STRVAL_PP(mysql_value));</span><br /><span style="color: red">&nbsp;&nbsp;&nbsp;break;</span><br /><span style="color: red">case IS_LONG:</span><br /><span style="color: red">&nbsp;&nbsp;&nbsp;l_value = Z_LVAL_PP(mysql_value);</span><br /><span style="color: red">&nbsp;&nbsp;&nbsp;ret = mysql_options(mysql-&gt;mysql, mysql_option, (char *)&amp;l_value);</span><br /><span style="color: red">&nbsp;&nbsp;&nbsp;break;</span><br /><span style="color: red">default:</span><br /><span style="color: red">&nbsp;&nbsp;&nbsp;ret = 1;</span><br /><span style="color: red">&nbsp;&nbsp;&nbsp;break;</span><br /><span style="color: red">}<br /></span><br />也就是说，不会执行mysql_options()方法，而是直接返回false。</span><br /><br /><br /><br /><br /></p><img src ="http://www.cppblog.com/amazon/aggbug/157217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-09-30 11:50 <a href="http://www.cppblog.com/amazon/archive/2011/09/30/157217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP函数的实现原理及性能分析【转载】</title><link>http://www.cppblog.com/amazon/archive/2011/09/30/157213.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Fri, 30 Sep 2011 03:13:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2011/09/30/157213.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/157213.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2011/09/30/157213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/157213.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/157213.html</trackback:ping><description><![CDATA[<h4><span style="font-size: 10pt">转载出处：</span><a href="http://www.cnblogs.com/ghj1976/archive/2010/08/27/1809766.html"><span style="font-size: 10pt">http://www.cnblogs.com/ghj1976/archive/2010/08/27/1809766.html</span></a></h4>
<h4>前言</h4>
<h4></h4>
<p>在任何语言中，函数都是最基本的组成单元。对于php的函数，它具有哪些特点？函数调用是怎么实现的？php函数的性能如何，有什么使用建议？<br />本文将从原理出发进行分析结合实际的性能测试尝试对这些问题进行回答，在了解实现的同时更好的编写php程序。同时也会对一些常见的php函数进行介绍。 
<h4><a name="php函数的分类"></a>php函数的分类</h4>
<h4></h4>
<p>在php中，横向划分的话，函数分为两大类： user function(用户函数) 和internal function（内置函数）。<br />前者就是用户在程序中自定义的一些函数和方法，后者则是php本身提供的各类库函数（比如sprintf、array_push等）。<br />用户也可以通过扩展的方法来编写库函数，这个将在后面介绍。<br />对于user function，又可以细分为function（函数）和method（类方法），本文中将就这三种函数分别进行分析和测试。 
<h4><a name="php函数的实现"></a>php函数的实现</h4>
<h4></h4>
<p>一个php函数最终是如何执行，这个流程是怎么样的呢？ 
<p>要回答这个问题，我们先来看看php代码的执行所经过的流程。 
<p><img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_128279258310WE.jpg" width="232" height="551" /> 
<p>从图1可以看到，php实现了一个典型的动态语言执行过程：拿到一段代码后，经过词法解析、语法解析等阶段后，<br />源程序会被翻译成一个个指令(opcodes)，然后ZEND虚拟机顺次执行这些指令完成操作。Php本身是用c实现的，<br />因此最终调用的也都是c的函数，实际上，我们可以把php看做是一个c开发的软件。<br />通过上面描述不难看出，php中函数的执行也是被翻译成了opcodes来调用，每次函数调用实际上是执行了一条或多条指令。 
<p>对于每一个函数，zend都通过以下的数据结构来描述 <pre><span style="color: red">typedef union _zend_function {
zend_uchar type;      /* MUST be the first element of this struct! */
struct {
zend_uchar type;  /* never used */
char *function_name;
zend_class_entry *scope;
zend_uint fn_flags;
union _zend_function *prototype;
zend_uint num_args;
zend_uint required_num_args;
zend_arg_info *arg_info;
zend_bool pass_rest_by_reference;
unsigned char return_reference;
} common;
zend_op_array op_array;
zend_internal_function internal_function;
} zend_function;
typedef struct _zend_function_state {
HashTable *function_symbol_table;
zen</span><span style="color: red">d_function *function;
</span><span style="color: red"> void *reserved[ZEND_MAX_R</span><span style="color: red">ESERVED_RESOURCES]</span><span style="color: red">;</span><span style="color: red">
}</span><span style="color: red"> </span>zend_function_state;</pre><pre></pre>
<p><span style="font-family: Arial">其中：<br />type标明了函数的类型：用户函数、内置函数、重载函数。<br />Common中包含函数的基本信息，包括函数名，参数信息，</span><span style="font-family: Arial">函数标志（普通函数、静态方法、抽象方法）等内容。<br />另外，对于用户函数，还有一个函数符号表，记录了内部变量等，这个将在后面详述。 </span><span style="font-family: Arial"><br />Zend维护了一个全局function_table，这是一个大的hash表。函数调用的时候会首先根据函数名从表中找到对应的zend_function。<br /></span><span style="font-family: Arial">当进行函数调用时候，虚拟机会根据type的不同决定调用方法， </span><strong style="font-family: Arial">不同类型的函数，其执行原理是不相同的</strong> 。 </p>
<h5><a name="内置函数"></a>内置函数</h5>
<p>内置函数，其本质上就是真正的c函数，每一个内置函数，php在最终编译后都会展开成为一个名叫zif_xxxx的function，比如我们常见的sprintf，<br />对应到底层就是zif_sprintf。Zend在执行的时候，如果发现是内置函数，则只是简单的做一个转发操作。 
<p>Zend提供了一系列的api供调用，包括参数获取、数组操作、内存分配等。内置函数的参数获取，通过zend_parse_parameters方法来实现，<br />对于数组、字符串等参数，zend实现的是浅拷贝，因此这个效率是很高的。可以这样说，对于php内置函数，其效率和相应c函数几乎相同，<br />唯一多了一次转发调用。 
<p>内置函数在php中都是通过so的方式进行动态加载，用户也可以根据需要自己编写相应的so，也就是我们常说的扩展。<br />ZEND提供了一系列的api供扩展使用，下面是mysqli_real_query函数的C函数实现：<br />php-5.3.8\php-5.3.8\ext\mysqli\mysqli_api.c 
<p><span style="font-family: Arial; color: red; font-size: 10pt">PHP_FUNCTION(mysqli_real_query)</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">{</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;MY_MYSQL&nbsp;*mysql;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;zval&nbsp;&nbsp;*mysql_link;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;*query = NULL;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;query_len;</span></p>
<p><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &amp;mysql_link, mysqli_link_class_entry, &amp;query, &amp;query_len) == FAILURE) {</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;MYSQLI_FETCH_RESOURCE_CONN(mysql, &amp;mysql_link, MYSQLI_STATUS_VALID);</span></p>
<p><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;MYSQLI_DISABLE_MQ; /* disable multi statements/queries */</span></p>
<p><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;if (mysql_real_query(mysql-&gt;mysql, query, query_len)) {</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MYSQLI_REPORT_MYSQL_ERROR(mysql-&gt;mysql);</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETURN_FALSE;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;}</span></p>
<p><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;if (!mysql_field_count(mysql-&gt;mysql)) {</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (MyG(report_mode) &amp; MYSQLI_REPORT_INDEX) {</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;php_mysqli_report_index(query, mysqli_server_status(mysql-&gt;mysql) TSRMLS_CC);</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;}</span></p>
<p><span style="font-family: Arial; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;RETURN_TRUE;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">}</span></p>
<h5><a name="用户函数"></a>用户函数</h5>
<p>和内置函数相比，用户通过php实现的自定义函数具有完全不同的执行过程和实现原理。如前文所述，<br />我们知道php代码是被翻译成为了一条条opcode来执行的，用户函数也不例外，实际中每个函数对应到一组opcode，<br />这组指令被保存在zend_function中。于是，用户函数的调用最终就是对应到一组opcodes的执行。 
<ul><li>局部变量的保存及递归的实现<br />我们知道，函数递归是通过堆栈来完成的。在php中，也是利用类似的方法来实现。Zend为每个php函数分配了一个活动符号表(active_sym_table)，<br />记录当前函数中所有局部变量的状态。所有的符号表通过堆栈的形式来维护，每当有函数调用的时候，分配一个新的符号表并入栈。<br />当调用结束后当前符号表出栈。由此实现了状态的保存和递归。 </li></ul>
<p>对于栈的维护，zend在这里做了优化。预先分配一个长度为N的静态数组来模拟堆栈，<br />这种通过静态数组来模拟动态数据结构的手法在我们自己的程序中也经常有使用，这种方式避免了每次调用带来的内存分配、销毁。<br />ZEND只是在函数调用结束时将当前栈顶的符号表数据clean掉即可。<br />因为静态数组长度为N，一旦函数调用层次超过N，程序不会出现栈溢出，这种情况下zend就会进行符号表的分配、销毁，因此会导致性能下降很多。<br />在zend里面，N目前取值是32。因此，我们编写php程序的时候，函数调用层次最好不要超过32。<br />当然，如果是web应用，本身可以函数调用层次的深度。 
<ul><li>参数的传递<br />和内置函数调用zend_parse_params来获取参数不同，用户函数中参数的获取是通过指令来完成的。函数有几个参数就对应几条指令。<br />具体到实现上就是普通的变量赋值。<br />通过上面的分析可以看出，和内置函数相比，由于是自己维护堆栈表，而且每条指令的执行也是一个c函数，用户函数的性能相对会差很多，<br />后面会有具体的对比分析。因此，如果一个功能有对应php内置函数实现的尽量不要自己重新写函数去实现。 </li></ul>
<h5><a name="类方法"></a>类方法</h5>
<p>类方法其执行原理和用户函数是相同的，也是翻译成opcodes顺次调用。类的实现，zend用一个数据结构zend_class_entry来实现，<br />里面保存了类相关的一些基本信息。这个entry是在php编译的时候就已经处理完成。 
<p>在zend_function的common中，有一个成员叫做scope，其指向的就是当前方法对应类的zend_class_entry。关于php中面向对象的实现，<br />这里就不在做更详细的介绍，今后将专门写一篇文章来详述php中面向对象的实现原理。就函数这一块来说，method实现原理和function完全相同，<br />理论上其性能也差不多，后面我们将做详细的性能对比。 
<h4>性能对比</h4>
<h4></h4>
<h5><a name="函数名长度对性能的影响"></a>函数名长度对性能的影响</h5>
<ul><li>测试方法<br />对名字长度为1、2、4、8、16的函数进行比较，测试比较它们每秒可执行次数，确定函数名长度对性能的影响 </li></ul>
<ul><li>测试结果如下图 </li></ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_1282792586sLNv.jpg" width="558" height="289" /> 
<ul><li>结果分析<br />从图上可以看出，函数名的长度对性能还是会有一定的影响。一个长度为1的函数和长度为16的 <strong>空函数调用</strong> ，其性能差了1倍。<br />分析一下源码不难找到原因，如前面叙述所说，函数调用的时候zend会先在一个全局的funtion_table中通过函数名查询相关信息，<br />function_table是一个哈希表。必然的，名字越长查询所需要的时间就越多。 <br /><strong>因此，在实际编写程序的时候，对多次调用的函数，名字建议不要太长</strong> </li></ul>
<p>虽然函数名长度对性能有一定影响，但具体有多大呢？这个问题应该还是需要结合实际情况来考虑，如果一个函数本身比较复杂的话，<br />那么对整体的性能影响并不大。<br />一个建议是对于那些会调用很多次，本身功能又比较简单的函数，可以适当取一些言简意赅的名字。 
<h5><a name="函数个数对性能的影响"></a>函数个数对性能的影响</h5>
<ul><li>测试方法<br />在以下三种环境下进行函数调用测试，分析结果：1.程序仅包含1个函数 2.程序包含100个函数 3.程序包含1000个函数。<br />测试这三种情况下每秒所能调用的函数次数 </li></ul>
<ul><li>测试结果如下图 </li></ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_1282792585zaua.jpg" width="489" height="293" /> 
<ul><li>结果分析<br />从测试结果可以看出，这三种情况下性能几乎相同，函数个数增加时性能下降微乎其微，可以忽略。<br />从实现原理分析，几种实现下唯一的区别在于函数获取的部分。如前文所述，所有的函数都放在一个hash表中，<br />在不同个数下查找效率都应该还是接近于O(1)，所以性能差距不大。 </li></ul>
<h5><a name="不同类型函数调用消耗"></a>不同类型函数调用消耗</h5>
<ul><li>测试方法<br />选取用户函数、类方法、静态方法、内置函数各一种，函数本身不做任何事情，直接返回，主要测试空函数调用的消耗。<br />测试结果为每秒可执行次数<br />测试中为去除其他影响，所有函数名字长度相同 </li></ul>
<ul><li>测试结果如下图 </li></ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_12827925831nF1.jpg" width="559" height="316" /> 
<ul><li>结果分析<br />通过测试结果可以看到，对于用户自己编写的php函数，不管是哪种类型，其效率是差不多的，均在280w/s左右。如我们预期，即使是空调，<br />内置函数其效率也要高很多，达到780w/s，是前者是3倍。可见，内置函数调用的开销还是远低于用户函数。<br />从前面原理分析可知主要差距在于用户函数调用时初始化符号表、接收参数等操作。 </li></ul>
<h5><a name="内置函数和用户函数性能对比"></a>内置函数和用户函数性能对比</h5>
<ul><li>测试方法<br />内置函数和用户函数的性能对比，这里我们选取几个常用的函数，然后用php实现相同功能的函数进行一下性能对比。<br />测试中，我们选取字符串、数学、数组中各一个典型进行对比，这几个函数分别是字符串截取(substr)、10进制转2进制(decbin)、<br />求最小值(min)和返回数组中的所以key(array_keys)。 </li></ul>
<ul><li>测试结果如下图 </li></ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_1282792584o7kN.jpg" width="556" height="328" /> 
<ul><li>结果分析<br />从测试结果可以看出，如我们预期，内置函数在总体性能上远高于普通用户函数。尤其对于涉及到字符串类操作的函数，<br />差距达到了1个数量级。因此，函数使用的一个原则就是如果某功能有相应的内置函数，尽量使用它而不是自己编写php函数。<br />对于一些涉及到大量字符串操作的功能，为提高性能，可以考虑用扩展来实现。比如常见的富文本过滤等。 </li></ul>
<h5><a name="和C函数性能对比"></a>和C函数性能对比</h5>
<ul><li>测试方法<br />我们选取字符串操作和算术运算各3种函数进行比对，php用扩展实现。三种函数是简单的一次算法运算、字符串比较和多次的算法运算。<br />除了本身的两类函数外，还会测试将函数空调开销去掉后的性能，一方面比对一下两种函数（c和php内置）本身的性能差异，<br />另外就是侧面印证空调函数的消耗<br />测试点为执行10w次操作的时间消耗 </li></ul>
<ul><li>测试结果如下图 </li></ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_12827925838AIK.jpg" width="560" height="281" /> 
<ul><li>结果分析<br />内置函数和C函数的开销在去掉php函数空调用的影响后差距较小，随着函数功能越来越复杂，双方性能趋近于相同。<br />这个从之前的函数实现分析中也容易得到论证，毕竟内置函数就是C实现的。<br />函数功能越复杂，c和php的性能差距越小<br />相对c来说，php函数调用的开销大很多，对于简单函数来说性能还是有一定影响。因此php中函数不宜嵌套封装太深。 </li></ul>
<h4><a name="伪函数及其性能"></a>伪函数及其性能</h4>
<h4></h4>
<p>在php中，有这样一些函数，它们在使用上是标准的函数用法，但底层实现却和真正函数调用完全不同，这些函数不属于前文提到的三种function中的任何一类，<br />其实质是一条单独的opcode，这里估且叫做伪函数或者指令函数。 
<p>如上所说，伪函数使用起来和标准的函数并无二致，看起来具有相同的特征。但是他们最终执行的时候是被zend反映成了一条对应的指令（opcode）来调用，<br />因此其实现更接近于if、for、算术运算等操作。 
<ul><li>php中的伪函数<br />isset<br />empty<br />unset<br />eval </li></ul>
<p>通过上面的介绍可以看出，伪函数由于被直接翻译成指令来执行，和普通函数相比少了一次函数调用所带来的开销，因此性能会更好一些。<br />我们通过如下测试来做一个对比。 Array_key_exists和isset两者都可以判断数组中某个key是否存在，看一下他们的性能 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_128279258644aj.jpg" width="538" height="268" /> 
<p>从图上可以看出，和array_key_exists相比，isset性能要高出很多，基本是前者的4倍左右，而即使是和空函数调用相比，<br />其性能也要高出1倍左右。由此也侧面印证再次说明了php函数调用的开销还是比较大的。 
<h4><a name="常用php函数实现及介绍"></a>总结及建议</h4>
<h4></h4>
<p><strong>通过对函数实现的原理分析和性能测试，我们总结出以下一些结论</strong> 
<p>1． Php的函数调用开销相对较大。 
<p>2． 函数相关信息保存在一个大的hash_table中，每次调用时通过函数名在hash表中查找，因此函数名长度对性能也有一定影响。 
<p>3． 函数返回引用没有实际意义 
<p>4． 内置php函数性能比用户函数高很多，尤其对于字符串类操作。 
<p>5． 类方法、普通函数、静态方法效率几乎相同，没有太大差异 
<p>6． 除去空函数调用的影响，内置函数和同样功能的C函数性能基本差不多。 
<p>7． 所有的参数传递都是采用引用计数的浅拷贝，代价很小。 
<p>8． 函数个数对性能影响几乎可以忽略 
<p><strong>因此，对于php函数的使用，有如下一些建议</strong> 
<p>1． 一个功能可以用内置函数完成，尽量使用它而不是自己编写php函数。 
<p>2． 如果某个功能对性能要求很高，可以考虑用扩展来实现。 
<p>3． Php函数调用开销较大，因此不要过分封装。有些功能，如果需要调用的次数很多本身又只用1、2行代码就行实现的，建议就不要封装调用了。 
<p>4． 不要过分迷恋各种设计模式，如上一条描述，过分的封装会带来性能的下降。需要考虑两者的权衡。Php有自己的特点，<br />切不可东施效颦，过分效仿java的模式。 
<p>5． 函数不宜嵌套过深，递归使用要谨慎。 
<p>6． 伪函数性能很高，同等功能实现下优先考虑。比如用isset代替array_key_exists 
<p>7． 函数返回引用没有太大意义，也起不到实际作用，建议不予考虑。 
<p>8． 类成员方法效率不比普通函数低，因此不用担心性能损耗。建议多考虑静态方法，可读性及安全性都更好。 
<p>9． 如不是特殊需要，参数传递都建议使用传值而不是传引用。当然，如果参数是很大的数组且需要修改时可以考虑引用传递。</p><img src ="http://www.cppblog.com/amazon/aggbug/157213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2011-09-30 11:13 <a href="http://www.cppblog.com/amazon/archive/2011/09/30/157213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改wlan_propdel管道程序调整无线通信半径</title><link>http://www.cppblog.com/amazon/archive/2010/05/28/116580.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Fri, 28 May 2010 03:07:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/05/28/116580.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/116580.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/05/28/116580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/116580.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/116580.html</trackback:ping><description><![CDATA[在做拓扑控制协议仿真时，需要使用wlan_tx和wlan_rx这一对收发机，并对节点通信半径进行动态调整，但如果使用较低版本的OPNET，源程序中可能没有对通信半径做明确限制。此时我们可以修改无线收发机的pipeline -&gt; wlan_propdel管道程序，达到动态调整通信半径的目的。<br><br>第一步，在wlan_mac进程模型中，添加Simulation&nbsp; Attributes -&gt; Wireless LAN Range (meters) 属性，类型为integer，缺省值为300。<br><br>第二步，改动wlan_propdel管道程序。以某一版本的该程序为例：<br>之前的：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">opnet.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_20_42_Open_Image onclick="this.style.display='none'; Codehighlighter1_20_42_Open_Text.style.display='none'; Codehighlighter1_20_42_Closed_Image.style.display='inline'; Codehighlighter1_20_42_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_20_42_Closed_Image onclick="this.style.display='none'; Codehighlighter1_20_42_Closed_Text.style.display='none'; Codehighlighter1_20_42_Open_Image.style.display='inline'; Codehighlighter1_20_42_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_20_42_Closed_Text>/**/</span><span id=Codehighlighter1_20_42_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">****&nbsp;constants&nbsp;****</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_45_92_Open_Image onclick="this.style.display='none'; Codehighlighter1_45_92_Open_Text.style.display='none'; Codehighlighter1_45_92_Closed_Image.style.display='inline'; Codehighlighter1_45_92_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_45_92_Closed_Image onclick="this.style.display='none'; Codehighlighter1_45_92_Closed_Text.style.display='none'; Codehighlighter1_45_92_Open_Image.style.display='inline'; Codehighlighter1_45_92_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_45_92_Closed_Text>/**/</span><span id=Codehighlighter1_45_92_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;propagation&nbsp;velocity&nbsp;of&nbsp;radio&nbsp;signal&nbsp;(m/s)&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PROP_VELOCITY&nbsp;&nbsp;&nbsp;&nbsp;3.0E+08</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_125_217_Open_Image onclick="this.style.display='none'; Codehighlighter1_125_217_Open_Text.style.display='none'; Codehighlighter1_125_217_Closed_Image.style.display='inline'; Codehighlighter1_125_217_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_125_217_Closed_Image onclick="this.style.display='none'; Codehighlighter1_125_217_Closed_Text.style.display='none'; Codehighlighter1_125_217_Open_Image.style.display='inline'; Codehighlighter1_125_217_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_125_217_Closed_Text>/**/</span><span id=Codehighlighter1_125_217_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;The&nbsp;variable&nbsp;defining&nbsp;a&nbsp;maximum&nbsp;range&nbsp;across&nbsp;which&nbsp;the&nbsp;station&nbsp;can&nbsp;communicate&nbsp;(meters)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;wlan_max_distance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;OPC_DBL_INFINITY;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_273_304_Open_Image onclick="this.style.display='none'; Codehighlighter1_273_304_Open_Text.style.display='none'; Codehighlighter1_273_304_Closed_Image.style.display='inline'; Codehighlighter1_273_304_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_273_304_Closed_Image onclick="this.style.display='none'; Codehighlighter1_273_304_Closed_Text.style.display='none'; Codehighlighter1_273_304_Open_Image.style.display='inline'; Codehighlighter1_273_304_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_273_304_Closed_Text>/**/</span><span id=Codehighlighter1_273_304_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">****&nbsp;pipeline&nbsp;procedure&nbsp;****</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">#if</span><span style="COLOR: #000000">&nbsp;defined&nbsp;(__cplusplus)</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Zhou_wlan_propdel&nbsp;(pkptr)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;Packet</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pkptr;<br><img id=Codehighlighter1_399_2235_Open_Image onclick="this.style.display='none'; Codehighlighter1_399_2235_Open_Text.style.display='none'; Codehighlighter1_399_2235_Closed_Image.style.display='inline'; Codehighlighter1_399_2235_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_399_2235_Closed_Image onclick="this.style.display='none'; Codehighlighter1_399_2235_Closed_Text.style.display='none'; Codehighlighter1_399_2235_Open_Image.style.display='inline'; Codehighlighter1_399_2235_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_399_2235_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_399_2235_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_prop_delay,&nbsp;end_prop_delay;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_prop_distance,&nbsp;end_prop_distance;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Compute&nbsp;the&nbsp;propagation&nbsp;delay&nbsp;separating&nbsp;the&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;radio&nbsp;transmitter&nbsp;from&nbsp;the&nbsp;radio&nbsp;receiver.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;FIN&nbsp;(wlan_propdel&nbsp;(pkptr));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Get&nbsp;the&nbsp;start&nbsp;distance&nbsp;between&nbsp;transmitter&nbsp;and&nbsp;receiver.&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;start_prop_distance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;op_td_get_dbl&nbsp;(pkptr,&nbsp;OPC_TDA_RA_START_DIST);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Get&nbsp;the&nbsp;end&nbsp;distance&nbsp;between&nbsp;transmitter&nbsp;and&nbsp;receiver.&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;end_prop_distance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;op_td_get_dbl&nbsp;(pkptr,&nbsp;OPC_TDA_RA_END_DIST);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Compute&nbsp;propagation&nbsp;delay&nbsp;to&nbsp;start&nbsp;of&nbsp;reception.&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;start_prop_delay&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;start_prop_distance&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;PROP_VELOCITY;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Compute&nbsp;propagation&nbsp;delay&nbsp;to&nbsp;end&nbsp;of&nbsp;reception.&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;end_prop_delay&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;end_prop_distance&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;PROP_VELOCITY;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;If&nbsp;the&nbsp;maximum&nbsp;transmission&nbsp;range&nbsp;of&nbsp;the&nbsp;station&nbsp;is&nbsp;not&nbsp;already&nbsp;set&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;then&nbsp;extract&nbsp;it&nbsp;from&nbsp;the&nbsp;user&nbsp;defined&nbsp;simulation&nbsp;attribute.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(wlan_max_distance&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;OPC_DBL_INFINITY)<br><img id=Codehighlighter1_1286_1532_Open_Image onclick="this.style.display='none'; Codehighlighter1_1286_1532_Open_Text.style.display='none'; Codehighlighter1_1286_1532_Closed_Image.style.display='inline'; Codehighlighter1_1286_1532_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1286_1532_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1286_1532_Closed_Text.style.display='none'; Codehighlighter1_1286_1532_Open_Image.style.display='inline'; Codehighlighter1_1286_1532_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1286_1532_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1286_1532_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(op_ima_sim_attr_exists&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Wireless&nbsp;LAN&nbsp;Range&nbsp;(meters)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;OPC_TRUE)<br><img id=Codehighlighter1_1365_1462_Open_Image onclick="this.style.display='none'; Codehighlighter1_1365_1462_Open_Text.style.display='none'; Codehighlighter1_1365_1462_Closed_Image.style.display='inline'; Codehighlighter1_1365_1462_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1365_1462_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1365_1462_Closed_Text.style.display='none'; Codehighlighter1_1365_1462_Open_Image.style.display='inline'; Codehighlighter1_1365_1462_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1365_1462_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1365_1462_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op_ima_sim_attr_get&nbsp;(OPC_IMA_DOUBLE,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Wireless&nbsp;LAN&nbsp;Range&nbsp;(meters)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">wlan_max_distance);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">printf&nbsp;("wlan_max_distance&nbsp;is&nbsp;%f&nbsp;\n",&nbsp;wlan_max_distance);</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;If&nbsp;the&nbsp;starting&nbsp;and&nbsp;ending&nbsp;propagation&nbsp;distance&nbsp;is&nbsp;more&nbsp;than&nbsp;the&nbsp;maximum&nbsp;transmission&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;range&nbsp;then&nbsp;discard&nbsp;the&nbsp;packet&nbsp;in&nbsp;the&nbsp;pipeline&nbsp;stage.&nbsp;This&nbsp;will&nbsp;model&nbsp;the&nbsp;physical&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;transmission&nbsp;boundary&nbsp;of&nbsp;a&nbsp;wireless&nbsp;station.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(end_prop_distance&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;wlan_max_distance&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;start_prop_distance&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;wlan_max_distance)<br><img id=Codehighlighter1_1859_2014_Open_Image onclick="this.style.display='none'; Codehighlighter1_1859_2014_Open_Text.style.display='none'; Codehighlighter1_1859_2014_Closed_Image.style.display='inline'; Codehighlighter1_1859_2014_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1859_2014_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1859_2014_Closed_Text.style.display='none'; Codehighlighter1_1859_2014_Open_Image.style.display='inline'; Codehighlighter1_1859_2014_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1859_2014_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1859_2014_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Discard&nbsp;the&nbsp;packet&nbsp;if&nbsp;the&nbsp;destination&nbsp;is&nbsp;more&nbsp;than&nbsp;the&nbsp;specified&nbsp;range</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op_td_set_int&nbsp;(pkptr,&nbsp;OPC_TDA_RA_MATCH_STATUS,&nbsp;OPC_TDA_RA_MATCH_IGNORE);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Place&nbsp;both&nbsp;propagation&nbsp;delays&nbsp;in&nbsp;packet&nbsp;transmission&nbsp;data&nbsp;attributes.</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;op_td_set_dbl&nbsp;(pkptr,&nbsp;OPC_TDA_RA_START_PROPDEL,&nbsp;start_prop_delay);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;op_td_set_dbl&nbsp;(pkptr,&nbsp;OPC_TDA_RA_END_PROPDEL,&nbsp;end_prop_delay);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;FOUT;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span></div>
<br>修改之后的，注意&nbsp;"<span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(wlan_max_distance&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;OPC_DBL_INFINITY)"那部分为添加语句</span>：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">opnet.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_20_42_Open_Image onclick="this.style.display='none'; Codehighlighter1_20_42_Open_Text.style.display='none'; Codehighlighter1_20_42_Closed_Image.style.display='inline'; Codehighlighter1_20_42_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_20_42_Closed_Image onclick="this.style.display='none'; Codehighlighter1_20_42_Closed_Text.style.display='none'; Codehighlighter1_20_42_Open_Image.style.display='inline'; Codehighlighter1_20_42_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_20_42_Closed_Text>/**/</span><span id=Codehighlighter1_20_42_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">****&nbsp;constants&nbsp;****</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_45_92_Open_Image onclick="this.style.display='none'; Codehighlighter1_45_92_Open_Text.style.display='none'; Codehighlighter1_45_92_Closed_Image.style.display='inline'; Codehighlighter1_45_92_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_45_92_Closed_Image onclick="this.style.display='none'; Codehighlighter1_45_92_Closed_Text.style.display='none'; Codehighlighter1_45_92_Open_Image.style.display='inline'; Codehighlighter1_45_92_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_45_92_Closed_Text>/**/</span><span id=Codehighlighter1_45_92_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;propagation&nbsp;velocity&nbsp;of&nbsp;radio&nbsp;signal&nbsp;(m/s)&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PROP_VELOCITY&nbsp;&nbsp;&nbsp;&nbsp;3.0E+08</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_125_217_Open_Image onclick="this.style.display='none'; Codehighlighter1_125_217_Open_Text.style.display='none'; Codehighlighter1_125_217_Closed_Image.style.display='inline'; Codehighlighter1_125_217_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_125_217_Closed_Image onclick="this.style.display='none'; Codehighlighter1_125_217_Closed_Text.style.display='none'; Codehighlighter1_125_217_Open_Image.style.display='inline'; Codehighlighter1_125_217_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_125_217_Closed_Text>/**/</span><span id=Codehighlighter1_125_217_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;The&nbsp;variable&nbsp;defining&nbsp;a&nbsp;maximum&nbsp;range&nbsp;across&nbsp;which&nbsp;the&nbsp;station&nbsp;can&nbsp;communicate&nbsp;(meters)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;wlan_max_distance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;OPC_DBL_INFINITY;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_273_304_Open_Image onclick="this.style.display='none'; Codehighlighter1_273_304_Open_Text.style.display='none'; Codehighlighter1_273_304_Closed_Image.style.display='inline'; Codehighlighter1_273_304_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_273_304_Closed_Image onclick="this.style.display='none'; Codehighlighter1_273_304_Closed_Text.style.display='none'; Codehighlighter1_273_304_Open_Image.style.display='inline'; Codehighlighter1_273_304_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_273_304_Closed_Text>/**/</span><span id=Codehighlighter1_273_304_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">****&nbsp;pipeline&nbsp;procedure&nbsp;****</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">#if</span><span style="COLOR: #000000">&nbsp;defined&nbsp;(__cplusplus)</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">wlan_propdel&nbsp;(pkptr)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;Packet</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pkptr;<br><img id=Codehighlighter1_399_2235_Open_Image onclick="this.style.display='none'; Codehighlighter1_399_2235_Open_Text.style.display='none'; Codehighlighter1_399_2235_Closed_Image.style.display='inline'; Codehighlighter1_399_2235_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_399_2235_Closed_Image onclick="this.style.display='none'; Codehighlighter1_399_2235_Closed_Text.style.display='none'; Codehighlighter1_399_2235_Open_Image.style.display='inline'; Codehighlighter1_399_2235_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_399_2235_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_399_2235_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_prop_delay,&nbsp;end_prop_delay;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_prop_distance,&nbsp;end_prop_distance;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Compute&nbsp;the&nbsp;propagation&nbsp;delay&nbsp;separating&nbsp;the&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;radio&nbsp;transmitter&nbsp;from&nbsp;the&nbsp;radio&nbsp;receiver.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;FIN&nbsp;(wlan_propdel&nbsp;(pkptr));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Get&nbsp;the&nbsp;start&nbsp;distance&nbsp;between&nbsp;transmitter&nbsp;and&nbsp;receiver.&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;start_prop_distance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;op_td_get_dbl&nbsp;(pkptr,&nbsp;OPC_TDA_RA_START_DIST);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Get&nbsp;the&nbsp;end&nbsp;distance&nbsp;between&nbsp;transmitter&nbsp;and&nbsp;receiver.&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;end_prop_distance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;op_td_get_dbl&nbsp;(pkptr,&nbsp;OPC_TDA_RA_END_DIST);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Compute&nbsp;propagation&nbsp;delay&nbsp;to&nbsp;start&nbsp;of&nbsp;reception.&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;start_prop_delay&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;start_prop_distance&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;PROP_VELOCITY;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Compute&nbsp;propagation&nbsp;delay&nbsp;to&nbsp;end&nbsp;of&nbsp;reception.&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;end_prop_delay&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;end_prop_distance&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;PROP_VELOCITY;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;If&nbsp;the&nbsp;maximum&nbsp;transmission&nbsp;range&nbsp;of&nbsp;the&nbsp;station&nbsp;is&nbsp;not&nbsp;already&nbsp;set&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;then&nbsp;extract&nbsp;it&nbsp;from&nbsp;the&nbsp;user&nbsp;defined&nbsp;simulation&nbsp;attribute.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(wlan_max_distance&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;OPC_DBL_INFINITY)<br><img id=Codehighlighter1_1286_1532_Open_Image onclick="this.style.display='none'; Codehighlighter1_1286_1532_Open_Text.style.display='none'; Codehighlighter1_1286_1532_Closed_Image.style.display='inline'; Codehighlighter1_1286_1532_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1286_1532_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1286_1532_Closed_Text.style.display='none'; Codehighlighter1_1286_1532_Open_Image.style.display='inline'; Codehighlighter1_1286_1532_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1286_1532_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1286_1532_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(op_ima_sim_attr_exists&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Wireless&nbsp;LAN&nbsp;Range&nbsp;(meters)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;OPC_TRUE)<br><img id=Codehighlighter1_1365_1462_Open_Image onclick="this.style.display='none'; Codehighlighter1_1365_1462_Open_Text.style.display='none'; Codehighlighter1_1365_1462_Closed_Image.style.display='inline'; Codehighlighter1_1365_1462_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1365_1462_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1365_1462_Closed_Text.style.display='none'; Codehighlighter1_1365_1462_Open_Image.style.display='inline'; Codehighlighter1_1365_1462_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1365_1462_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1365_1462_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op_ima_sim_attr_get&nbsp;(OPC_IMA_DOUBLE,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Wireless&nbsp;LAN&nbsp;Range&nbsp;(meters)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">wlan_max_distance);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">printf&nbsp;("wlan_max_distance&nbsp;is&nbsp;%f&nbsp;\n",&nbsp;wlan_max_distance);</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;If&nbsp;the&nbsp;starting&nbsp;and&nbsp;ending&nbsp;propagation&nbsp;distance&nbsp;is&nbsp;more&nbsp;than&nbsp;the&nbsp;maximum&nbsp;transmission&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;range&nbsp;then&nbsp;discard&nbsp;the&nbsp;packet&nbsp;in&nbsp;the&nbsp;pipeline&nbsp;stage.&nbsp;This&nbsp;will&nbsp;model&nbsp;the&nbsp;physical&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;transmission&nbsp;boundary&nbsp;of&nbsp;a&nbsp;wireless&nbsp;station.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(end_prop_distance&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;wlan_max_distance&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;start_prop_distance&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;wlan_max_distance)<br><img id=Codehighlighter1_1859_2014_Open_Image onclick="this.style.display='none'; Codehighlighter1_1859_2014_Open_Text.style.display='none'; Codehighlighter1_1859_2014_Closed_Image.style.display='inline'; Codehighlighter1_1859_2014_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1859_2014_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1859_2014_Closed_Text.style.display='none'; Codehighlighter1_1859_2014_Open_Image.style.display='inline'; Codehighlighter1_1859_2014_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1859_2014_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1859_2014_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Discard&nbsp;the&nbsp;packet&nbsp;if&nbsp;the&nbsp;destination&nbsp;is&nbsp;more&nbsp;than&nbsp;the&nbsp;specified&nbsp;range</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op_td_set_int&nbsp;(pkptr,&nbsp;OPC_TDA_RA_MATCH_STATUS,&nbsp;OPC_TDA_RA_MATCH_IGNORE);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Place&nbsp;both&nbsp;propagation&nbsp;delays&nbsp;in&nbsp;packet&nbsp;transmission&nbsp;data&nbsp;attributes.</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;op_td_set_dbl&nbsp;(pkptr,&nbsp;OPC_TDA_RA_START_PROPDEL,&nbsp;start_prop_delay);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;op_td_set_dbl&nbsp;(pkptr,&nbsp;OPC_TDA_RA_END_PROPDEL,&nbsp;end_prop_delay);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;FOUT;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span></div>
<br>第三步，选择file -&gt; Compile，编译该程序。需要注意的是，如果将wlan_propdel改名为其他名字，如***_wlan_propdel，那么需要将函数名也修改为相应的***_wlan_propdel。<br><br><br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/116580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-05-28 11:07 <a href="http://www.cppblog.com/amazon/archive/2010/05/28/116580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell脚本基本内容</title><link>http://www.cppblog.com/amazon/archive/2010/03/11/109440.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 11 Mar 2010 09:01:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/03/11/109440.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/109440.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/03/11/109440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/109440.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/109440.html</trackback:ping><description><![CDATA[<p>#!/bin/bash<br>#脚本用途：<br>#创建日期：<br>#Written by someone<br>正文......<br><br>在shell中，所有没有声明的变量都默认是呈现字符串形式，所以var=5*7;$var就成为字符串形式"5*7"，而不会进行任何算术运算。声明变量使用declare指令。<br>delcare [-afirx] var=...<br>-a&nbsp;定义为数组<br>-f&nbsp;定义为函数<br>-i&nbsp;定义为整数<br>-r&nbsp;定义为只读&nbsp;<br>-x&nbsp;定义为通过环境输出变量<br><br>read name<br>read的功能是将用户在键盘上输入的内容放到变量name中。<br>read name &lt; file的形式通过重定向改变了输入源为file。<br><br>脚本的参数代号：<br>$0&nbsp;脚本的文件名<br>$1&nbsp;第一个附加参数<br>$2&nbsp;第二个附加参数<br>$3&nbsp;......<br>$# 传递给脚本的参数个数<br>$@ 传递给脚本的所有参数<br>$$ 脚本的进程号，通常用它来生成唯一的临时文件：/tmp/tmpfile_$$<br><br>逻辑判断式：<br><br>关于文件与目录的逻辑判断，格式是-&#215;&#215; file或者! -&#215;&#215; file（注意!和-xx和file之间有空格）<br>-f&nbsp;检测文件是否存在<br>-d&nbsp;将测目录是否存在<br>-b&nbsp;检测是否为block文件<br>-c&nbsp;检测是否为character文件<br>-L&nbsp;检测是否为符号链接文件<br>-S&nbsp;检测是否为socket标签文件<br>-e&nbsp;检测某个东西是否存在，可以是任何东西<br><br>关于程序的逻辑判断，格式是-&#215;&#215; proc<br>-G&nbsp;检测是否由GID所执行的程序拥有<br>-O&nbsp;检测是否由UID所执行的程序拥有<br><br>关于文件的属性检测，格式是-&#215;&#215; file<br>-r&nbsp;检测是否为可读属性<br>-w&nbsp;检测是否为可写属性<br>-x&nbsp;检测是否为可执行属性<br>-s&nbsp;检测是否为非空白文件<br>-u&nbsp;检测是否具有SUID属性<br>-g&nbsp;检测是否具有SGID属性<br>-k&nbsp;检测是否具有sticky bit属性<br><br>两个文件的判断与比较，格式是file1 -&#215;&#215; file2<br>-nt&nbsp;第一个文件比第二个文件新<br>-ot&nbsp;第一个文件比第二个文件旧<br>-ef&nbsp;第一个文件和第二个文件为同一个文件（诸如链接文件）<br><br>逻辑与、逻辑或<br>&amp;&amp;&nbsp;逻辑与<br>||&nbsp;逻辑或<br><br>运算符：<br>-eq&nbsp;等于<br>-ne&nbsp;不等于<br>-lt&nbsp;小于<br>-gt&nbsp;大于<br>-le&nbsp;小于或等于<br>-ge&nbsp;大于或等于<br>-a&nbsp;双方都成立（and）<br>-o&nbsp;单方成立（or）<br><br>字符串比较：<br>= 两个字符串相同<br>!= 两个字符串不同<br>-z&nbsp;空字符串<br>-n&nbsp;非空字符串<br><br>条件判断：<br>if [条件判断1] &amp;&amp;/|| [条件判断2]; then<br>&nbsp;&nbsp;&#8230;&#8230;<br>elif [条件判断1] &amp;&amp;/|| [条件判断4]; then<br>&nbsp;&nbsp;&#8230;&#8230;<br>else<br>&nbsp;&nbsp;&#8230;&#8230;<br>fi<br>注意：在[]中，只能有一个判断式；在[]与[]之间，可以使用&amp;&amp;或者||结合判断式；[]中每一个独立的组件之间需要用空格键隔开，这一点尤其要注意，其中组件是指[、]、变量、运算符号和字符串、值等。例如：<br>if [ "$var" = "yes" ]; then<br><br>case var in<br>方式一 | 方式&#215;)<br>&nbsp;&nbsp;程序段<br>&nbsp;&nbsp;;;<br>方式二 | 方式&#215;)<br>&nbsp;&nbsp;程序段<br>&nbsp;&nbsp;;;<br>*)<br>&nbsp;&nbsp;echo "Usage {方式一|方式二}"&nbsp;<br>&nbsp;&nbsp;exit 1<br>esac<br>&nbsp;<br>循环：<br>for((条件1;条件2;条件3))<br>do<br>&nbsp;程序段<br>done<br><br>for var in var_list&nbsp;&nbsp;&nbsp;&nbsp; //var_list是以空格键分开的选择项，多为字符串，例如for var in yes no other或者for var in "yes" "no" "other"<br>do<br>&nbsp;程序段<br>done<br>看下面一段脚本程序，该程序演示了$(command)的用法，for命令的参数来自$()中的命令的结果：<br>for file in $(ls *.sh)<br>do<br>&nbsp;lpr $file<br>done<br><br>while [条件]<br>do<br>&nbsp;程序段<br>done<br><br>until [条件]<br>do&nbsp;<br>&nbsp;程序段<br>done</p>
<p>调试脚本：<br>sh [-nvx] scripts<br>-n&nbsp;不执行脚本，查询脚本内的语法，若有错误则列出<br>-v&nbsp;在执行脚本之前，先将脚本的内容显示在屏幕上<br>-x&nbsp;将用到的脚本内容显示在屏幕上，与-v稍微不同<br><br><strong>注意：<br>1.在条件判断时一般使用"$var"的形式，这是为了防止出现var为空的情况，例如：if [ $var =&nbsp;"yes"&nbsp;]中，如果var为空，那么会出现if [ = "yes"&nbsp;]的情况，这是不合法的，而if [ "$var" =&nbsp;"yes"]则不会出现该问题。<br><br></strong></p>
<img src ="http://www.cppblog.com/amazon/aggbug/109440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-03-11 17:01 <a href="http://www.cppblog.com/amazon/archive/2010/03/11/109440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程在前台与后台之间切换</title><link>http://www.cppblog.com/amazon/archive/2010/02/01/106948.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 01 Feb 2010 08:30:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/02/01/106948.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/106948.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/02/01/106948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/106948.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/106948.html</trackback:ping><description><![CDATA[在前台运行某个命令，终端被该作业占据，而在后台运行作业时，不会占据终端。下面将介绍几种在前台与后台之间切换的方法。<br><br><strong>前台转入后台</strong><br><br>第一种，在要运行的命令后面加上&amp;，命令自动转入后台运行，不占用前台终端。例如运行一个不断打印字符串到标准输出的可执行程序，输入如下：<br>$ vi test.c<br>#include &lt;stdio.h&gt;<br>main()<br>{<br>&nbsp;&nbsp;&nbsp;while(1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("ok \n");<br>}<br>$ gcc -o test test.c<br>$ ./test &amp;<br>此时test程序将转入后台继续执行，并在标准输出即控制台上打印出字符。停止该程序的方法是利用ps命令找到该程序的对应进程号num，然后运行kill num。注意：在控制台中不断出现的打印字符会淹没输入的命令，但是没有任何影响，命令依然可以被正确解析。<br><br>第二种，运行./test后，使用ctrl+z使正在运行的命令./test暂停（ctrl+c是终止），用命令jobs查看想要转入后台的命令编号n，然后运行bg n即可。注意，该命令的最终作用等价于将./test命令后面加上&amp;符号。<br><br>第三种，使用nohup+命令的运行方式，在缺省情况下该命令的所有输出都被重定向到一个名为nohup.out的文件中，除非有指定的重定向文件。例如：<br>nohup command &amp;<br>nohup command &gt;result 2&gt;&amp;1 &amp;<br>而且使用nohup转入后台的命令，在关闭shell后重新登录，该命令依然处于运行状态，但通过ps命令不会显示，而是使用ps x或者ps &#8211;A命令方可显示。<br>注意：如果是执行脚本并重定向输出的话，不应该在脚本内部写，而是写成：<br>nohup ./***.sh &gt;result 2&gt;&amp;1 &amp;<br><br>以上三种方法的特点是：第一、二种方法在退出该shell进程后命令均不存在。第三种方法即使退出shell进程后，命令依然存在，而命令的控制权交给了init。<br><br><strong>后台转入前台</strong><br><br>使用jobs命令查看要转入前台的命令编号n，然后运行fg n即可。fg命令即"front ground"。<br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/106948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-02-01 16:30 <a href="http://www.cppblog.com/amazon/archive/2010/02/01/106948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux串口编程</title><link>http://www.cppblog.com/amazon/archive/2010/01/28/106644.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 28 Jan 2010 08:16:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/28/106644.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/106644.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/28/106644.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/106644.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/106644.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.串口操作需要的头文件#include &lt;stdio.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//标准输入输出定义#include &lt;stdlib.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//标准函数库定义#include &lt;unist...&nbsp;&nbsp;<a href='http://www.cppblog.com/amazon/archive/2010/01/28/106644.html'>阅读全文</a><img src ="http://www.cppblog.com/amazon/aggbug/106644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-28 16:16 <a href="http://www.cppblog.com/amazon/archive/2010/01/28/106644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动配置节点ID号的方法</title><link>http://www.cppblog.com/amazon/archive/2010/01/27/106511.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 27 Jan 2010 02:40:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/27/106511.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/106511.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/27/106511.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/106511.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/106511.html</trackback:ping><description><![CDATA[无线传感器或者无线局域网仿真需要使用wlan_mac模块作为链路层协议，在定义大量节点的时候如果手工设置每个节点的wlan_mac.Address属性（mac地址）是一件很麻烦的事情，而wlan_mac模块对该属性提供了一个Auto Assigned值（Auto Assigned=-2），但在实际的仿真中发现，设置为Auto Assigned的节点并没有自行设置有效的mac地址，而是仍为-2，此时源节点只能设置目的地址为Broadcast（-1）或者Random（-2）。<br>综上所述，本人想出了一个方法，将wlan_mac.Address属性与name属性取值相等，，而在添加节点的时候，节点的name属性是自动递增的，例如添加节点&#8221;1&#8221;后，下一个添加的节点名为&#8221;2&#8221;。这样就避免了手工设置的麻烦，具体如下：<br><br>在wlan_mac模块中的init函数中添加如下命令：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Determine&nbsp;the&nbsp;assigned&nbsp;MAC&nbsp;address.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>op_ima_obj_attr_get&nbsp;(my_objid,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Address</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">my_address);<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">*************************************************************************</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(my_address&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;AUTO_ASSIGNED)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;op_ima_obj_attr_get&nbsp;(my_node_objid,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;my_node_name);<br>&nbsp;&nbsp;&nbsp;&nbsp;my_address&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;name_aoti&nbsp;(my_node_name);<br>&nbsp;&nbsp;&nbsp;&nbsp;op_ima_obj_attr_set&nbsp;(my_node_objid,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Wireless&nbsp;LAN&nbsp;MAC&nbsp;Address</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;my_address);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">*************************************************************************</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Obtain&nbsp;an&nbsp;address&nbsp;handle&nbsp;for&nbsp;resolving&nbsp;WLAN&nbsp;MAC&nbsp;addresses.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/<br><font color=#000000>oms_aa_handle = oms_aa_address_handle_get ("MAC Addresses", "Address");<span style="COLOR: #000000"></span></font></span></div>
其中，在SV中定义my_node_name为int型变量，在HB中定义AUTO_ASSIGNED为-2。该代码定义：如果读出的my_address为-2，说明mac层地址仍未设置，则在此将其设置为节点name值，否则不做任何动作。<br><br>同理，在其他需要使用mac层地址的协议层中的初始化部分，添加如下代码：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(my_node_addr&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;AUTO_ASSIGNED)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;op_ima_obj_attr_get&nbsp;(op_topo_parent&nbsp;(op_id_self&nbsp;()),&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;my_node_name);<br>&nbsp;&nbsp;&nbsp;&nbsp;my_node_addr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;name_aoti&nbsp;(my_node_name);<br>&nbsp;&nbsp;&nbsp;&nbsp;op_ima_obj_attr_set&nbsp;(op_topo_parent&nbsp;(op_id_self&nbsp;()),&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Wireless&nbsp;LAN&nbsp;MAC&nbsp;Address</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;my_node_addr);<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>注意：<br>1.在wlan_mac_intf层，同样需要使用到mac_address，但只在wait阶段需要对该属性进行读写，所以并不会读到错误的值，可以不管。<br>2.name_aoti函数：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;name_aoti&nbsp;(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">name)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">tmp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;name;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;FIN&nbsp;(name_aoti);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">tmp&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;num&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">tmp&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;FRET&nbsp;(num);<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/106511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-27 10:40 <a href="http://www.cppblog.com/amazon/archive/2010/01/27/106511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>定义Wireless LAN Range (meters)仿真属性</title><link>http://www.cppblog.com/amazon/archive/2010/01/26/106459.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Tue, 26 Jan 2010 05:41:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/26/106459.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/106459.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/26/106459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/106459.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/106459.html</trackback:ping><description><![CDATA[参考他人代码，发现在wlan_mac进程模型中的Simulation Attributes中定义了Wireless LAN Range (meters)属性，不知从何而来，如图所示。经查证该属性不存在于wlan_mac进程代码中，疑来自底层的管道阶段代码。<br><span style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 10.5pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang=EN-US><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/amazon/Wireless_LAN_Range.jpg" width=511 height=38><br><br><font size=3>后来发现，在wlan_port_tx.propdel model管道阶段的<span style="COLOR: red">wlan_propdel</span>程序中有这么一段代码：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;If&nbsp;the&nbsp;maximum&nbsp;transmission&nbsp;range&nbsp;of&nbsp;the&nbsp;station&nbsp;is&nbsp;not&nbsp;already&nbsp;set&nbsp;then&nbsp;extract&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;it&nbsp;from&nbsp;the&nbsp;user&nbsp;defined&nbsp;simulation&nbsp;attribute.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(wlan_max_distance&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;OPC_DBL_INFINITY)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(op_ima_sim_attr_exists&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Wireless&nbsp;LAN&nbsp;Range&nbsp;(meters)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;OPC_TRUE)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op_ima_sim_attr_get&nbsp;(OPC_IMA_DOUBLE,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Wireless&nbsp;LAN&nbsp;Range&nbsp;(meters)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">wlan_max_distance);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;If&nbsp;the&nbsp;starting&nbsp;and&nbsp;ending&nbsp;propagation&nbsp;distance&nbsp;is&nbsp;more&nbsp;than&nbsp;the&nbsp;maximum&nbsp;transmission&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;range&nbsp;then&nbsp;discard&nbsp;the&nbsp;packet&nbsp;in&nbsp;the&nbsp;pipeline&nbsp;stage.&nbsp;This&nbsp;will&nbsp;model&nbsp;the&nbsp;physical&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;transmission&nbsp;boundary&nbsp;of&nbsp;a&nbsp;wireless&nbsp;station.&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;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(end_prop_distance&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;wlan_max_distance&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;start_prop_distance&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;wlan_max_distance)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;op_td_set_int&nbsp;(pkptr,&nbsp;OPC_TDA_RA_MATCH_STATUS,&nbsp;OPC_TDA_RA_MATCH_IGNORE);<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>该段代码的作用在于：当wlan_max_distance变量未具体定义时，如果Wireless LAN Range (meters)属性在仿真属性中定义了，那么将该属性的值作为最大的无线传输半径，超过该传输半径的数据包通通丢弃。<br><br></font></span>
<img src ="http://www.cppblog.com/amazon/aggbug/106459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-26 13:41 <a href="http://www.cppblog.com/amazon/archive/2010/01/26/106459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>