??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩精品久久久肉伦网站 ,国内精品欧美久久精品,香蕉aa三级久久毛片http://www.shnenglu.com/amazon/category/13915.htmlzh-cnTue, 06 Mar 2012 03:57:37 GMTTue, 06 Mar 2012 03:57:37 GMT60array_key_exists、empty、isset的比?/title><link>http://www.shnenglu.com/amazon/archive/2011/12/12/161983.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Mon, 12 Dec 2011 11:59:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2011/12/12/161983.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/161983.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2011/12/12/161983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/161983.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/161983.html</trackback:ping><description><![CDATA[<div><strong>1. array_key_exists<br /></strong>原型Qbool array_key_exists ( mixed key, array search )<br />描述Q给定的key存在于数l中时返回TRUEQ即使key对应的键gؓNULL也返回true。array_key_exists() 也可用于对象<br /><br /><strong>2. empty<br /></strong>原型Qbool empty ( mixed var )<br />描述Q如?var 是非I或非零的|?empty() q回 FALSE。换句话_""??0"、NULL、FALSE、array()、var $var; 以及没有M属性的对象都将被认为是I的Q如?var 为空Q则q回 TRUE?<br />注意Q?br />A. empty是语句而不是函敎ͼ<br />B. empty只能用于变量Q诸如empty(addslashes($var))的用法是错误的,因ؓaddslashes($var)q回帔R?br /><br /><strong>3. isset<br /></strong>原型Qbool isset ( mixed var [, mixed var [, ...]] )<br />描述Q如果var存在则返回TRUEQ否则返回FALSEQ若使用 isset()试一个被讄?NULL 的变量,返?FA<span>LS</span><span>E?/span><br /><span>?/span><span>意:<br />A. </span><span>isset?/span><span>语句而不?/span><span>函数Q?br />B. isset?/span>能用于变量,若想常量是否设|可以用defined()函数?br />C. 使用unset实际上就是将var|ؓNULL?br /><br /><strong>性能比较Q?br /></strong>l论Qisset ~ empty > array_key_exists<br />原因Qisset和empty是语句,而array_key_exists是函敎ͼ后者比前者多了函数调用,因此性能上要E差。而isset和empty的范围是不一LQ主要区别在于gؓNULL的情况,需要特别注意?br /><br /></div><img src ="http://www.shnenglu.com/amazon/aggbug/161983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2011-12-12 19:59 <a href="http://www.shnenglu.com/amazon/archive/2011/12/12/161983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP调用外部E序的方?/title><link>http://www.shnenglu.com/amazon/archive/2011/12/01/161281.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Thu, 01 Dec 2011 07:34:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2011/12/01/161281.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/161281.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2011/12/01/161281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/161281.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/161281.html</trackback:ping><description><![CDATA[<div>很多情况下需要php调用其他E序如shell命o、shell脚本、可执行E序{等Q此旉要用到诸如exec/system/popen/proc_open{函敎ͼ每种函数有各自适合使用的场景以及需要注意的地方?br /><br /><strong>前提QPHP没有q行在安全模?br /></strong>如果PHPq行在安全模式下Q那么在执行外部命o、打开文g、连接数据库、基于HTTP的认证这4个方面将会受到制U,可能在调用外部程序时无法获取预期的结果,此时需要设|特定目录,可以在php.ini中编辑safe_mode_exec_dir参数来指定?br /><br /><strong>1. exec<br /></strong>原型Qstring exec ( string command [, array &output [, int &return_var]] )<br />描述Q返回g存最后的输出l果Q而所有输出结果将会保存到$output数组Q?return_var用来保存命o执行的状态码Q用来检成功或p|Q?br />例子Q?ret = exec("ls -al", $output, $var);<br />注意Q?br />A. 输出l果会逐行q加?output中,因此在调用exec之前需要unset($output)Q特别是循环调用的时候?br />B. 如果想通过exec调用外部E序后马上l执行后l代码,仅仅在命令里?&"是不够的Q此时exec依然会等待命令执行完毕;需要再标准输出做重定向才可以Q例如:exec("ls -al >/dev/null &", $output, $var);<br />C. 要学会善用EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字W串 中所有可能瞒qShell而去执行另外一个命令的字符转义。这些字W在Shell中是有特D含义的Q象分号Q|Q,重定向(>Q和从文件读?Q?lt;Q等。函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号Qƈ把字W串中的单引可{义,q样q个字符?可以安全地作ؓ命o的参数?br /><br /><strong>2. system<br /></strong>原型Qstring system ( string command [, int &return_var] )<br />描述Q执行给定的命oQ返回最后的输出l果Q第二个参数是可选的Q用来得到命令执行后的状态码?br />例子Q?ret = system("ls -al", $var);<br />注意Q略?br /><br /><strong>3. passthru<br /></strong>原型Qvoid passthru (string command [, int return_var])<br />描述Q执行给定的命oQ但不返回Q何输出结果,而是直接输出到显C备上Q第二个参数可选,用来得到命o执行后的状态码?br />例子Qpassthru("ls -al", $var);<br />注意Q略?br /><br /><strong>4. popen<br /></strong>原型Qresource popen ( string command, string mode )<br />描述Q打开一个指向进E的道Q该q程由派生给定的 command 命o执行而生?q回一个和 fopen() 所q回的相同的文g指针Q只不过它是单向的(只能用于L写)q且必须?pclose() 来关闭。此指针可以用于 fgets()Qfgetss() ?fwrite()?<br />例子Q?fd = popen("command", 'r'); $ret = fgets($fd);<br />注意Q只能打开单向道Q不?r'是'w'Qƈ且需要用pclose()来关闭?br /><br /><strong>5. proc_open<br /></strong>原型Qresource proc_open ( string cmd, array descriptorspec, array &pipes [, string cwd [, array env [, array other_options]]] )<br />描述Q与popencMQ但是可以提供双向管道。具体的参数读者可以自q阅资料,比如该博客:<a >http://hi.baidu.com/alex_wang58/blog/item/a28657de16fec55195ee372a.html</a>?br />注意Q?br />A. 后面需要用proc_close()关闭资源Qƈ且如果是pipecdQ需要用pclose()关闭句柄?br />B. proc_open打开的程序作为php的子q程Qphp退出后该子q程也会退出?br />C. <span style="color: red">W者在使用的时候遇到获取外部程序输出阻塞的问题Q也是在例子中的fgets($pipes[1])语句d了,无法l箋q行。经q多Ҏ证后发现Q问题一般出在外部程序中Q比如外部程序是CE序Q用fprintf(stdin, "**** \n");输出l果Q此旉要加上fflush(stdout);才行Q否则输出结果可能会暂留~存中,无法真正输出Q而php也就无法获取输出了?/span><br />例子Q? <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.shnenglu.com/images/OutliningIndicators/None.gif" /><span style="color: #008000">//</span><span style="color: #008000">/< 打开道</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$pwd</span><span style="color: #000000"> </span><span style="color: #000000">=</span><span style="color: #000000"> </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.shnenglu.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$pipes</span><span style="color: #000000"> </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">array</span><span style="color: #000000">();<br /><img alt="" align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$command</span><span style="color: #000000"> </span><span style="color: #000000">=</span><span style="color: #000000"> </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.shnenglu.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$desc</span><span style="color: #000000"> </span><span style="color: #000000">=</span><span style="color: #000000"> </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"> </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"> </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"> </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"> </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"> </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.shnenglu.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$handle</span><span style="color: #000000"> </span><span style="color: #000000">=</span><span style="color: #000000"> </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"> </span><span style="color: #800080">$desc</span><span style="color: #000000">,</span><span style="color: #000000"> </span><span style="color: #800080">$pipes</span><span style="color: #000000">,</span><span style="color: #000000"> </span><span style="color: #800080">$pwd</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000"> (</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">)) {<br /><img alt="" align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" />    </span><span style="color: #008080">fprintf</span><span style="color: #000000">(STDERR</span><span style="color: #000000">,</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">proc_open failed.\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" />    </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.shnenglu.com/images/OutliningIndicators/None.gif" />}<br /><img alt="" align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">/< d</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.shnenglu.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"> </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.shnenglu.com/images/OutliningIndicators/None.gif" /></span><span style="color: #800080">$ret</span><span style="color: #000000"> </span><span style="color: #000000">=</span><span style="color: #000000"> </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"> </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.shnenglu.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">/< 关闭道</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" /></span></div><br /><br /></div><img src ="http://www.shnenglu.com/amazon/aggbug/161281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2011-12-01 15:34 <a href="http://www.shnenglu.com/amazon/archive/2011/12/01/161281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>smarty模板基础ȝhttp://www.shnenglu.com/amazon/archive/2011/11/21/160638.htmlq风q风Mon, 21 Nov 2011 06:36:00 GMThttp://www.shnenglu.com/amazon/archive/2011/11/21/160638.htmlhttp://www.shnenglu.com/amazon/comments/160638.htmlhttp://www.shnenglu.com/amazon/archive/2011/11/21/160638.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/160638.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/160638.html前提Q?br />1. 部vsmarty模板目录Q?br />2. ~写Smartycȝ子类Q定制好template_dir、compile_dir、config_dir、cache_dir、left_delimiter、right_delimiter、compile_check、caching{配|信息?br />3. 在BaseActioncM定义该类对象Q然后便可用?br />4. 暂定delimiter使用{和}

一.  变量

1. php变量
   A. 普通变量:{$var}
   B. 兌数组Q{$array.var1.var2}
   C. 数字数组Q{$array[0][1]}
   D. 对象Q{$object->var}
   E. 在引号内的用方法,以关联数lؓ例,其他cMQ{function var="{$array.var1.var2}"}
2. conf变量
   A. {#var#}
   B. 在引号内的用方法:{function var="{#var#}"}
3. smarty保留变量Q略?br />
? 变量调节?/strong>

1. capitalize / lower / upper
   用途:首字母大?/ 转ؓ写 / 转ؓ大写
   用法Q{$var|capitalize} / {$var|lower} / {$var|upper}
2. count_characters / count_paragraphs / count_sentences / count_words
   用途:计算字节敎ͼ默认不计空格符 / 计算D落数量 / 计算句子数量 / 计算词数
   用法Q{$var|count_characters}  {$var|count_characters:true} / {$article|count_paragraphs} / {$article|count_sentences} / {$sentence|count_words}
3. cat
   用途:字符串连?br />   用法Q{$var|cat:" is a boy."}
4. nl2br
   用途:换行W替换ؓ<br/>
   用法Q{$var|nl2br}
5. regex_replace / replace
   用途:正则替换 / 普通替?br />   用法Q{$var|regex_replace:"/\[old\]/":"[new]"} / {$var|replace:"old":"new"}
6. spacify
   用途:在每个字W间插入指定字符
   用法Q{$var|spacify:"^_^"}
7. date_format
   用途:格式化日期,cM"-1 days ago"?201111010000"、时间戳{都可以Q与strftime()功能cM
   用法Q{$time|date_format:"%H:%M:%S"}
8. default
   用途:当变量ؓI时Q设|默认?br />   用法Q{$var|default:"no value"}
9. escape
   用途:转码Q包括:html,htmlall,url,quotes,hex,hexentity,javascript
   用法Q{$articleTitle|escape:"html"}
10.indent
   用途:文字~进Q可以制定羃q字W数和用什么字W代?br />   用法Q{$var|indent}  {$var|indent:4}  {$var|indent:4:"\t"}
11.string_format
   用途:cM用sprintf
   用法Q{$var|string_format:"%.2f"}
12.strip / strip_tags
   用途:去除多余I白W,可以指定去除的字W?/ 去除<>以及包含在里面的所有字W?br />   用法Q{$var|strip}  {$var|strip:"&nbsp;"} / {$var|strip_tags}
13.truncate
   用途:字符串截取,默认截取80字符Q可以指定追加的字符?br />   用法Q{$var|truncate:40}  {$var|truncate:40:"...":true}
14.l合修改?br />   用途:֐思义Q可以将多个变量调节器组合用,中间用|来代?br />   例子Q{$articleTitle|lower|spacify|truncate:30:"..."}

? 内徏函数

1. capture
   用途:捕获模板内容到某变量varQƈ不进行输?br />   用法Q?br />   在{capture}{/capture}中间的数据被捕获Q可以?smarty.capture.var来用,不指定name的话Q默认ؓdefault
   {capture name=banner}
   This is a test.
   {/capture}
2. foreach
   用途:循环处理
   用法Q?br />   from: 数组Q需要用$
   item: 单元元素名称Q不需要用$
   key: key名称Q不需要用$
   name: 该@环的名称Q可以用于访问该循环Q例如:{$smarty.foreach.foreachname.varname}
   {foreach item=contact from=$contacts}
   {foreach key=key item=item from=$contact}
   {$key}: {$item}<br>
   {/foreach}
   {/foreach}
   注意Q在foreach中有一些特D的变量Q需要用{$smarty.foreach.foreachname.***}来访问:
   iteration: 表示当前循环的执行次敎ͼ初始?
   first: 循环W一ơ执行时被置为true
   last: 同上
   total: 用于昄循环执行的次敎ͼ在@环中或者@环后皆可使用
   show: 是foreach的一个标{,用于军_是否昄该foreach的内?br />3. include / insert
   用途:包含其他模板 / 与include不同Q?insert 所包含的内容不会被~存Q每ơ调用该模板都会重新执行该函?
   用法Q{include file="footer.tpl" title="Main menu" logo="4. if elseif else
   用途:分之判断
   用法Q?br />   {if $name eq "Fred"}
   Welcome Sir.
   {elseif $name eq "Wilma"}
   Welcome Ma'am.
   {else}
   Welcome, whatever you are.
   {/if}
5. ldelim / rdelim
   用途:分别表示左括受右括号Q因两个W号被用作smarty模板的标识符
   用法Q?br />   {ldelim}  {rdelim}
6. literal
   用途:在内部的数据当做文本处理Q不使用smarty模板解析Q主要用于javascript脚本{?br />   用法Q?br />   {literal}
   ......
   {/literal}
7. section
   用途:循环处理
   用法Q?br />   name: 该@环的名称
   loopQ决定@环次数的数组Q注意这里的使用Ҏ比较特别Q可以用section来对多个数组q行处理Q但必须先用可以军_循环ơ数的数l给loop赋?br />   {section name=customer loop=$custid}
   id: {$custid[customer]}<br>
   name: {$name[customer]}<br>
   address: {$address[customer]}<br>
   {section name=contact loop=$contact_type[customer]}
   {$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br>
   {/section}
   <p>
   {/section}
   如果要遍历多l关联数l,需要这h使用Q?br />   {section name=customer loop=$contacts}
   name: {$contacts[customer].name}<br>
   home: {$contacts[customer].home}<br>
   cell: {$contacts[customer].cell}<br>
   e-mail: {$contacts[customer].email}<p>
   {/section}
   注意Q与foreachcMQ在section中同h一些特D变量可供用,使用Ҏ是:{$smarty.section.sectionname.***}
   index: 昄当前循环的烦引,默认?或者start开?br />   index_prev: 昄上一个@环烦引|默认?1开?br />   index_next: 同上Q直x后都比上一ơ大1
   ineration: 同foreachQ与index不同Q后者是索引
   first: 同foreach
   last: 同foreach
   show: 同foreach
   total: 同foreach
8. strip
   用途:位于{strip}{/strip}内部html标签外的所有空格和回R清除q净Qƈ以html标签开头和l尾
   用法Q?br />   {strip}
   <table border=0>
     <tr>
    <td>
      <A HREF="{$url}">
   <font color="red">This is a test</font>
   </A>
    </td>
  </tr>
   </table>
   {/strip}
   上述输出为:
   <table border=0><tr><td><A HREF="
color="red">This is a test</font></A></td></tr></table>

? E序员需要注意的地方

1. 帔R
   SMARTY_DIRQSMARTY_DIR帔R用于定位smartycL件的完整pȝ路径Q必M斜杠l束Q也可以不定义,smarty模板会自动创建合适的倹{?br />2. cd?br />   $template_dir: 模板目录Q也是各html文g攄目录Q默认ؓ"./templates"
   $compile_dir: ~译后的模板目录Q经qsmarty解析后的html文g攄目录Q默认ؓ"./templates_c"
   $config_dir: 模板配置文g目录Q默认ؓ"./configs"
   $plugins_dir: 插g目录Q默认ؓSMARTY_DIR ?"plugins"
   $cache_dir: 存放模板~存的目录,默认?./cache"
   $debugging: 可以启动调试控制収ͼ默认为falseQ很有用啊!Q!
   $debug_tpl: 定义用于调试控制台的模板文g名字Q默认ؓSMARTY_DIR . "libs/debug.tpl"
   $global_assign: 用于定义全局变量Q例如:
       php里:$this->tpl->global_assign = array('my_global_1' => .....);
    在template里:{$smarty.my_global_1.***}
   $compile_check: 自动~译模板Q默认设|ؓtrueQ投入品后为性能赯Q可以设|ؓfalse?br />   $force_compile: 每次调用旉新编译模板,默认为falseQ不?compile_check的限Ӟ一旦设|ؓtrue后会重新~译?br />   $caching: 是否~存模板输出Q默认ؓfalseQ有利于增强性能?br />   $caching_lifetime: ~存生存旉Q只?caching为true时有效,-1表示永远有效Q?表示永远需要重新生成。单位是U?br />   注意Q?compile_check?force_compile?caching三者的关系如下Q?br />   A. 如果讄?compile_checkQ如果Q何模板文件或配置文g更新Q都会重新编译,~存也会重新生成Q?br />   B. 如果讄?force_compileQ则$compile_check不v作用Q而缓存也M重新生成Q?br />   C. 如果没有讄$cachingQ则没有~存Q性能受一定媄响?br />
? smarty的method

1. assign: Ҏ板用到的php变量q行赋?br />2. assign_by_ref: 也是赋|不过是引用赋?br />3. clear_all_assign: 清除所有赋?br />4. clear_all_cache: 清除所有缓存,参数可以指定阈值时?br />5. clear_assign: 清除某个赋|可以指定单个变量名或者数l?br />6. clear_cache: 清除某个template的缓存,需要指定template的名U?br />7. clear_config: 清除所有配|变量,如果指定则清除特定配|变?br />8. config_load: 加蝲某配|文件ƈ数据输出到模板
9. display: 昄某个模板
10.fetch: 捕获某个模板的输出,与display不同的是Q模板输出内容ƈ不会直接昄出来Q有什么用呢?Q?Q?br />11.get_config_vars: 获取所有配|变量的|也可以指定某个具体的变量?br />12.get_template_vars: 获取所有模板变量的|也可以指定某个具体的变量?br />13.is_cached: 判断某模板的~存是否存在Q只有在$caching讄为true时才有效
14.template_exists: 判断某模板是否存?br />



q风 2011-11-21 14:36 发表评论
]]>
PHP的EditPlus调试环境【{载?/title><link>http://www.shnenglu.com/amazon/archive/2011/11/20/160557.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Sun, 20 Nov 2011 06:54:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2011/11/20/160557.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/160557.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2011/11/20/160557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/160557.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/160557.html</trackback:ping><description><![CDATA[<div>懒了点,直接贴原文地址吧:<a >http://www.cnblogs.com/lemtree/articles/1836266.html</a><br /><br />Ҏ上面列出来的条目q行配置之后Q返现Editplus已经像个标准的IDE了,而且启动速度很快Q赞一个~<br /><br /></div><img src ="http://www.shnenglu.com/amazon/aggbug/160557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2011-11-20 14:54 <a href="http://www.shnenglu.com/amazon/archive/2011/11/20/160557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHPcȝ扉K的方法调用关p?/title><link>http://www.shnenglu.com/amazon/archive/2011/10/11/158016.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Tue, 11 Oct 2011 02:32:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2011/10/11/158016.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/158016.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2011/10/11/158016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/158016.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/158016.html</trackback:ping><description><![CDATA[<br />PHP和C++一样允许类的承,但存在一些自有的Ҏ:<br />1. 仅允许承一个类Q或者承多个接口;<br />2. 默认cM的所有方法都hC++中虚函数的特性,可以被子c重新覆盖;除非使用final关键字,此时子类不可重新覆盖该方法?br /><br />在类中通常使用$this->... 来访问类的属性或者方法,此时$this实际上是实例化对象的映射Q因?this是不可能出现在静态方法中的,q一点与C++很类伹{除此之外,q能在类中用self::... h和parent::... 来分别调用自w类Ҏ和父cȝҎQ这些是PHP中特有的关键字?br /><br />接下来需要解{具体的问题了?br /><strong>1. 如何在子cM调用自n的方法?<br /></strong>{:使用$this->... 或?self::... 来调用即可,但在静态方法中只能使用self::... Q而且需要被调用Ҏ中也没有使用?this关键字?br /><strong>2. 如何在子cM调用父类的方法?<br /></strong>{:无论是子cL覆盖的方法,直接使用$this->... 卛_调用父类ҎQ如果是子类覆盖了的ҎQ需要用到parent::.. 来调用?br /><strong>3. 如何在父cM调用子类的方法?<br /></strong>{:如之前所qͼ默认cM所有方法都hC++中虚函数的特性,因此如果父类中?this->... 调用某方法,无论该方法是否在父类中存在,而该Ҏ被子cd义了Q那么实际上调用的就是子cȝҎ?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.shnenglu.com/images/OutliningIndicators/None.gif" alt="" /><span style="color: #0000ff">class</span><span style="color: #000000"> A {    <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />   </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">function</span><span style="color: #000000"> x() {        <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />      </span><span style="color: #0000ff">echo</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">A::x() was called.\n</span><span style="color: #000000">"</span><span style="color: #000000">;    <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />   }    <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />   </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">function</span><span style="color: #000000"> y() {        <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />      self</span><span style="color: #000000">::</span><span style="color: #000000">x();        <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />      </span><span style="color: #0000ff">echo</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">A::y() was called.\n</span><span style="color: #000000">"</span><span style="color: #000000">;    <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />   }    <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />   </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">function</span><span style="color: #000000"> z() {        <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />      </span><span style="color: #800080">$this</span><span style="color: #000000">-></span><span style="color: #000000">x();        <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />      </span><span style="color: #0000ff">echo</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">A::z() was called.\n</span><span style="color: #000000">"</span><span style="color: #000000">;    <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />   }<br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />}<br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000"> B </span><span style="color: #0000ff">extends</span><span style="color: #000000"> A {    <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />   </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">function</span><span style="color: #000000"> x() {        <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />      </span><span style="color: #0000ff">echo</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">B::x() was called.\n</span><span style="color: #000000">"</span><span style="color: #000000">;    <br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />   }<br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" />}<br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" /><br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #800080">$b</span><span style="color: #000000"> </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> B();<br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #800080">$b</span><span style="color: #000000">-></span><span style="color: #000000">y();<br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">echo</span><span style="color: #000000"> </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.shnenglu.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #800080">$b</span><span style="color: #000000">-></span><span style="color: #000000">z();<br /><img align="top" src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" alt="" /></span></div><br /> <p>该例中,A::y()调用了A::x()Q而B::x()覆盖了A::x()Q那么当调用B::y()ӞB::y()应该调用A::x()q是 B::x()呢?在C++中,如果A::x()未被定义函数Q那么B::y()Q也是A::y()Q将调用A::x()Q而如果A::x()使用 virtual关键字定义成虚函敎ͼ那么B::y()调用B::x()?br />然而,在PHP5中,虚函数的功能是由 self ?$this 关键字实现的。如果父cMA::y()中?self::x() 的方式调用了 A::x()Q那么在子类中不论A::x()是否被覆盖,A::y()调用的都是A::x()Q而如果父cMA::y()使用 $this->x() 的方式调用了 A::x()Q那么如果在子类中A::x()被B::x()覆盖QA::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.shnenglu.com/amazon/aggbug/158016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2011-10-11 10:32 <a href="http://www.shnenglu.com/amazon/archive/2011/10/11/158016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHPcȝ静态方法和静态变?/title><link>http://www.shnenglu.com/amazon/archive/2011/10/10/157966.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Mon, 10 Oct 2011 06:54:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2011/10/10/157966.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/157966.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2011/10/10/157966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/157966.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/157966.html</trackback:ping><description><![CDATA[<br />在php中,讉KcȝҎ/变量有两U方法:<br />1. 创徏对象$object = new Class()Q然后?->"调用Q?object->attribute/functionQ前提是该变?Ҏ可访问?br />2. 直接调用cL?变量Qclass::attribute/functionQ无论是静?非静态都可以。但是有前提条gQ?br />    A. 如果是变量,需要该变量可访问?br />    B. 如果是方法,除了该方法可讉K外,q需要满I<br />        b1) 如果是静态方法,没有Ҏ条gQ?br />        b2) 如果是非静态方法,需要改Ҏ中没有?thisQ即没有调用非静态的变量/ҎQ当Ӟ调用静态的变量/Ҏ没有问题?br /><br />然后我们再看一下?object->... 和用class::... 都有什么区别:<br />1. 使用$object->... Q需要执行构造函数创建对象;<br />2. 使用class::... 调用静态方?变量Q不需要执行构造函数创建对象;<br />3. 使用class::... 调用非静态方?变量Q也不需要执行构造函数创建对象?br /><br />然后奇怪的地方出来了Q既??都一P那静态方?变量存在q有什么意义呢Q?br />差异q是昄存在的,如下Q?br />1. 静态变?br />静态成员只保留一个变量|而这个变量值对所有的实例都是有效Q也是_所有的实例׃nq个成员?br />2. 静态方?br />静态方法可以直接用class::... 来调用,而非静态方法需要满一定限制条件才能用class::.. 的方法调用,如之前所q?br /><br /><img src ="http://www.shnenglu.com/amazon/aggbug/157966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2011-10-10 14:54 <a href="http://www.shnenglu.com/amazon/archive/2011/10/10/157966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP中基于对象和cȝ基本函数http://www.shnenglu.com/amazon/archive/2011/10/10/157955.htmlq风q风Mon, 10 Oct 2011 05:13:00 GMThttp://www.shnenglu.com/amazon/archive/2011/10/10/157955.htmlhttp://www.shnenglu.com/amazon/comments/157955.htmlhttp://www.shnenglu.com/amazon/archive/2011/10/10/157955.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/157955.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/157955.html1. class_exists($class_name)

查该cL否已l定义,q回true / false?br />
2. get_class_methods($class_name)

q回指定cM定义的publicҎ名所l成的数l,如果该类不存在返回NULL?br />
3. get_class_vars($class_name)

q回指定cM定义的public属性名所l成的关联数l,其中属性名为keyQ属性gؓvalueQ如果该cM存在q回NULL?br />
4. get_class($object)

q回对象所属类的名Uͼ如果$object不是对象则返回false?br />
5. method_exists($object / $class_name, $method_name)

判断在指定的对象或者类中是否存在该函数Q无论publicq是protected、privateQ,如果该对象或者类不存在,或者函C存在Q都q回false?br />
6. get_object_vars($object)

q回指定对象中public属性名所l成的关联数l,其中属性名为keyQ属性gؓvalueQ如果该对象不存在返回NULL?br />
7. get_parent_class($object / $class_name)

获取该对象或者类的父cdU?br />
8. is_subclass_of($object, $class_name) / is_a($object, $class_name)

对于is_subclass_of()Q如果该对象所属类是某cȝ子类Q返回trueQ如果对象不存在、类不存在或者无父子关系Q一律返回false?br />对于is_a()Q如果该对象所属类与指定类相同或者存在子->父关p,则返回trueQ否则一律返回false?br />


q风 2011-10-10 13:13 发表评论
]]>
PHP的魔术函数和术帔Rhttp://www.shnenglu.com/amazon/archive/2011/10/10/157950.htmlq风q风Mon, 10 Oct 2011 04:18:00 GMThttp://www.shnenglu.com/amazon/archive/2011/10/10/157950.htmlhttp://www.shnenglu.com/amazon/comments/157950.htmlhttp://www.shnenglu.com/amazon/archive/2011/10/10/157950.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/157950.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/157950.html术ҎQ?br />
PHP把类中所有以__Q两个下划线Q开头的Ҏ当成术ҎQ一般徏议用户不要将自定义的Ҏ前面加上__作ؓ前缀。魔术方法:

1. __construct()

cȝ默认构造方法,如果__construct()和与cd名的Ҏ共同出现Ӟ默认调用__construct()而不是同cdҎ。一般情况下用户自定义构造方法也会用__construct()?br />
2. __destruct()

cȝ析构函数Q当该对象的所有引用都被删除,或者对象被昑ּ销毁时执行?br />
3. __get($name)

可以单归UؓQ用$object->a的方式读取对象的属性时Q如果属性a存在且是public型,那么直接q回该属性的|如果属性a不存在或者是protected/privateq样的不可直接访问的cdQ就会调用__get($name)Ҏq以q回gؓ准。一般可以用该Ҏ使外部可限制性地讉K内部属性,或者完成类似java中的反射操作?br />
4. __set($name, $value)

与__get($name)cMQ用$object->a = 17的方式给属性赋值时Q如果属性a存在且是public型,那么直接l属性a赋值皆可;如果属性a不存在或者是protected/private型,׃调用__set($name, $value)Ҏ?br />
5. __call($name, $arguments) / __callStatic($name, $arguments)

当调用不存在或者不可访问的ҎӞ会调用__call($name, $arguments)Ҏ。而当在静态方法中调用不存在或者不可访问的ҎӞ会调用__callStatic($name, $arguments)Ҏ?br />
6. __toString()

当打印对象时会被直接调用。如echo $object;

7. __clone()

当对象被拯时直接调用。如$a = new Action(); $a = $object;

8. __isset($name) / __unset($name)

对不存在或者不可访问的属性用isset()或者empty()Ӟ__isset()会被调用Q当unset一个不存在或者不可访问的属性时Q__unset()会被调用Q否则直接unset该属性皆可?br />
9. __set_state()

用var_export()输出一个对象时Q__set_state()会被调用Q输出内容以该魔术方法的q回gؓ准。注Qvar_export()和var_dump()cMQ只是var_export()输出的内容符合php语法?/span>注意使用ҎQ?/span>

$test = new Test();
$b = var_export($test, true);
var_dump($b);

class Test {

    public $a;
    public static function __set_state($array) {
        $ab = new Test();
        $ab->a = 10;
        return $ab;
    }
}


10. __autoload($name)

实例化一个对象时Q如果对应的cM存在Q则该方法被调用。注意:该方法是全局函数Q参数是cȝ名称?br />
11. __sleep() / __wakup()

略?br />

术帔RQ?/strong>

1. __LINE__

q回文g中的当前行号?br />
2. __FILE__

q回所在文件的完整路径?br />
3. __FUNCTION__

q回所在函数名U?br />
4. __CLASS__

q回所在类的名U?br />
5. __METHOD__

q回所在类Ҏ的名U。需要注意__METHOD__q回的是"class::function"的Ş式,而__FUNCTION__则返?function"的Ş式?br />


q风 2011-10-10 12:18 发表评论
]]>
PHP中引用的解释http://www.shnenglu.com/amazon/archive/2011/10/10/157941.htmlq风q风Mon, 10 Oct 2011 03:01:00 GMThttp://www.shnenglu.com/amazon/archive/2011/10/10/157941.htmlhttp://www.shnenglu.com/amazon/comments/157941.htmlhttp://www.shnenglu.com/amazon/archive/2011/10/10/157941.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/157941.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/157941.htmlq篇随笔主要是对《PHP5中文手册》内容中"引用的解?一文的摘要。阅M后让我大致明白了引用在PHP语言中的用途和Ҏ?br />
1. PHP中引用的Ҏ?br />
首先QPHP中的引用不是C的指针,可以把它惌成UNIX文gpȝ中对文g的链接,是变量的另外一个别名或者映。例如:$b = &$a中,$b?a都只是一个变量名Uͼ此操作$b?a都映到同一个变量内容;$b = &$c则是?b重新映射到另外一个变量内容,?a再无关系Qunset($a)只是断开?a到变量内容的映射Q但变量内容q没有被释放Q依然可以?b来访问,一?b也unset了,那么该变量内容在没有M映射的情况下会被释放?br />
2. 函数中global $a的作?br />
在函Cl常会见到global $a,$bq样的语句,其实质是?_GLOBAL变量的一U引用,具体可以写成如下语句Q?br />$a = &$_GLOBAL['a'];
$b = &$_GLOBAL['b'];
?_GLOBAL['a']?_GLOBAL['b']则分别对应全局作用域中$a?b变量Q在函数中对$a?b的修改会触发函数外部$a?b的变量内容的修改?br />如果在函数内部做如下操作Q?br />$c = array(1,2,3);
$a = &$c;
那么实际上就是改变了$a的映关p,之前?_GLOBAL['a']的映就断开了,再也无法修改函数外部$a的内宏V此Ҏ也同样作用在用引用传递函数参数的例子中?br />另外Q需要注意在函数中unset($a)不会真正释放变量内容Q可以看做只是断开了函数内?a的映而已?br />
3.函数的引用传?br />
引用传递的定义必须在函数定义中体现Q在函数使用中,不要写成foo(&$a)的样子,否则会报"Call-time pass-by-referenceq时"的警报?br />如下情况可以使用引用传递:
A. 变量Q如foo($a)
B. New语句Q如foo(new Action())
C. 函数的引用返回,如foo(bar())Q其中bar()是函敎ͼ定义为:function &bar() {$a = 5; return $a;}
其余情况不可作ؓ引用传递,较常见的比如表达式、常量、无引用的函数返回?br />
4.函数的引用返?br />
引用q回需要注意用Ş式,在定义时如下Q?br />function &bar() {
   $a = 5;
   return $a;
}
在用时如下Q?br />$ret = &bar();
也就是说Q定义和使用旉需要加&W号?br />
5.对象的赋g?br />
其需要注意的是,在PHP4和PHP5中对象资源的赋g递是有区别的?br />PHP4中:
$a = new Object() 实际?a和new Object()的映到不同对象实例Q所以需要显式地使用$a = & new Object()来进行引用赋g递?br />$b = $a 同上?br />foo(new Object()) / foo($a) 同上?br />foo() {$a = new Object(); return $a} 同上?br />PHP5中:
$a = new Object() 两者映到同一对象Q不需要用引用符?br />$b = $a 同上?br />foo(new Object()) / foo($a) 同上?br />foo() {$a = new Object(); return $a} 同上?br />PSQ在q行试的时候,发现一个有的现象Q?a = new Object(); $b = $a后,如果$a->attr = 12; $b->attr = 13Q那么最后的l果竟然?a->attr?b->attr都等?3Q而不是想象中的各自独立,W者估?a->attr?b->attrq没有做深拷贝,仍是同一块内存的不同映射。该论点待考证。当Ӟ如果?a = new Object(); $b = &$a; 则不存在该疑惑,因ؓ从头到尾只有一个真实对象,$a?b都只是映而已?br />
6.unset?null

使用unset($a)?a=null的结果是不一L。如果该块内存只?a一个映,那么unset($a)?a=null{hQ该内存的引用计数变?Q被自动回收Q如果该块内存有$a?b两个映射Q那么unset($a)导?a=null?b不变的情况,?a=null会导?a=$b=null的情c?br />原因Q某变量赋gؓnullQ将D该变量对应的内存块的引用计数直接|ؓ0Q被自动回收?br />



q风 2011-10-10 11:01 发表评论
]]>
PHP常用函数【{载?/title><link>http://www.shnenglu.com/amazon/archive/2011/10/08/157780.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Sat, 08 Oct 2011 04:46:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2011/10/08/157780.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/157780.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2011/10/08/157780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/157780.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/157780.html</trackback:ping><description><![CDATA[<div><strong>原文出处Q?/strong><a ><strong>http://blog.sina.com.cn/s/blog_5d8945610100i5fq.html</strong></a><br /><br /> <p><strong><strong></strong>1.数组函数</strong></p> <p><a ><font color="#437b40">array_product()</font></a> <wbr> 计算数组中所有值的乘积?/p> <p><a ><font color="#437b40">array_search()</font></a> <wbr> 在数l中搜烦l定的|如果成功则返回相应的键名?/p> <p><a ><font color="#437b40">array_unique()</font></a> <wbr> 删除数组中重复的倹{?/p> <p><a ><font color="#437b40">extract()</font></a> <wbr> 从数l中变量导入到当前的符可?br /><a ><font color="#437b40">in_array()</font></a> <wbr> <wbr> 查数l中是否存在指定的倹{?/p> <p><a ><font color="#437b40">array_count_values()</font></a> <wbr> 用于l计数组中所有值出现的ơ数?/p> <p><a ><font color="#437b40">array_key_exists()</font></a> <wbr> 查给定的键名或烦引是否存在于数组中?/p> <p><a ><font color="#437b40">array_sum()</font></a> <wbr> 计算数组中所有值的和?/p> <p><strong>2.文g函数</strong></p> <p><a ><font color="#437b40">basename()</font></a> <wbr> q回路径中的文g名部分?/p> <p><a ><font color="#437b40">dirname()</font></a> <wbr> q回路径中的目录名称部分?/p> <p><a ><font color="#437b40">feof()</font></a> <wbr> 试文g指针是否C文gl束的位|?/p> <p><a ><font color="#437b40">fflush()</font></a> <wbr> 向打开的文件输出缓冲内宏V?/p> <p><a ><font color="#437b40">file()</font></a> <wbr> 把文件读入一个数l中?/p> <p><a ><font color="#437b40">file_exists()</font></a> <wbr> 查文件或目录是否存在?/p> <p><a ><font color="#437b40">file_get_contents()</font></a> <wbr> 文件读入字W串?/p> <p><a ><font color="#437b40">file_put_contents</font></a> <wbr> 字W串写入文g?/p> <p><a ><font color="#437b40">filesize()</font></a> <wbr> q回文g大小?/p> <p><a ><font color="#437b40">filetype()</font></a> <wbr> q回文gcd?/p> <p><a ><font color="#437b40">flock()</font></a> <wbr> 锁定或释放文件?/p> <p><a ><font color="#437b40">is_dir()</font></a> <wbr>判断指定的文件名是否是一个目录?/p> <p><a ><font color="#437b40">is_executable()</font></a> <wbr> 判断文g是否可执行?/p> <p><a ><font color="#437b40">parse_ini_file()</font></a> <wbr> 解析一个配|文件?/p> <p><a ><strong><font color="#22b14c">tempnam()</font></strong></a><strong><font color="#22b14c"> <wbr> 创徏唯一的时文件?/font></strong></p> <p><a ><strong><font color="#22b14c">tmpfile()</font></strong></a><strong><font color="#22b14c"> <wbr> 建立临时文g?/font></strong></p> <p><a ><font color="#437b40">touch()</font></a> <wbr> 讄文g的访问和修改旉?wbr></p> <p><strong>3.字符串函?/strong></p> <p><a ><font color="#437b40">addslashes()</font></a> <wbr> 在指定的预定义字W前d反斜杠?/p> <p><a ><font color="#437b40">chr()</font></a> <wbr> 从指定的 ASCII D回字W?/p> <p><a ><font color="#437b40">convert_uuencode()</font></a> <wbr> 使用 uuencode 法对字W串q行~码?/p> <p><a ><font color="#437b40">convert_uudecode()</font></a> <wbr> ?uuencode ~码的字W串q行解码?/p> <p><a ><font color="#437b40">crc32()</font></a> <wbr> 计算一个字W串?32-bit CRC?/p> <p><a ><font color="#437b40">crypt()</font></a> <wbr> 单向的字W串加密?(hashing)?/p> <p><a ><font color="#437b40">explode()</font></a> <wbr> 把字W串打散为数l?/p> <p><a ><font color="#437b40">htmlentities()</font></a> <wbr> 把字W{换ؓ HTML 实体?/p> <p><a ><font color="#437b40">htmlspecialchars_decode()</font></a> <wbr> 把一些预定义?HTML 实体转换为字W?/p> <p><a ><font color="#437b40">htmlspecialchars()</font></a> <wbr> <wbr> 把一些预定义的字W{换ؓ HTML 实体?/p> <p><a ><font color="#437b40">implode()</font></a> <wbr> 把数l元素组合ؓ一个字W串?/p> <p><a ><font color="#437b40">md5()</font></a> <wbr> 计算字符串的 MD5 散列?/p> <p><a ><font color="#437b40">md5_file()</font></a> <wbr> 计算文g?MD5 散列?/p> <p><a ><font color="#437b40">nl2br()</font></a> <wbr> 在字W串中的每个新行之前插入 HTML 换行W?/p> <p><a ><font color="#437b40">number_format()</font></a> <wbr> 通过千位分组来格式化数字?/p> <p><a ><font color="#437b40">ord()</font></a> <wbr> q回字符串第一个字W的 ASCII 倹{?/p> <p><a ><font color="#437b40">parse_str()</font></a> <wbr> 把查询字W串解析到变量中?/p> <p><a ><font color="#437b40">str_ireplace()</font></a> <wbr> 替换字符串中的一些字W。(对大写不敏感)</p> <p><a ><font color="#437b40">str_shuffle()</font></a> <wbr> 随机地打乱字W串中的所有字W?/p> <p><a ><font color="#437b40">str_split()</font></a> <wbr> 把字W串分割到数l中?/p> <p><a ><font color="#437b40">str_word_count()</font></a> <wbr> 计算字符串中的单词数?/p> <p><a ><font color="#437b40">strcasecmp()</font></a> <wbr> 比较两个字符丌Ӏ(对大写不敏感)</p> <p><a ><font color="#437b40">strchr()</font></a> <wbr> 搜烦字符串在另一字符串中的第一ơ出现。strstr() 的别?/p> <p><a ><font color="#437b40">strcmp()</font></a> <wbr> 比较两个字符丌Ӏ(对大写敏感Q?/p> <p><a ><font color="#437b40">strip_tags()</font></a> <wbr> 剥去 HTML、XML 以及 PHP 的标{?/p> <p><a ><font color="#437b40">stripslashes()</font></a> <wbr> 删除?addslashes() 函数d的反斜杠?/p> <p><a ><font color="#437b40">stripos()</font></a> <wbr> q回字符串在另一字符串中W一ơ出现的位置(大小写不敏感)</p> <p><a ><font color="#437b40">strpos()</font></a> <wbr> q回字符串在另一字符串中首次出现的位|(对大写敏感Q?/p> <p><a ><font color="#437b40">strrev()</font></a> <wbr> 反{字符丌Ӏ?/p> <p><a ><font color="#437b40">strtolower()</font></a> <wbr> 把字W串转换为小写?/p> <p><a ><font color="#437b40">strtoupper()</font></a> <wbr> 把字W串转换为大写?/p> <p><a ><font color="#437b40">substr()</font></a> <wbr> q回字符串的一部分?/p> <p><a ><font color="#437b40">substr_replace()</font></a> <wbr> 把字W串的一部分替换为另一个字W串?/p> <p><a ><font color="#437b40">ucwords()</font></a> <wbr> 把字W串中每个单词的首字W{换ؓ大写?/p> <p><strong><font color="#22b14c">parse_url(); 解析URLQ返回数l,[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 ><font color="#437b40">convert_uuencode()</font></a> <wbr> 使用 uuencode 法对字W串q行~码?/p> <p><a ><font color="#437b40">convert_uudecode()</font></a> <wbr> ?uuencode ~码的字W串q行解码?/p> <p><strong>5.正则表达?/strong></p> <p>[^a-z] <wbr> a-z之外的字W?/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(); <wbr> 转化为整?/p> <p>strval(); <wbr> 转化为字W串</p> <p>settype($input,integer); 讄cd</p> <p><strong>7.~冲区控制函?/strong></p> <p><strong>flush</strong> — h输出~冲?br />保存在输出缓冲区的内容会被发送到览?br /><strong>ob_start</strong> — 打开输出~冲?br />q样所有的输出信息不在直接发送到览器,而是保存在输出缓冲区里面<br /><strong>ob_get_contents</strong> — q回输出~冲区的内容<br />如果你想以后处理输出的内容,可以调用q个函数保留一个备?br /><strong>ob_get_length</strong> — q回输出~冲区的内容长度<br /><strong>ob_end_flush</strong> — l束Q发送)输出~冲区的内容Q关闭输出缓冲区<br /><strong>ob_end_clean</strong> — 删除Q放弃)输出~冲区的内容Q关闭输出缓冲区<br />如果你的E序发现输出内容有问题,可以攑ּ所有输出内容,可以防止泄漏某些U密信息<br /><strong>ob_implicit_flush</strong> — 打开或关闭直接刷?br />打开后,每个脚本输出都直接发送到览器,不再需要调?flush(),</p></div><img src ="http://www.shnenglu.com/amazon/aggbug/157780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2011-10-08 12:46 <a href="http://www.shnenglu.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.shnenglu.com/amazon/archive/2011/10/08/157777.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Sat, 08 Oct 2011 04:44:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2011/10/08/157777.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/157777.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2011/10/08/157777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/157777.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/157777.html</trackback:ping><description><![CDATA[<strong>原文出处Q?/strong><a ><strong>http://www.kuqin.com/web/20110726/92745.html</strong></a><br /><br />0、用单引号代替双引号来包含字W串Q这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量Q单引号则不会,注意Q只有echo能这么做Q它是一U可以把多个字符串当作参数的“函数”(译注QPHP手册中说echo是语al构Q不是真正的函数Q故把函数加上了双引??<br /><span style="color: red">PSQ在单引号中QPHP不会自动搜寻变量、{义字W等Q因此效率上快很多?/span><br /> <p>1、如果能类的方法定义成staticQ就量定义成staticQ它的速度会提升将q?倍?br /><span style="color: red">PSQ事实上Qfunction、method、static method的速度不会有太大差异。具体可?#8220;<a id="viewpost1_TitleUrl" href="http://www.shnenglu.com/amazon/archive/2011/09/30/157213.html"><font color="#808080"><span style="color: red">PHP函数的实现原理及性能分析【{载?/span></font></a></span><span style="color: red">”</span><span style="color: red">一文?/span></p> <p>2?row[’id’] 的速度?row[id]?倍?br /><span style="color: red">PSQ不太懂Q貌似差异只有后者会先判断idq个宏是否存在,如果不存在则自动转变为字W串?/span></p> <p>3、echo ?print 快,q且使用echo的多重参?译注Q指用逗号而不是句?代替字符串连接,比如echo $str1,$str2?/p> <p>4、在执行for循环之前定最大@环数Q不要每循环一ơ都计算最大|最好运用foreach代替?br /><span style="color: red">PSQ像count、strlenq样的操作其实是O(1)的,因此不会带来太多消耗,当然避免每次循环都计是比较好的{略。最好用foreach代替forQ这个效率更高,如果考虑到foreach($array as $var)每次拯的消耗,可以使用foreach($array as &$var)q样的引用?/span></p> <p>5、注销那些不用的变量尤其是大数l,以便释放内存?br /><span style="color: red">PSQ如果没有记错的话,unset($array)不会立刻释放内存Q但随时释放是个好习惯?/span></p> <p>6、尽量避免用__getQ__setQ__autoload?/p> <p>7、require_once()代h昂贵?br /><span style="color: red">PSQrequire_once和include_once需要判重,因此效率上要低,但是5.2版本后效率问题已l基本解冟?/span></p> <p>8、include文g时尽量用绝对\径,因ؓ它避免了PHP去include_path里查找文件的速度Q解析操作系l\径所需的时间会更少?br /><span style="color: red">PSQ支持,量用iniset()来设|include_path?/span></p> <p>9、如果你想知道脚本开始执?译注Q即服务器端收到客户端请?的时刻,使用$_SERVER['REQUEST_TIME']要好于time()?br /><span style="color: red">PSQ?_SERVER['REQUEST_TIME']保存了发赯h时刻的时间戳Q而time()则返回当前时ȝUnix旉戟?/span></p> <p>10、函C替正则表辑ּ完成相同功能?br /><span style="color: red">PSQ这U函数是指strtok、strstr、strpos、str_replace、substr、explode、implode{等?/span></p> <p>11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍?br /><span style="color: red">PSQ字W串操作比正则替换要快?/span></p> <p>12、如果一个字W串替换函数Q可接受数组或字W作为参敎ͼq且参数长度不太长,那么可以考虑额外写一D|换代码,使得每次传递参数是一个字W,而不是只写一行代码接受数l作为查询和替换的参数?br /><span style="color: red">PSQ需要考虑到内|函数和用户自定义函数的开销差异Q恐怕这U做法得不偿失?/span><br /></p> <p>13、用选择分支语句(译注Q即switch case)好于使用多个ifQelse if语句?br /><span style="color: red">PSQphp中switch支持数值和字符串变量,比C的switch要好用,使用?/span></p> <p>14、用@屏蔽错误消息的做法非怽效,极其低效?br /><span style="color: red">PSQ有什么替代方法吗Q没有的话还是不得不用的……</span></p> <p>15、打开apache的mod_deflate模块Q可以提高网늚览速度?/p> <p>16、数据库q接当用完毕时应关掉,不要用长q接?br /><span style="color: red">PSQ在q接之前Q最好设|一下相应的时机制Q例如链接超时、读写超时、等待超时等?/span></p> <p>17、错误消息代hc?/p> <p>18、在Ҏ中递增局部变量,速度是最快的。几乎与在函C调用局部变量的速度相当?/p> <p>19、递增一个全局变量要比递增一个局部变量慢2倍?/p> <p>20、递增一个对象属?如:$this->prop++)要比递增一个局部变量慢3倍?/p> <div id="rtrdv3p" class="word"> <p>21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9?0倍?/p> <p>22、仅定义一个局部变量而没在函C调用它,同样会减慢速度(其程度相当于递增一个局部变?。PHP大概会检查看是否存在全局变量?/p> <p>23、方法调用看来与cM定义的方法的数量无关Q因为我(在测试方法之前和之后?d?0个方法,但性能上没有变化?/p> <p>24、派生类中的Ҏq行h要快于在基类中定义的同样的方法?/p> <p>25、调用带有一个参数的I函敎ͼ其花费的旉相当于执??ơ的局部变量递增操作。类似的Ҏ调用所p的时间接q于15ơ的局部变量递增操作?/p> <p>26、Apache解析一个PHP脚本的时间要比解析一个静态HTML面??0倍。尽量多用静态HTML面Q少用脚本?/p> <p>27、除非脚本可以缓存,否则每次调用旉会重新编译一ơ。引入一套PHP~存机制通常可以提升25%?00%的性能Q以免除~译开销?/p> <p>28、尽量做~存Q可使用memcached。memcached是一N性能的内存对象缓存系l,可用来加速动态Web应用E序Q减L据库负蝲。对q算?(OP code)的缓存很有用Q得脚本不必ؓ每个h做重新编译?/p> <p>29、当操作字符串ƈ需要检验其长度是否满某种要求Ӟ你想当然C使用strlen()函数。此函数执行h相当快,因ؓ它不做Q何计,只返回在zval l构(C的内|数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,׃strlen()是函敎ͼ多多少会有些慢Q因为函数调用会l过诸多步骤Q如字母写?译注Q指函数名小写化QPHP不区分函数名大小?、哈希查找,会跟随被调用的函Ch行。在某些情况下,你可以用isset() 技巧加速执行你的代码?/p> <p>  (举例如下)</p> <p>  if (strlen($foo) < 5) { echo “Foo is too short”$$ }</p> <p>  (与下面的技巧做比较)</p> <p>  if (!isset($foo{5})) { echo “Foo is too short”$$ }</p> <p>  调用isset()恰y比strlen()快,因ؓ与后者不同的是,isset()作ؓ一U语al构Q意味着它的执行不需要函数查扑֒字母写化。也是_实际上在验字W串长度的顶层代码中你没有花太多开销?br /><span style="color: red">PSQ长见识了?/span><br /></p> <p>30、当执行变量$i的递增或递减Ӟ$i++会比++$i慢一些。这U差异是PHPҎ的,q不适用于其他语aQ所以请不要修改你的C或Java代码q指望它们能立即变快Q没用的?+$i更快是因为它只需?条指?opcodes)Q?i++则需?条指令。后|递增实际上会产生一个时变量,q个临时变量随后被递增。而前|递增直接在原g递增。这是最优化处理的一U,正如Zend的PHP优化器所作的那样。牢记这个优化处理不׃ؓ一个好LQ因为ƈ不是所有的指o优化器都会做同样的优化处理,q且存在大量没有装配指o优化器的互联|服务提供商(ISPs)和服务器?/p> <p>31、ƈ不是事必面向对象(OOP)Q面向对象往往开销很大Q每个方法和对象调用都会消耗很多内存?/p> <p>32、ƈ非要用类实现所有的数据l构Q数l也很有用?/p> <p>33、不要把Ҏl分得过多,仔细x你真正打重用的是哪些代?</p> <p>34、当你需要时Q你总能把代码分解成Ҏ?br /><span style="color: red">PSQ分解成Ҏ要适当Q行数少使用频率高的Ҏ量用直接写代码Q可以减函数堆栈开销Q且Ҏ嵌套不宜q深Q否则大大媄响PHP的运行效率?/span></p> <p>35、尽量采用大量的PHP内置函数?/p></div> <div id="39phrjr" class="word"> <p>36、如果在代码中存在大量耗时的函敎ͼ你可以考虑用C扩展的方式实现它们?/p> <p>37、评估检?profile)你的代码。检验器会告诉你Q代码的哪些部分消耗了多少旉。Xdebug调试器包含了验程序,评估验M上可以显C出代码的瓶颈?/p> <p>38、mod_zip可作为Apache模块Q用来即时压~你的数据,q可让数据传输量降低80%?/p> <p>39、在可以用file_get_contents替代file、fopen、feof、fgets{系列方法的情况下,量用file_get_contentsQ因Z的效率高得多!但是要注意file_get_contents在打开一个URL文g时候的PHP版本问题;<br /><span style="color: red">PSQ这个要CQ尽量用file_get_contents和file_put_contentsQ不需要自己判断文件句柄打开是否成功?/span></p> <p>40、尽量的进行文件操作,虽然PHP的文件操作效率也不低?</p> <p>41、优化Select SQL语句Q在可能的情况下量的q行Insert、Update操作(在update上,我被恶批q?;</p> <p>42、尽可能的用PHP内部函数(但是我却Z找个PHP里面不存在的函数Q浪费了本可以写Z个自定义函数的时_l验问题?);<br /><span style="color: red">PSQ内|函数比用户自定义函数效率高了将q一个数量?/span></p> <p>43、@环内部不要声明变量,其是大变量Q对?q好像不只是PHP里面要注意的问题?);<br /><span style="color: red">PSQ这个必ȝQ变量过多或者过大时Q每ơ重分配的开销无法忽略?/span></p> <p>44、多l数l尽量不要@环嵌套赋?</p> <p>45、在可以用PHP内部字符串操作函数的情况下,不要用正则表辑ּ;</p> <p>46、foreach效率更高Q尽量用foreach代替while和for循环;</p> <p>47、用单引h代双引号引用字符?<br /><span style="color: red">PSQ晕Q这个不是W一条吗Q?/span></p> <p>48?#8220;用i+=1代替i=i+1。符合c/c++的习惯,效率q高”;</p> <p>49、对global变量Q应该用完就unset()?</p></div><br /><img src ="http://www.shnenglu.com/amazon/aggbug/157777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2011-10-08 12:44 <a href="http://www.shnenglu.com/amazon/archive/2011/10/08/157777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP讉KMySQL查询时处理【{载?/title><link>http://www.shnenglu.com/amazon/archive/2011/09/30/157217.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Fri, 30 Sep 2011 03:50:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2011/09/30/157217.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/157217.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2011/09/30/157217.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/157217.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/157217.html</trackback:ping><description><![CDATA[<p><strong>转蝲出处Q?/strong><a ><strong>http://blog.csdn.net/heiyeshuwu/article/details/5869813</strong></a><br /><br />PHPq接MySQL主要是用Mysql提供?libmysqlclient 的客L库,同时也g伸出?mysql ?nbsp; mysqli 两套PHP的扩展,相对来说 mysqli ?mysql 更好Q更E_。目前两个客L扩展库连接超时可以设|选项来操作,比如mysqliQ?/p> <p> </p> <blockquote> <p><span style="font-family: Arial; font-size: 10pt"><?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->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);</span></p> <p><span style="font-family: Arial; font-size: 10pt">//q接</span><br /><span style="font-family: Arial; font-size: 10pt">$mysqli->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">    printf("Connect failed: %s/n", mysqli_connect_error());</span><br /><span style="font-family: Arial; font-size: 10pt">    exit();</span><br /><span style="font-family: Arial; font-size: 10pt">}</span><br /><span style="font-family: Arial; font-size: 10pt">//成功输出q接信息</span><br /><span style="font-family: Arial; font-size: 10pt">printf ("Connection: %s/n.", $mysqli->host_info);</span></p> <p><span style="font-family: Arial; font-size: 10pt">$mysqli->close();</span><br /><span style="font-family: Arial; font-size: 10pt">?> </span></p></blockquote> <p> </p> <p>q个是连接超Ӟ但是有些时候我们需要查询读写超Ӟ比如说我们一个数据库压力很大Q或者连接很多,那么数据库查询就很缓慢,但是我希望某些不重要的数据,比如说文章点Lq种如果查询时了就不显C,臛_能够保证M面正确昄Q但是查遍PHP手册没有发现q个操作选项或者函数。手册里只有q么四个选项Q?/p> <p> </p> <p><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_1283878334644u.jpg" width="558" height="169" /></p> <p> </p> <p>跟踪 mysqli 的扩展源代码发现它底层调用的?libmysqlclient ?mysql_optionsQ?/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> </p> <p>q且在mysqli的PHP扩展中就只导Z几个变量Q?/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> </p> <p>大概看了一?libmysqlclient 的代码,发现其实它自带是有读写超时设|的Q?/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> </p> <p>因ؓ它自己定义了很多操作选项Q只是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> </p> <p><span style="font-family: Arial">看看mysql中的d时是如何实现的Q?/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> </p> <p><img alt="" src="http://hi.csdn.net/attachment/201009/7/12159_12838783347615.jpg" width="471" height="181" /></p> <p> </p> <p><span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">d时真正操作的地方,<span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">时处理q里重试了两ơ,q是写死了:</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">按照上面查看代码来看Q目前PHP针对MySQL查询时以下限制Q?/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. 时讄单位为秒Q最配|?U?/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 U?/span></p> <p style="text-align: left; margin: 0cm 0cm 0pt 12pt" align="left"> </p> <p style="text-align: left; margin: 0cm 0cm 0pt 12pt" align="left"><span style="font-family: Arial; color: #984806; font-size: 10pt">重试两次 + 自n一?= 3倍超时时间?/span></p> <p> </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">U,不会低于q个|对于大部分应用来说可以接受,但是对于部分应用需要优化?/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">现在我们来看看如果我们自p讄时Q我们自己压?<span style="font-family: Arial; color: #984806; font-size: 10pt">MYSQL_OPT_READ_TIMEOUT <span style="font-family: Arial; color: #000000; font-size: 10pt">也是可以辑ֈd时效果的,写一D代码来试一下:</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"><?php<br /></span><span style="font-family: Arial; font-size: 10pt">//自己定义d时帔R<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">        define('MYSQL_OPT_READ_TIMEOUT',  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">        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->options(MYSQL_OPT_READ_TIMEOUT, 3);<br /></span><span style="font-family: Arial; font-size: 10pt">$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT, 1);</span></span></p> <p><span style="font-size: small"><span style="font-family: Arial; font-size: 10pt">//q接数据?br /></span><span style="font-family: Arial; font-size: 10pt">$mysqli->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">   printf("Connect failed: %s/n", mysqli_connect_error());<br /></span><span style="font-family: Arial; font-size: 10pt">   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 1U不时<br /></span><span style="font-family: Arial; font-size: 10pt">printf("Host information: %s/n", $mysqli->host_info);<br /></span><span style="font-family: Arial; font-size: 10pt">if (!($res=$mysqli->query('select sleep(1)'))) {<br /></span><span style="font-family: Arial; font-size: 10pt">    echo "query1 error: ". $mysqli->error ."/n";<br /></span><span style="font-family: Arial; font-size: 10pt">} else {<br /></span><span style="font-family: Arial; font-size: 10pt">    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 9U会时<br /></span><span style="font-family: Arial; font-size: 10pt">if (!($res=$mysqli->query('select sleep(9)'))) {<br /></span><span style="font-family: Arial; font-size: 10pt">    echo "query2 error: ". $mysqli->error ."/n";<br /></span><span style="font-family: Arial; font-size: 10pt">} else {<br /></span><span style="font-family: Arial; font-size: 10pt">    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->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">?></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">查看上面代码的执行结果,验证了上面的观点Q第一个查询成功了Q第二个查询q接被断开了:</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>  </p> <p>基本上到q里基本能够解决PHP在针对MySQLd查询操作时的处理了Q希望对你有帮助?br /><br /><br /><span style="color: red">// #####################################################</span><br /><span style="color: red">// #####################################################</span><br /><br /><span style="color: red">本h按照作者的Ҏ~代码,q行时在$mysqli->options(MYSQL_OPT_READ_TIMEOUT, 3);q一步就q回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">q个函数的作用是判断options值类型,其中有一D:</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_TIMEOUTq个宏,所以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">   ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_PP(mysql_value));</span><br /><span style="color: red">   break;</span><br /><span style="color: red">case IS_LONG:</span><br /><span style="color: red">   l_value = Z_LVAL_PP(mysql_value);</span><br /><span style="color: red">   ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value);</span><br /><span style="color: red">   break;</span><br /><span style="color: red">default:</span><br /><span style="color: red">   ret = 1;</span><br /><span style="color: red">   break;</span><br /><span style="color: red">}<br /></span><br />也就是说Q不会执行mysql_options()ҎQ而是直接q回false?/span><br /><br /><br /><br /><br /></p><img src ="http://www.shnenglu.com/amazon/aggbug/157217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2011-09-30 11:50 <a href="http://www.shnenglu.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.shnenglu.com/amazon/archive/2011/09/30/157213.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Fri, 30 Sep 2011 03:13:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2011/09/30/157213.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/157213.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2011/09/30/157213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/157213.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/157213.html</trackback:ping><description><![CDATA[<h4><span style="font-size: 10pt">转蝲出处Q?/span><a ><span style="font-size: 10pt">http://www.cnblogs.com/ghj1976/archive/2010/08/27/1809766.html</span></a></h4> <h4>前言</h4> <h4></h4> <p>在Q何语a中,函数都是最基本的组成单元。对于php的函敎ͼ它具有哪些特点?函数调用是怎么实现的?php函数的性能如何Q有什么用徏议?<br />本文从原理出发q行分析l合实际的性能试试对这些问题进行回{,在了解实现的同时更好的编写phpE序。同时也会对一些常见的php函数q行介绍? <h4><a name="php函数的分c?></a>php函数的分c?/h4> <h4></h4> <p>在php中,横向划分的话Q函数分Z大类Q?user function(用户函数) 和internal functionQ内|函敎ͼ?br />前者就是用户在E序中自定义的一些函数和ҎQ后者则是php本n提供的各cd函数Q比如sprintf、array_push{)?br />用户也可以通过扩展的方法来~写库函敎ͼq个在后面介绍?br />对于user functionQ又可以l分为functionQ函敎ͼ和methodQ类ҎQ,本文中将p三种函数分别q行分析和测试? <h4><a name="php函数的实?></a>php函数的实?/h4> <h4></h4> <p>一个php函数最l是如何执行Q这个流E是怎么L呢? <p>要回{这个问题,我们先来看看php代码的执行所l过的流E? <p><img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_128279258310WE.jpg" width="232" height="551" /> <p>从图1可以看到Qphp实现了一个典型的动态语a执行q程Q拿CD代码后Q经q词法解析、语法解析等阶段后,<br />源程序会被翻译成一个个指o(opcodes)Q然后ZEND虚拟机顺ơ执行这些指令完成操作。Php本n是用c实现的,<br />因此最l调用的也都是c的函敎ͼ实际上,我们可以把php看做是一个c开发的软g?br />通过上面描述不难看出Qphp中函数的执行也是被翻译成了opcodes来调用,每次函数调用实际上是执行了一条或多条指o? <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">其中Q?br />type标明了函数的cdQ用户函数、内|函数、重载函数?br />Common中包含函数的基本信息Q包括函数名Q参C息,</span><span style="font-family: Arial">函数标志Q普通函数、静态方法、抽象方法){内宏V?br />另外Q对于用户函敎ͼq有一个函数符可Q记录了内部变量{,q个在后面详述?</span><span style="font-family: Arial"><br />Zendl护了一个全局function_tableQ这是一个大的hash表。函数调用的时候会首先Ҏ函数名从表中扑ֈ对应的zend_function?br /></span><span style="font-family: Arial">当进行函数调用时候,虚拟ZҎtype的不同决定调用方法, </span><strong style="font-family: Arial">不同cd的函敎ͼ其执行原理是不相同的</strong> ?</p> <h5><a name="内置函数"></a>内置函数</h5> <p>内置函数Q其本质上就是真正的c函数Q每一个内|函敎ͼphp在最l编译后都会展开成ؓ一个名叫zif_xxxx的functionQ比如我们常见的sprintfQ?br />对应到底层就是zif_sprintf。Zend在执行的时候,如果发现是内|函敎ͼ则只是简单的做一个{发操作? <p>Zend提供了一pd的api供调用,包括参数获取、数l操作、内存分配等。内|函数的参数获取Q通过zend_parse_parametersҎ来实玎ͼ<br />对于数组、字W串{参敎ͼzend实现的是拷贝,因此q个效率是很高的。可以这栯Q对于php内置函数Q其效率和相应c函数几乎相同Q?br />唯一多了一ơ{发调用? <p>内置函数在php中都是通过so的方式进行动态加载,用户也可以根据需要自q写相应的soQ也是我们常说的扩展?br />ZEND提供了一pd的api供扩展用,下面是mysqli_real_query函数的C函数实现Q?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">   MY_MYSQL *mysql;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">   zval  *mysql_link;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">   char  *query = NULL;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">   int   query_len;</span></p> <p><span style="font-family: Arial; color: red; font-size: 10pt">   if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">      return;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">   }</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">   MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);</span></p> <p><span style="font-family: Arial; color: red; font-size: 10pt">   MYSQLI_DISABLE_MQ; /* disable multi statements/queries */</span></p> <p><span style="font-family: Arial; color: red; font-size: 10pt">   if (mysql_real_query(mysql->mysql, query, query_len)) {</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">      MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">      RETURN_FALSE;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">   }</span></p> <p><span style="font-family: Arial; color: red; font-size: 10pt">   if (!mysql_field_count(mysql->mysql)) {</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">      if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">         php_mysqli_report_index(query, mysqli_server_status(mysql->mysql) TSRMLS_CC);</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">      }</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">   }</span></p> <p><span style="font-family: Arial; color: red; font-size: 10pt">   RETURN_TRUE;</span><br /><span style="font-family: Arial; color: red; font-size: 10pt">}</span></p> <h5><a name="用户函数"></a>用户函数</h5> <p>和内|函数相比,用户通过php实现的自定义函数h完全不同的执行过E和实现原理。如前文所qͼ<br />我们知道php代码是被译成ؓ了一条条opcode来执行的Q用户函C不例外,实际中每个函数对应到一lopcodeQ?br />q组指o被保存在zend_function中。于是,用户函数的调用最l就是对应到一lopcodes的执行? <ul><li>局部变量的保存及递归的实?br />我们知道Q函数递归是通过堆栈来完成的。在php中,也是利用cM的方法来实现。Zend为每个php函数分配了一个活动符可(active_sym_table)Q?br />记录当前函数中所有局部变量的状态。所有的W号表通过堆栈的Ş式来l护Q每当有函数调用的时候,分配一个新的符可q入栈?br />当调用结束后当前W号表出栈。由此实C状态的保存和递归?</li></ul> <p>对于栈的l护Qzend在这里做了优化。预先分配一个长度ؓN的静态数l来模拟堆栈Q?br />q种通过静态数l来模拟动态数据结构的手法在我们自qE序中也l常有用,q种方式避免了每ơ调用带来的内存分配、销毁?br />ZEND只是在函数调用结束时当前栈的W号表数据clean掉即可?br />因ؓ静态数l长度ؓNQ一旦函数调用层ơ超qNQ程序不会出现栈溢出Q这U情况下zend׃q行W号表的分配、销毁,因此会导致性能下降很多?br />在zend里面QN目前取值是32。因此,我们~写phpE序的时候,函数调用层次最好不要超q?2?br />当然Q如果是web应用Q本w可以函数调用层ơ的深度? <ul><li>参数的传?br />和内|函数调用zend_parse_params来获取参C同,用户函数中参数的获取是通过指o来完成的。函数有几个参数对应几条指令?br />具体到实C是普通的变量赋倹{?br />通过上面的分析可以看出,和内|函数相比,׃是自q护堆栈表Q而且每条指o的执行也是一个c函数Q用户函数的性能相对会差很多Q?br />后面会有具体的对比分析。因此,如果一个功能有对应php内置函数实现的尽量不要自己重新写函数d现?</li></ul> <h5><a name="cL?></a>cL?/h5> <p>cL法其执行原理和用户函数是相同的,也是译成opcodes次调用。类的实玎ͼzend用一个数据结构zend_class_entry来实玎ͼ<br />里面保存了类相关的一些基本信息。这个entry是在php~译的时候就已经处理完成? <p>在zend_function的common中,有一个成员叫做scopeQ其指向的就是当前方法对应类的zend_class_entry。关于php中面向对象的实现Q?br />q里׃在做更详l的介绍Q今后将专门写一文章来详述php中面向对象的实现原理。就函数q一块来_method实现原理和function完全相同Q?br />理论上其性能也差不多Q后面我们将做详l的性能Ҏ? <h4>性能Ҏ</h4> <h4></h4> <h5><a name="函数名长度对性能的媄?></a>函数名长度对性能的媄?/h5> <ul><li>试Ҏ<br />对名字长度ؓ1????6的函数进行比较,试比较它们每秒可执行次敎ͼ定函数名长度对性能的媄?</li></ul> <ul><li>试l果如下?</li></ul> <p>       <img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_1282792586sLNv.jpg" width="558" height="289" /> <ul><li>l果分析<br />从图上可以看出,函数名的长度Ҏ能q是会有一定的影响。一个长度ؓ1的函数和长度?6?<strong>I函数调?/strong> Q其性能差了1倍?br />分析一下源码不难找到原因,如前面叙q所_函数调用的时候zend会先在一个全局的funtion_table中通过函数名查询相关信息,<br />function_table是一个哈希表。必然的Q名字越长查询所需要的旉p多?<br /><strong>因此Q在实际~写E序的时候,对多ơ调用的函数Q名字徏议不要太?/strong> </li></ul> <p>虽然函数名长度对性能有一定媄响,但具体有多大呢?q个问题应该q是需要结合实际情冉|考虑Q如果一个函数本w比较复杂的话,<br />那么Ҏ体的性能影响q不大?br />一个徏议是对于那些会调用很多次Q本w功能又比较单的函数Q可以适当取一些言意赅的名字? <h5><a name="函数个数Ҏ能的媄?></a>函数个数Ҏ能的媄?/h5> <ul><li>试Ҏ<br />在以下三U环境下q行函数调用试Q分析结果:1.E序仅包?个函?2.E序包含100个函?3.E序包含1000个函数?br />试q三U情况下每秒所能调用的函数ơ数 </li></ul> <ul><li>试l果如下?</li></ul> <p>        <img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_1282792585zaua.jpg" width="489" height="293" /> <ul><li>l果分析<br />从测试结果可以看出,q三U情况下性能几乎相同Q函C数增加时性能下降微乎其微Q可以忽略?br />从实现原理分析,几种实现下唯一的区别在于函数获取的部分。如前文所qͼ所有的函数都放在一个hash表中Q?br />在不同个C查找效率都应该还是接q于O(1)Q所以性能差距不大?</li></ul> <h5><a name="不同cd函数调用消?></a>不同cd函数调用消?/h5> <ul><li>试Ҏ<br />选取用户函数、类Ҏ、静态方法、内|函数各一U,函数本n不做M事情Q直接返回,主要试I函数调用的消耗?br />试l果为每U可执行ơ数<br />试中ؓ去除其他影响Q所有函数名字长度相?</li></ul> <ul><li>试l果如下?</li></ul> <p>        <img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_12827925831nF1.jpg" width="559" height="316" /> <ul><li>l果分析<br />通过试l果可以看到Q对于用戯q写的php函数Q不是哪种cdQ其效率是差不多的,均在280w/s左右。如我们预期Q即使是IQ?br />内置函数其效率也要高很多Q达?80w/sQ是前者是3倍。可见,内置函数调用的开销q是q低于用户函数?br />从前面原理分析可知主要差距在于用户函数调用时初始化符可、接收参数等操作?</li></ul> <h5><a name="内置函数和用户函数性能Ҏ"></a>内置函数和用户函数性能Ҏ</h5> <ul><li>试Ҏ<br />内置函数和用户函数的性能ҎQ这里我们选取几个常用的函敎ͼ然后用php实现相同功能的函数进行一下性能Ҏ?br />试中,我们选取字符丌Ӏ数学、数l中各一个典型进行对比,q几个函数分别是字符串截?substr)?0q制?q制(decbin)?br />求最?min)和返回数l中的所以key(array_keys)?</li></ul> <ul><li>试l果如下?</li></ul> <p>        <img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_1282792584o7kN.jpg" width="556" height="328" /> <ul><li>l果分析<br />从测试结果可以看出,如我们预期,内置函数在M性能上远高于普通用户函数。尤其对于涉及到字符串类操作的函敎ͼ<br />差距辑ֈ?个数量。因此,函数使用的一个原则就是如果某功能有相应的内置函数Q尽量用它而不是自q写php函数?br />对于一些涉及到大量字符串操作的功能Qؓ提高性能Q可以考虑用扩展来实现。比如常见的富文本过滤等?</li></ul> <h5><a name="和C函数性能Ҏ"></a>和C函数性能Ҏ</h5> <ul><li>试Ҏ<br />我们选取字符串操作和术q算?U函数进行比对,php用扩展实现。三U函数是单的一ơ算法运、字W串比较和多ơ的法q算?br />除了本n的两cd数外Q还会测试将函数I开销L后的性能Q一斚w比对一下两U函敎ͼc和php内置Q本w的性能差异Q?br />另外是侧面印证I函数的消?br />试点ؓ执行10wơ操作的旉消?</li></ul> <ul><li>试l果如下?</li></ul> <p>        <img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_12827925838AIK.jpg" width="560" height="281" /> <ul><li>l果分析<br />内置函数和C函数的开销在去掉php函数I用的影响后差距较,随着函数功能来复杂,双方性能近于相同?br />q个从之前的函数实现分析中也Ҏ得到Q毕竟内|函数就是C实现的?br />函数功能复杂,c和php的性能差距小<br />相对c来说Qphp函数调用的开销大很多,对于单函数来说性能q是有一定媄响。因此php中函C宜嵌套封装太深?</li></ul> <h4><a name="伪函数及其性能"></a>伪函数及其性能</h4> <h4></h4> <p>在php中,有这样一些函敎ͼ它们在用上是标准的函数用法Q但底层实现却和真正函数调用完全不同Q这些函C属于前文提到的三Ufunction中的M一c,<br />其实质是一条单独的opcodeQ这里估且叫做伪函数或者指令函数? <p>如上所_伪函C用v来和标准的函数ƈ无二_看v来具有相同的特征。但是他们最l执行的时候是被zend反映成了一条对应的指oQopcodeQ来调用Q?br />因此其实现更接近于if、for、算术运等操作? <ul><li>php中的伪函?br />isset<br />empty<br />unset<br />eval </li></ul> <p>通过上面的介l可以看出,伪函数由于被直接译成指令来执行Q和普通函数相比少了一ơ函数调用所带来的开销Q因此性能会更好一些?br />我们通过如下试来做一个对比?Array_key_exists和isset两者都可以判断数组中某个key是否存在Q看一下他们的性能 <p>        <img alt="" src="http://hi.csdn.net/attachment/201008/26/12159_128279258644aj.jpg" width="538" height="268" /> <p>从图上可以看出,和array_key_exists相比Qisset性能要高出很多,基本是前者的4倍左叻I而即使是和空函数调用相比Q?br />其性能也要高出1倍左叟뀂由此也侧面印证再次说明了php函数调用的开销q是比较大的? <h4><a name="常用php函数实现及介l?></a>ȝ及徏?/h4> <h4></h4> <p><strong>通过对函数实现的原理分析和性能试Q我们ȝZ下一些结?/strong> <p>1Q?Php的函数调用开销相对较大? <p>2Q?函数相关信息保存在一个大的hash_table中,每次调用旉过函数名在hash表中查找Q因此函数名长度Ҏ能也有一定媄响? <p>3Q?函数q回引用没有实际意义 <p>4Q?内置php函数性能比用户函数高很多Q尤其对于字W串cL作? <p>5Q?cL法、普通函数、静态方法效率几乎相同,没有太大差异 <p>6Q?除去I函数调用的影响Q内|函数和同样功能的C函数性能基本差不多? <p>7Q?所有的参数传递都是采用引用计数的拷贝,代h很小? <p>8Q?函数个数Ҏ能影响几乎可以忽略 <p><strong>因此Q对于php函数的用,有如下一些徏?/strong> <p>1Q?一个功能可以用内置函数完成Q尽量用它而不是自q写php函数? <p>2Q?如果某个功能Ҏ能要求很高Q可以考虑用扩展来实现? <p>3Q?Php函数调用开销较大Q因此不要过分封装。有些功能,如果需要调用的ơ数很多本n又只??行代码就行实现的Q徏议就不要装调用了? <p>4Q?不要q分qh各种设计模式Q如上一条描qͼq分的封装会带来性能的下降。需要考虑两者的权衡。Php有自q特点Q?br />切不可东施效颦,q分效仿java的模式? <p>5Q?函数不宜嵌套q深Q递归使用要}慎? <p>6Q?伪函数性能很高Q同{功能实C优先考虑。比如用isset代替array_key_exists <p>7Q?函数q回引用没有太大意义Q也起不到实际作用,不予考虑? <p>8Q?cL员方法效率不比普通函CQ因此不用担心性能损耗。徏议多考虑静态方法,可读性及安全性都更好? <p>9Q?如不是特D需要,参数传递都使用传D不是传引用。当Ӟ如果参数是很大的数组且需要修Ҏ可以考虑引用传递?/p><img src ="http://www.shnenglu.com/amazon/aggbug/157213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2011-09-30 11:13 <a href="http://www.shnenglu.com/amazon/archive/2011/09/30/157213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.41422.com.cn" target="_blank">91þþƷһëƬ</a>| <a href="http://www.wendalaw.com.cn" target="_blank">ŷҹͽþþ </a>| <a href="http://www.anrf.cn" target="_blank">ɫۺϾþۺ</a>| <a href="http://www.otc-online.com.cn" target="_blank">2021Ʒҹþ</a>| <a href="http://www.5icsw.cn" target="_blank">þþþùһ</a>| <a href="http://www.woai858.cn" target="_blank">þùƷ</a>| <a href="http://www.qtvc.cn" target="_blank">þþۺ㽶ۺ</a>| <a href="http://www.xinhaitugong.cn" target="_blank">ƷþþþĻһ</a>| <a href="http://www.baodecai.cn" target="_blank">Ʒһþ</a>| <a href="http://www.dachanzui.cn" target="_blank">AAAþþþƷ</a>| <a href="http://www.fengdingjun.cn" target="_blank">ŷþۺŷ</a>| <a href="http://www.vltr.cn" target="_blank">97Ʒ97þþþþ</a>| <a href="http://www.jxlbw.cn" target="_blank">þù鶹91</a>| <a href="http://www.gcjszzbjb.cn" target="_blank">þþĻ</a>| <a href="http://www.dgchengxin.cn" target="_blank">ȾþùƷ</a>| <a href="http://www.mengdie.net.cn" target="_blank">þùֱ</a>| <a href="http://www.jxfic.org.cn" target="_blank">޹˾ƷŮ˾þþ</a>| <a href="http://www.cqbus.com.cn" target="_blank">޾Ʒһۺ99þ</a>| <a href="http://www.awkmqq.cn" target="_blank">97þùۺϾƷŮ</a>| <a href="http://www.hotfan.cn" target="_blank">þþþø߳ëƬȫ</a>| <a href="http://www.yinyue580.cn" target="_blank">ҹþþþþþþõӰ </a>| <a href="http://www.amqinhang.cn" target="_blank">ŷƷһþ˵</a>| <a href="http://www.swfun.com.cn" target="_blank">þþƷư</a>| <a href="http://www.perou.cn" target="_blank">þ99Ʒ99þ6</a>| <a href="http://www.988o.cn" target="_blank">¾þƵ</a>| <a href="http://www.six-dream.cn" target="_blank">޹ŷۺ997þ</a>| <a href="http://www.hnxxzw.cn" target="_blank">þ99ƷۺϹҳ</a>| <a href="http://www.grzzc358.cn" target="_blank">ƷþþĻ</a>| <a href="http://www.shellbitumen.com.cn" target="_blank">ާѡþþþƷ</a>| <a href="http://www.brill-sh.com.cn" target="_blank">vaþþþúݺ</a>| <a href="http://www.zqbd.com.cn" target="_blank">þ޾ƷĻ</a>| <a href="http://www.51083114.cn" target="_blank">þþþ99ƷƬëƬ </a>| <a href="http://www.ajchugui.cn" target="_blank">97þþƷˬ</a>| <a href="http://www.chenxipeng.cn" target="_blank">պþþþĻ </a>| <a href="http://www.szjjls.cn" target="_blank">˾þþAV츾ɫ</a>| <a href="http://www.cdmt.org.cn" target="_blank">޹Ʒþþþ</a>| <a href="http://www.yw33777.cn" target="_blank">ձþĻ</a>| <a href="http://www.hnxxzw.cn" target="_blank">þѸƵ</a>| <a href="http://www.antsgogo.cn" target="_blank">һһþۺϺݺ</a>| <a href="http://www.kmaxbm.cn" target="_blank">þþƷһպ </a>| <a href="http://www.yy1122.cn" target="_blank">ۺɫ77777þ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>