啊,作者的真实意愿是如果字符串的长度大于0 就转义 $host , 但是却意外地做了相反的事情。很容易犯的错误是吧?也许吧。在代码审计过程中很容易错过?当然。简洁并不一定能使代码变得很好。
7. Memcached
内存是很快的。使用本地缓存可以避免网络和磁盘访问的开销。结合这些道理,然后,你想到了memcached,一个“分布式内存对象缓存系统”,最初为基于Perl的博客平台LiveJournal开发的。
如果你的程序不是分布在多个服务器上,你可能并不需要memcached。单的缓存方法——序列化数据然后将它保存在一个临时文件中。例如 – 对每个请求可以消除很多多余的工作。事实上,这是我们考虑帮助我们的客户优化他们的应用程序时,低挂水果的类型。
A fruit-bearing tree often contains some branches low enough for animals and humans to reach without much effort. The fruit contained on these lower branches may be not be as ripe or attractive as the fruit on higher limbs, but it is usually more abundant and easier to harvest. From this we get the popular expression “low hanging fruit”, which generally means selecting the easiest targets with the least amount of effort.
一种最简易且最通用的将数据缓存在内存的方式是使用APC中的共享类型辅助方法,APC是一个最初由我们的同事George Schlossnagle开发的缓存系统,考虑如下例子:
$feed = apc_fetch('news');
if ($feed === FALSE) {
$feed = file_get_contents('http://example.org/news.xml');
// Store this data in shared memory for five minutes.
apc_store('news', $feed, 300);
}
// Do something with $feed.
?>
使用这种类型的缓存,你不必在每一次请求时等待远程服务器发送Feed数据。一些延迟产生了 – 在这个例子中上限是五分钟,但可以根据您的应用程序需要调整到接近实时。
8. 使用框架
所有决定都会有结果的,我们喜欢框架——事实上,CakePHP 和 Solar 的主要开发者和我们一起在 OmniTI 工作—— 但是使用一个框架并不会奇迹般地使你在做的东西变得更好。
在十月份,我们的同事Paul Jones为HP Advent写一了篇文章,叫做The Framework as Franchise ,在文章中他将框架与商业专营权相比较。他引用 Michael Gerber “电子神话再现”(”The E-Myth Revisited”) 一书中的建议:
格柏指出,运行一个成功的企业,企业家需要像他将要卖掉他的企业作为一个特许经营权的原型一样行动。这是企业拥有者可以不亲自参与每一项决策使企业运营的唯一方法。
( Gerber notes that to run a successful business, the entrepreneur needs to act as if he is going to sell his business as a franchise prototype. It is the only way the business owner can make the business operate without him being personally involved in every decision.)
这是一个好的建议。无论你是打算使用框架或者定义你自己的标签和惯例,从未来开发者的角度来看价值是很重要的。
虽然我们很乐意给你一个放之四海而皆准的真理,延伸这个想法来表明一个框架总是合适的,并不是我们想做的事情。
如果你问我们是否应该使用一个框架,我们可以给出的最好的答案是,“这要看情况。”
9. 正确的使用错误抑制操作符
总是试着避免使用错误抑制操作符号。在前面的文章,作者表明:
@ 操作符是相当的慢的并且如果你需要写高性能的代码的话它会使得开销很大。
错误抑制慢是因为在执行抑制语句前,PHP动态的改变error_reporting等级到0 ,然后然后立即将其还原。这是要开销的。
更糟糕的是,使用错误抑制符使追踪问题的根本原因很困难。
先前的文章使用如下例子来支持通过引用来给一个变量赋值的做法。。。(这句怎么翻译?我晕~~~ )
The previous article uses the following example to support the practice of assigning a variable by reference when it is unknown if $albus is set:
复制代码 代码如下:
$albert =& $albus;
?>
尽管这样是工作的——对于现在——依靠奇怪的,未定义的行为,而对于为什么这样会工作有一个很好的理解是一个产生BUG的好方法。
因为 $albert 是引用了$albus的,后期对于$albus的修改将会同样影响到$albert .
一个更好的解决方案是使用isset(),加上大括号:
复制代码 代码如下:
if (!isset($albus)) {
$albert = NULL;
}
?>
给$albert 赋值NULL和给它赋一个不存在的引用的效果是相同的,但是更加明确了,大大提高了代码的清晰度和避免的两个变量之间的引用关系。
If you inherit code that uses the error suppression operator excessively, we've got a bonus tip for you. There is a new PECL extension called Scream that disables error suppression.
10. 使用 isset() 而不是 strlen()
这实际上是一个巧妙的方法,虽然前面的文章完全没有解释这个。下面是补充的例子:
复制代码 代码如下:
if (isset($username[5])) {
// The username is at least six characters long.
}
?>
当你把字符串当作一个数组时(荒野无灯:事实上,在C语言里面,字符中通常以数组形式存在),字符串里的每一个字符都是数组的一个元素。通过检测一个特定元素的存在与否,你可以检测这个字符串是否至少有那么多的字符存在。(注意第一个字符是元素0,因此 $username[5] 是 $username中的第6个字符。)
这样使用isset 比strlen稍快的原因是复杂的。简单的解释是,strlen() 是一个函数,而 isset() 是一个语法结构。通常来说,
调用一个函数是比使用语言结构的代价更为昂贵的。
我们立足于合肥面向安徽乃至全国全球市场,我们拥有一支经验丰富、创意独到、团结协作的专业技术团队。我们立志把最好的技术通过最有效、最简单的方式提供给客户,为客户提供最佳的解决方案,我们将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,帮助客户在新经济时代下,把握商机和发展空间,并获得绝对的竞争力!我们专注于高端网站定制、系统开发、商城开发、外贸网站建设、公众号开发、小程序开发、网站优化推广、安全运维等技术领域。是高端定制网站领域著名服务商!
扫描二维码与小二CMS创始人沟通
7*24小时为您服务
小二CMS专注于高端网站定制、系统开发、商城开发、外贸网站建设、公众号开发、小程序开发、网站优化推广、安全运维等技术领域。是高端定制网站领域著名服务商!
本文标题:
10条PHP高级技巧
免责声明:文章《10条PHP高级技巧》来至网络,文章表达观点不代表本站观点,文章版权属于原作者所有,若有侵权,请联系本站站长处理!